繁体   English   中英

Spring Data从文件库或其他受保护的源读取MongoDB密码

Spring Data read MongoDB password from a vault or other protected source

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

目前,我的spring-boot应用程序无需凭据即可连接到本地MongoDB。 为了能够在客户那里安装它,我需要提供使用用户名和密码进行数据库连接的功能。 我正在使用application.properties文件,该文件当前仅包含与数据库相关的以下3行:

spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017
spring.data.mongodb.database=myApp

还有另外两个:

spring.data.mongodb.username
spring.data.mongodb.password

但是,当然,我不想在此文件中使用纯文本格式的密码,甚至不希望在我们的git中使用该密码。 一种选择是为它们提供一个启动脚本作为参数,但是在过程细节中,它将再次作为纯文本读取。

我已经看到使用Jasypt在属性文件中进行了一些加密,但是我不了解这种方法在我的情况下如何工作。 我从来没有明确地使用这些属性,因为它们会被spring自动进行连接。

什么是最安全的方法?

2 个回复

TL; 博士

这取决于您的安全性/风险配置文件,哪种方法可以接受。

阅读时间更长

您的问题是:最安全的方法是什么?

这个问题的简单答案不是将密码存储在任何地方,而是让操作员输入密码。显然,这不是您想要的答案,因为对于数据中心中的服务器甚至是云中的VM,这种方法都不可行。

要了解哪种方法足够安全,哪种方法可以接受,重要的是要了解您的组织环境,接受风险的意愿以及由此产生的后果,这是处理机密的必要条件。 评估可以得出结论,对于一个组织而言,可以很好地将凭据存储为纯文本格式(因为环境受到保护或与暴露的机密相关的威胁很小),而其他组织则需要使用适当的密钥管理和审核进行加密。

您已经在描述将凭证存储在Git中是不合适的选择。 因此,我假设您正在寻找一种以某种方式保护实际机密的方法。 保护可以在不同级别上进行:

  • 应用访问控制将机密存储在受保护的地方
    • 主机上受访问保护的环境变量
    • 受权限保护的访问控制文件
  • 以加密形式存储机密
    • 加密值并将其存储在文件中。 在这里,您需要考虑谁有权访问此文件以及密钥管理。 介绍了一些鸡肉和鸡蛋的问题
    • 加密该值并将其存储在内存中。 尽管如此,您仍需要解决密钥管理问题。
  • 从可信来源检索机密
    • 凭证由操作人员输入(不太可行)
    • 要求服务为您提供证书。 远程服务可以保护机密,并允许您/您的应用程序询问机密。

潜在的可能性更多,但现在让我们继续使用。 与上述可能性相关联的一方面是凭证从源到目标目的地的传输。 传输通常跨越一个到多个参与方,并且这些参与方中的每一个都需要以某种方式得到信任(即,您必须确保某个参与方不会泄露您的凭据)。 这种模式也称为信任链。 如果信任链中的每一跳都是已知的,则不公开您的凭据,那么您可以对此上下文采取特定的保护模式。 如果您发现一个弱链接会增加暴露的风险(例如,公用文件夹,操作员查找),则您再次需要根据需要增加保护级别。

综上所述,让我们看一下使用Spring Boot应用秘密保护的可能性:

环境变量

您可以使用环境变量或系统属性来存储配置。 波动性方面与持久性(例如,基于文件的)存储区分开来。 可以在应用程序启动之前/启动时设置变量。

环境变量示例:

export SPRING_DATA_MONGODB_USERNAME=…
export SPRING_DATA_MONGODB_PASSWORD=…

java -jar my-app.jar

系统属性示例:

java -jar my-app.jar -Dspring.data.mongodb.username=… -Dspring.data.mongodb.password=…
java -jar my-app.jar --spring.data.mongodb.username=… --spring.data.mongodb.password=…

请注意, /proc文件系统和ps工具可以对环境变量/命令行进行自检

有关更多详细信息,请参见有关外部化配置的参考文档。

加密的配置属性

Spring Cloud附带对单个属性的加密支持。 您可以使用不同的密钥和密钥类型(对称,非对称)来加密选定的属性。 这种方法使您可以选择应加密的属性,而无需加密整个文件。

环境变量示例:

application.properties

spring.data.mongodb.password={cipher}FKSAJDFGYOS8F7GLHAKERGFHLSAJ

请注意,此方法引入了属性密钥管理的要求。

有关更多详细信息,请参阅有关Spring Cloud Config加密和解密的参考文档。

应用程序控制的机密

Spring Boot中的配置属性是从Environment获取的,并由PropertySource提供。 在启动Spring Boot之前,您可以提供属性或整个PropertySource

添加PropertySource示例:

SpringApplication app = new SpringApplication(DemoApplication.class);
app.addInitializers(new ApplicationContextInitializer<ConfigurableApplicationContext>() {
    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) {
        applicationContext.getEnvironment().getPropertySources().addFirst(…);
    }
});

app.run(args);

添加属性的示例:

