当前位置: 首页 > 知识库问答 >
问题:

在HashiCorp Vault中安全存储Spring Boot应用程序的机密?

闻昊英
2023-03-14

我已经阅读了以下教程:Vault配置

好的,我们安装了Vault服务器并放了2对秘密属性:

$ vault kv put secret/gs-vault-config example.username=demouser example.password=demopassword
$ vault kv put secret/gs-vault-config/cloud example.username=clouduser example.password=cloudpassword

Spring Boot应用程序具有以下属性(bootstrap.properties):

spring.application.name=gs-vault-config
spring.cloud.vault.token=00000000-0000-0000-0000-000000000000
spring.cloud.vault.scheme=http
spring.cloud.vault.kv.enabled=true

所以基于Spring。云金库令牌应用程序能够读取安全属性(名称和密码),但不能读取spring。云金库令牌存储在不安全的位置-引导。存储在代码存储库中的属性。你能解释一下为什么它是安全的吗?

我们发现这是不安全的。如何使其安全?我知道可能有几种解决方案可以使其安全,但对我来说,一个简单的示例就足够了。


共有3个答案

丁翰海
2023-03-14

回答您的问题

你能解释一下为什么它是安全的吗?

这不安全!永远不要在源代码管理中公开秘密。

我们发现这是不安全的。如何使其安全?

提高安全性的一些方法:

  • 使用环境变量而不是属性文件
  • 仅限工作负载服务器在网络级别访问Vault服务器。这保证了网络之外的任何人都不能交换令牌
  • 每次使用令牌时,Vault都会生成真实但临时的凭据。尽可能将真实凭据的范围缩小为只读
  • 定期旋转令牌

关于Spring细节

引导属性应仅包含非关键属性。对于关键属性,可以使用环境变量将其传递给应用程序

spring.cloud.vault.token = ${SPRING_CLOUD_VAULT_TOKEN}

总结

问题仍然是“谁保管钥匙?”。但Vault令牌实际上是为了保护真正的敏感数据。如果vault令牌泄漏,您可以仅使该令牌无效。

改善应用程序可以访问vault服务器的限制并减少真实凭据的范围是确保只有运行应用程序的服务器才能使用真实凭据交换令牌,并且真实凭据具有尽可能低的权限的其他方法。

戚英逸
2023-03-14

在签入VCS(例如Git)的application.properties中存储spring.cloud.vault.token可能会危及存储在Vault中的所有机密。

解决方案是不在应用程序中存储Vault令牌。属性作为纯文本。有几种选择。

只需从application.properties中删除spring.cloud.vault.token,并通过系统属性-Dspring.cloud.vault.token=00000000-0000-0000-0000-000000000000(启动应用程序时)或环境变量SPRING_CLOUD_VAULT_TOKEN提供它。如果您使用容器(Docker或库伯内特斯),环境变量特别方便。

如果加密,您可以将spring.cloud.vault.token属性保留在application.properties中。

Spring Cloud Config支持使用以{cipher}开头的值解密属性:

spring.cloud.vault.token={cipher}encrypted_vault_token

要使用属性加密和解密,您需要以下依赖项(例如Gradle):

implementation 'org.springframework.cloud:spring-cloud-context:2.2.2.RELEASE'
implementation 'org.bouncycastle:bcprov-jdk15on:1.64'

加密属性的最简单方法是使用对称加密。

想出一个对称密钥(例如s3cr3t)。

要加密Vault令牌,可以将Spring Boot CLI与Spring Boot Cloud CLI配合使用:

curl "https://repo.spring.io/release/org/springframework/boot/spring-boot-cli/2.2.2.RELEASE/spring-boot-cli-2.2.2.RELEASE-bin.tar.gz" -o spring-boot-cli-bin.tar.gz
tar -xf spring-boot-cli-bin.tar.gz
cd spring-2.2.2.RELEASE
bin/spring install org.springframework.cloud:spring-cloud-cli:2.2.1.RELEASE

bin/spring encrypt 00000000-0000-0000-0000-000000000000 --key s3cr3t
# 507cd1614682535ab8237b448ca73dc74058d3ae9145d63a7381ee67f3046eb1598da6960abdbf2dbf22c47206db5222e45fc74fd6122bc707b61c62f5051e0f

