Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在HashiCorp Vault中安全地存储Spring Boot应用程序的秘密?_Java_Spring_Spring Boot_Hashicorp Vault_Spring Cloud Vault Config - Fatal编程技术网

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

Java 在HashiCorp Vault中安全地存储Spring Boot应用程序的秘密?,java,spring,spring-boot,hashicorp-vault,spring-cloud-vault-config,Java,Spring,Spring Boot,Hashicorp Vault,Spring Cloud Vault Config,我已经阅读了以下教程: 好的,我们安装了Vault服务器并放置了两对机密属性: $ 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启动应用程序具

我已经阅读了以下教程:

好的,我们安装了Vault服务器并放置了两对机密属性:

$ 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启动应用程序具有以下属性Bootstrap.properties:

$ 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.cloud.vault.token的应用程序能够读取安全属性name和密码,但是spring.cloud.vault.token存储在不安全的地方-bootstrap.properties,它存储在代码存储库中。你能解释一下为什么它是安全的吗

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

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

答案是它不安全。。。如果你那样做的话。例如,报告说:

仔细考虑您的安全需求。如果您想快速开始使用Vault,静态令牌身份验证是可以的,但是静态令牌不再受保护。向非预期方披露的任何信息都允许Vault与关联的令牌角色一起使用

您应该保护您的静态令牌,或者只允许它们访问您乐于广为人知的金库中的秘密

或者,让您的应用程序使用生成短期动态令牌

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

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

有什么区别

几乎没有什么区别。这是使用Vault的错误方法

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

那么你如何安全地做事呢

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

下面是一个使用Chef的示例

设置一个安全的Chef服务器,用于保存计算机的配置;i、 e.需要安装的所有东西的配方,说明应用哪些配方的节点描述,等等

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

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

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

还有其他方法可以做到这一点,但如果您不能充分保护主机,则任何方法都不起作用

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

答案是它不安全。。。如果你那样做的话。例如,报告说:

仔细考虑您的安全需求。如果您想快速开始使用Vault,静态令牌身份验证是可以的,但是静态令牌不再受保护。向非预期方披露的任何信息都允许Vault与关联的令牌角色一起使用

您应该保护您的静态令牌,或者只允许它们访问您乐于广为人知的金库中的秘密

或者,让您的应用程序使用生成短期动态令牌

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

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

有什么区别

几乎没有什么区别。这是使用Vault的错误方法

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

那么你如何安全地做事呢

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

下面是一个使用Chef的示例

设置一个安全的Chef服务器,用于保存计算机的配置;i、 e.需要安装的所有东西的配方,说明应用哪些配方的节点描述,等等

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

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

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

有其他方法可以做到这一点,但如果您不能充分保护主机,则任何方法都不会起作用。

在应用程序中存储spring.cloud.vault.token。签入VCS的属性(例如Git)可能会泄露存储在vault中的所有机密

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

从application.properties中删除Vault令牌 启动应用程序或环境变量spring\u cloud\u vault\u token时,只需从application.properties中删除spring.cloud.vault.token,而是通过系统属性-dsspring.cloud.vault.token=00000000-0000-0000-0000-000000000000提供它。如果使用容器Docker或Kubernetes,环境变量尤其方便

在application.properties中存储加密的Vault令牌 如果对spring.cloud.vault.token属性进行了加密,则可以将其保留在application.properties中

支持解密以{cipher}开头的值的属性:

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

implementation 'org.springframework.cloud:spring-cloud-context:2.2.2.RELEASE'
implementation 'org.bouncycastle:bcprov-jdk15on:1.64'
对称加密 加密属性的最简单方法是使用对称加密

提出一个对称密钥,例如s3cr3t

要加密Vault令牌,您可以使用:

在ENCRYPT_key环境变量中将对称密钥传递给应用程序

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

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

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

在bootstrap.properties中,指定以下属性:

$ 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
encrypt.keyStore.location encrypt.keyStore.password encrypt.keyStore.alias encrypt.keyStore.type 密钥库必须安装在encrypt.keystore.location中指定的位置,并且从未签入VCS

另外,解锁密钥库的密码可以更好地传入ENCRYPT_keystore_password环境变量

阅读Spring Cloud Config中的相关内容。

在应用程序中存储Spring.Cloud.vault.token。签入VCS的属性(例如Git)可能会泄露存储在vault中的所有机密

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

从application.properties中删除Vault令牌 启动应用程序或环境变量spring\u cloud\u vault\u token时,只需从application.properties中删除spring.cloud.vault.token,而是通过系统属性-dsspring.cloud.vault.token=00000000-0000-0000-0000-000000000000提供它。如果使用容器Docker或Kubernetes,环境变量尤其方便

在application.properties中存储加密的Vault令牌 如果对spring.cloud.vault.token属性进行了加密,则可以将其保留在application.properties中

支持解密以{cipher}开头的值的属性:

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

implementation 'org.springframework.cloud:spring-cloud-context:2.2.2.RELEASE'
implementation 'org.bouncycastle:bcprov-jdk15on:1.64'
对称加密 加密属性的最简单方法是使用对称加密

提出一个对称密钥,例如s3cr3t

要加密Vault令牌,您可以使用:

在ENCRYPT_key环境变量中将对称密钥传递给应用程序

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

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

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

在bootstrap.properties中,指定以下属性:

$ 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
encrypt.keyStore.location encrypt.keyStore.password encrypt.keyStore.alias encrypt.keyStore.type 密钥库必须安装在encrypt.keystore.location中指定的位置,并且从未签入VCS

另外,解锁密钥库的密码可以更好地传入ENCRYPT_keystore_password环境变量

阅读Spring云配置中的相关内容。

回答您的问题

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

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

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

提高安全性的一些方法:

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

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

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

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

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

回答你的问题

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

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

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

提高安全性的一些方法:

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

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

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

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


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

为什么您的令牌存储在不安全的地方?@f1sh据我所知,Vault是一个安全的地方,但github存储库不是一个安全的地方。要使用从应用程序安全保管库连接,我需要知道令牌,该令牌存储在github中。为什么您的令牌存储在不安全的地方?@f1sh据我所知,保管库是一个安全的地方,但github存储库不是一个安全的地方。要使用从应用程序安全保险库连接,我需要知道令牌,该令牌存储在githubSo Vault中。与spring cloud confing+spring cloud bus相比,Vault+静态令牌没有其他意义?因此,它只是一个分布式的集中属性源。它正确吗?如何安全地存储机密?没有办法避免某些机密—私钥、密码、静态令牌、物理设备、指纹或视网膜扫描等—必须保持安全。Vault和类似工具的优点是,您可以更好/更安全地存储机密,并且可以更好地控制谁/什么人可以访问这些机密。您能否解释一下为什么使用Vault可以使机密存储更安全?据我所知,最初的问题是在guthub的application.properties中存储密码不好。确定-我们将Vault令牌存储在guthub中,并将属性移动到Vault中,而不是将属性存储在guthub中。如果黑客知道令牌,他可以很容易地读取金库中的所有属性。区别是什么?请你澄清一下你的说法,你应该保护你的静态令牌,或者只允许他们访问你乐于广为人知的金库中的秘密。无论如何,我不明白我必须将金库令牌存储在哪里?是否有实现这一目标的最佳实践?我必须手动为每个环境保密吗?所以Vault+静态令牌与spring cloud confing+spring cloud bus相比没有其他意义?因此,它只是一个分布式的集中属性源。它正确吗?如何安全地存储机密?没有办法避免某些机密—私钥、密码、静态令牌、物理设备、指纹或视网膜扫描等—必须保持安全。Vault和类似工具的优点是,您可以更好/更安全地存储机密,并且可以更好地控制谁/什么人可以访问这些机密。您能否解释一下为什么使用Vault可以使机密存储更安全?据我所知,最初的问题是在guthub的application.properties中存储密码不好。确定-我们将Vault令牌存储在guthub中,并将属性移动到Vault中,而不是将属性存储在guthub中。如果黑客知道令牌,他可以很容易地读取金库中的所有属性。
区别是什么?请你澄清一下你的说法,你应该保护你的静态令牌,或者只允许他们访问你乐于广为人知的金库中的秘密。无论如何,我不明白我必须将金库令牌存储在哪里?是否有实现这一目标的最佳实践?我必须手动为每个环境设置密码吗?但是在所有的方法中,都有一个密码、密钥或必须安全存储的东西。你无法回避这个问题。最简单的解决办法是不要将主密码存储在你的头脑中。或者将其存储在安全的地方,如AWS Secrets Manager,但手动提供。该解决方案不适合生产。如果无法在系统重新启动时输入密码,则此选项无效。如果你被一辆绿色巴士撞了,那就不起作用了。这一切都取决于部署的方式。任务是将主密码作为环境变量传递。在Kubernetes上,您可以使用主密码手动创建密码,并将其绑定到环境变量。此解决方案适用于重新启动。在AWS Secrets Manager中存储主密码可以解决被总线击中时的问题。但在所有方法中,都必须安全地存储密码、密钥或其他东西。你无法回避这个问题。最简单的解决办法是不要将主密码存储在你的头脑中。或者将其存储在安全的地方,如AWS Secrets Manager,但手动提供。该解决方案不适合生产。如果无法在系统重新启动时输入密码,则此选项无效。如果你被一辆绿色巴士撞了,那就不起作用了。这一切都取决于部署的方式。任务是将主密码作为环境变量传递。在Kubernetes上,您可以使用主密码手动创建密码,并将其绑定到环境变量。此解决方案适用于重新启动。在AWS Secrets Manager中存储主密码可以解决被总线击中时的问题。