我有一个在不同环境(dev,qa,prod)中运行的spring-boot应用程序。为了生成可以在所有环境中运行而不进行任何修改的不可变构建,我将特定于环境的配置文件打包到生成的jar本身中。但这也产生了另一个将生产数据库凭证暴露给开发团队的问题。我可以使用外部配置服务器,但现在这对我来说太过分了。
如何管理这些配置文件以避免此信息泄漏并使用不可变构建来支持CI / CD?
答案 0 :(得分:1)
对于数据泄露,建议使用jasypt加密用户名/密码。
application connect to database
https://github.com/ulisesbocchio/jasypt-spring-boot
解密的密码必须在机器上,所以应该已经存在,尽可能地保护(例如,不同的用户,或https://github.com/certnanny/KeyNanny)
但是,我不会将配置放在jar文件中。它不是应用逻辑的一部分,它是部署过程的一部分,部署者应该能够轻松添加新机器。如果你使用docker,当然它会有所不同。答案 1 :(得分:1)
将凭据保存在应用程序中似乎是不安全的做法。您可以在外部保存凭据(外部服务器可以保存机密,也可以在不同应用程序或env变量内的同一服务器上)。通过env varables读取数据将保持您的构建完整。
如果您正在使用像aws或pivotal这样的任何云服务,那么他们会提供此类服务来存储您的秘密。
答案 2 :(得分:0)
我的大多数应用程序配置文件(例如application.yml)都是这样的:
datasource:
username: {database_username:root}
password: {database_password:root123}
sql-script-encoding: utf-8
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://{database_host:localhost}:3306/dbname?useUnicode=true&characterEncoding=utf-8
如果存在环境变量,则应用程序将从环境加载配置。否则将使用默认值。
在此之后,您可以构建单个程序包并在任何地方运行。
就我而言,我将应用程序构建为docker镜像,并在kubernetes中运行,因此配置属性将存储在ConfigMaps和Secret中。
当Pod运行时,会将configmaps和secret加载到环境变量。
当然,您也可以使用其他工具。
答案 3 :(得分:0)
您可以为不同的配置文件创建yml文件,并在JVM参数中指定配置文件。
application.yml
application-name.yml
java -jar -Dspring.profiles.active=name
或.conf
文件:JAVA_OPTS=-Dspring.profiles.active=name
java -jar -Dspring.datasource.username=name -Dspring.datasource.password=pass