bin/spring decrypt 507cd1614682535ab8237b448ca73dc74058d3ae9145d63a7381ee67f3046eb1598da6960abdbf2dbf22c47206db5222e45fc74fd6122bc707b61c62f5051e0f --key s3cr3t
# 00000000-0000-0000-0000-000000000000

在环境变量中向应用程序传递对称密钥。

不得将对称加密密钥签入VCS。

考虑使用公钥和私钥对的非对称加密作为对称加密的更安全的替代方案。

您需要生成密钥库而不是对称加密密钥(使用JDK或openssl附带的keytools实用程序)。

bootstrap.properties中指定以下属性:

  • encrypt.keyStore.location
  • encrypt.keyStore.password
  • encrypt.keyStore.alias
  • encrypt.keyStore.type

密钥库必须安装在加密中指定的位置。密钥库。位置,从未签入VCS。

此外,解锁密钥库的密码可以更好地传递环境变量

了解Spring Cloud Config中的密钥管理。

江阳冰
2023-03-14

你能解释一下为什么它是安全的吗?

答案是它不安全...如果你这样做。例如,Spring Vault参考手册说:

“请仔细考虑您的安全要求。如果您想快速开始使用Vault,静态令牌身份验证是可以的,但静态令牌不会受到任何进一步的保护。任何向意外方披露的信息都允许Vault使用关联的令牌角色。”

您应该保护您的静态令牌,或者只授予它们访问保管库中您很高兴广为人知的“秘密”的权限。

或者,让您的应用程序使用经过身份验证的方法来生成短期动态令牌。

据我所知,最初的问题是不好的存储密码在Github上的application.properties文件

在Github上的application.properties文件中存储静态Vault令牌同样糟糕。

有什么区别?

几乎没有差别。这是使用Vault的错误方式。

1-有一个小优势,如果您发现令牌意外泄露,您可以使其无效。但这并不意味着故意发布它是明智的。

那么,如何安全地做事呢?

首先,您必须保护将要使用机密的机器。即使您不打算将实际机密存储在磁盘上,您也需要在每台计算机上(安全地)存储不同的机密,以便它们能够在保存真正机密的地方进行身份验证。

这是一个使用Chef的示例

>

将计算机引导为节点时,将为该计算机生成一个密钥对,并向Chef服务器注册。钥匙对也固定在机器上,必须牢牢固定。

然后使用Chef客户端运行安装和配置服务器的配方。

请注意,这取决于是否有一个安全的系统来运行Chef服务器。它还依赖于每个节点是否足够安全,以保护它们自己的密钥。

还有其他方法可以做到这一点,但是如果你不能充分保护你的主机,什么都不会起作用。

 类似资料:
  • 在我的应用程序中,我需要传递client_id和client_secret来进行API调用。 在Android应用程序上存储客户端id和客户端机密最安全的方法是什么? 我已经读到了共享引用,我确信它们不安全。也可以阅读Keystore,但不确定这是否是正确的方法。您能建议一下存储此类信息的最安全方式吗? 谢谢R

  • 我正在按照本指南将MySql添加到一个已经存在的SpringBoot项目中,该项目的依赖关系管理是在Graddle上。就在我添加教程中使用的这三个类时,如下所示 main/java/net/code/model/users.java 我的类使用@SpringBoot main/java/net/code/app.java 但每当我运行该应用程序时,我总是收到下面的消息 我搜索了一些相关问题,比如S

  • 我们计划使用Phonegap开发一个移动银行应用程序。是否存在任何安全问题,因为我们使用的是Phonegap而不是原生SDK?

  • 我熟悉Web存储API和cookies,但是我不知道存储身份验证令牌最安全的方式是什么。我想知道这是否会破坏任何第三方库。 我想要一份详尽的可用方法列表,列出每种方法的优缺点,最重要的是最好的方法(如果有的话)。

  • 攻击者无时无刻不在准备对你的 Web 应用程序进行攻击,因此提高你的 Web 应用程序的安全性是非常有必要的。幸运的是,来自The Open Web Application Security Project (OWASP) 的有心人已经整理了一份包含了已知安全问题和防御方式的全面的清单。这份清单对于具有安全意识的开发者来说是必读的。由 Padraic Brady 整理的 Survive The D