SpringApplication app = new SpringApplication(DemoApplication.class);
app.setDefaultProperties(Collections.singletonMap("spring.data.mongodb.password", "…"));

app.run(args);

远程配置属性

Spring Cloud Config允许您集中化由Spring Cloud Config Server服务的配置。 属性不再存储在本地,而是通过配置服务提供,该配置服务的安全性可以不同于应用程序保护级别。 要设置Spring Cloud Config Server,您需要额外的服务并将客户端依赖项集成到您的应用程序中。

请注意,这种方法并不能解决整体问题,而只是将其移交给其他人负责。

有关更多详细信息,请参见Spring Cloud Config Server上的参考文档。

使用机密管理

如果您可以负担诸如HashiCorp Vault,CredHub,Azure KeyVault,Kubernetes Secrets之类的Secrets Management,则可以利用平台/秘密管理系统的功能对凭据进行保护。

机密管理系统通常为您处理加密,审核和访问控制。 这些系统保留凭证的加密副本。 一旦您请求了凭证(通常通过TLS安全连接),系统就会检查您/您的应用程序是否被允许访问该机密。

其中一些系统还提供动态机密。 根据需要为特定的应用程序实例生成动态机密。 如果您的应用程序要连接到MongoDB,则秘密管理系统将创建一个凭据对并将其存储到您的应用程序中。 当您的应用程序停止时,秘密管理系统将撤消凭据。

有关更多详细信息,请参见Spring Cloud Vault上的参考文档。

@ mp911de的答案的一个附录:

Spring Boot中还有第二个文件选项:您可以通过向文件提供ENV变量SPRING_CONFIG_ADDITIONAL_LOCATION或将其添加为命令属性(例如spring.config.additional-location来提供一个覆盖标准配置的附加文件。请参阅应用程序属性文件

这可能使您有机会通过某些文件秘密部署(例如,用作volumeMount的Kubernetes秘密,基于Puppet / Chef / Ansible的秘密部署等)来添加凭据。

1 读取受密码保护的.csv文件

我正在尝试读取/打开使用PHP进行密码保护的.csv文件。 我显然有密码,并且在手动打开时确实有内容。 我尝试了此代码,它确实提取了文件,但是文件仍然为空。 我认为密码在.csv文件上,而不在.zip文件上,但是我不太确定。 谢谢 ...

2 读取受密码保护的CSV文件

我想要PHP程序读取csv文件。 通过获取URL并将适当的变量传递到该URL,我完成了简单的CSV文件读取操作。 但是在我的项目中需要打开CSV文件登录。 我该如何使用PHP程序。 我想通过程序登录并读取该csv文件。 稍后,我将在zend代码中实现它。 这是一些代码: ...

2013-08-21 14:29:56 0 429   php/ csv
3 如何读取受密码保护的文件的内容?

我正在尝试从受密码保护的PEM文件中读取数据,以从这些数据生成公钥和私钥。 我有密码,打开文件时需要输入密码。 但是我在Java中没有任何选择可以做到这一点。 在这方面需要紧急援助。 如果能得到一个代码示例,那就更好了。 编辑: 我当前的代码是- ...

5 如何在Java中读取受密码保护的.xls文件?

我有一个代码可以读取java受保护的excel,但是该代码给我错误。 我的Java代码。 此代码给我以下错误。 我正在使用poi3.9 jar,xmlbeans-2.3.0jar,poi-ooml-3.6 我没有收到这个问题。谢谢。 或请分享另一种读取.xl ...

6 我们如何使用POI API读取受保护的密码excel文件(.xls)

我刚刚学习了POI并发现HSSF非常易于阅读和创建excel文件(.xls)。 但是,当我想用​​密码读取excel保护时,我发现了一些问题。 我花了一个小时才在互联网上找到这个解决方案。 请你帮我解决这个问题。 如果你能给我一个代码片段,我很高兴。 谢谢。 ...

7 读取Java中受密码保护的ZIP文件

我已压缩并使用密码保护了文件。 现在,我需要使用java检索文件。 因此,我需要解锁密码并使用Java解压缩以与文件建立正确的连接。 我的第一个问题是:Java是否解压缩并解锁本地驱动器上的压缩文件? (那么保护它没有意义吗?)。 我已经阅读了所有有关加密的内容,但实际上是在这 ...

8 从受密码保护的Java代码读取远程文件

我想通过http协议读取位于远程位置的文件,我尝试了基本身份验证,但是它不起作用,当我访问浏览器时,它询问我的用户名密码,当我输入正确的文件时,它将在我的文件中打开文件chrome浏览器。 我用下面的代码 干杯 ...

2013-10-07 09:21:41 0 541   java/ http
10 使用OpenXml读取受密码保护的Excel文件

我有一个受密码保护的Excel文件。 我正在使用OpenXml读取Excel文件。 如下面的代码片段所示,没有用于指定密码的重载/可选参数。 我没有任何条款可以读取受密码保护的文件。 有什么方法可以使用OpenXml在c#中读取受密码保护的Excel文件。 谢谢! ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM