2

我已阅读以下教程: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.cloud.vault.token应用程序能够读取安全属性(名称和密码)但spring.cloud.vault.token存储在不安全的地方 -bootstrap.properties存储在代码存储库中。你能解释一下为什么它是安全的吗?

附言

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

4

3 回答 3

3

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

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

“仔细考虑您的安全要求。如果您想快速开始使用 Vault,则静态令牌身份验证很好,但静态令牌不会受到任何进一步的保护。任何对非预期方的披露都允许 Vault 与关联的令牌角色一起使用。”

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

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


据我了解最初的问题,将密码存储在 Github 上的 application.properties 文件中是不好的。

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

有什么区别 ?

几乎没有区别1。这简直是​​使用 Vault 的错误方法。


1 - 如果您发现它意外泄漏,您可以使令牌失效。但这并不意味着故意发布它是明智的。


那么如何安全地做事呢?

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

这是使用 Chef 的示例。

  1. 设置一个安全的 Chef 服务器来保存您机器的配置;即所有需要安装的东西的配方,节点描述来说明要应用的配方等。

  2. 当您将机器作为节点引导时,会为机器生成一个密钥对并在 Chef 服务器中注册。密钥对也保存在机器上,并且必须牢固地保存。

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

请注意,这依赖于具有适当保护的系统来运行 Chef 服务器。它还依赖于每个节点都足够安全以保护自己的密钥。

还有其他方法可以做到这一点,但如果您不能充分保护您的主机,则将无济于事。

于 2020-03-17T14:42:16.767 回答
1

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

解决方案不是将 Vault 令牌存储application.properties为纯文本。有几种选择。

从中删除 Vault 令牌application.properties

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

将加密的 Vault 令牌存储在application.properties

如果财产是加密的,您可以保留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 CLISpring 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

将对称密钥传递给ENCRYPT_KEY环境变量中的应用程序。

绝对不能将对称加密密钥签入 VCS。

非对称加密

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

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

bootstrap.properties指定以下属性:

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

密钥库必须安装在 中指定的位置,encrypt.keyStore.location并且从不签入 VCS。

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

阅读Spring Cloud Config 中的密钥管理

于 2020-03-21T13:26:42.760 回答
0

回答您的问题

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

这不安全!永远不要在源代码控制中放一个简单的秘密。

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

提高安全性的一些方法:

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

关于春天的细节

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

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

概括

问题仍然是“谁看守钥匙?” . 但 Vault 令牌实际上用于保护真正的敏感数据。如果保管库令牌泄露,您可以只使令牌无效。

改进应用程序可以访问保险库服务器的限制并减少真实凭证的范围是确保只有运行应用程序的服务器才能通过真实凭证交换令牌并且真实凭证具有尽可能低的权限的额外方法.

于 2020-03-25T10:40:24.707 回答