配置管理表面上看只是填写一些键值对,但在真实项目中,配置混乱和安全漏洞往往从这里滋生。这一节从实际可操作的层面,梳理配置组织、环境隔离和敏感信息保护的成熟做法。
22.5.1 配置分层与优先级利用
Spring Boot 提供了多达十余种配置来源,精确定位生效值的关键在于理解优先级。实际项目中建议严格遵循以下分层:
- 默认值:在
application.yml中为所有环境定义合理的默认值。 - 环境特定:通过
application-{profile}.yml覆盖开发、测试、生产各自的差异化配置(如数据库连接、日志级别)。 - 外部化覆盖:生产环境通过环境变量、命令行参数或配置中心(如 Nacos、Consul)注入敏感或动态配置,优先级高于文件。
实用原则:
- 默认配置应保证应用在本地可直接启动(如使用嵌入式 H2 数据库)。
- 环境特定文件只覆盖差异部分,不要全量复制默认配置。
- 生产连接的地址、账号等永远不要出现在
application.yml中,只通过环境变量或配置中心注入。 - 利用
@ConfigurationProperties将同类配置映射为强类型 Bean,避免散落@Value注解。
22.5.2 敏感信息保护策略
数据库密码、API 密钥、证书等敏感信息泄露是企业安全事件的重大源头。防范需要贯穿开发、构建、部署全流程。
1. 禁止敏感信息写入代码或配置文件
最基础的底线:密码和密钥绝不硬编码,也不提交到 Git 仓库。即使私有仓库,也建议视为“已泄露”。常见的污染源包括:
application.yml或application.properties中直接写明文密码。- 测试代码中写死的生产凭证。
- 注释中遗留的示例密码。
2. 使用外部化与加密机制
Spring Boot 支持多种方式将敏感配置与程序分离:
- 环境变量注入:通过
SPRING_DATASOURCE_PASSWORD等标准化环境变量名覆盖配置。 - 命令行参数:
--spring.datasource.password=xxx。 - 配置中心动态下发:Nacos、Spring Cloud Config 等支持配置加密存储和传输。
- 密钥管理服务集成:与云厂商的 Secrets Manager、Vault 集成,运行时动态获取凭据。
3. 配置加密方案推荐
| 方案 | 适用场景 | 优点 | 缺点 |
|------|---------|------|------|
| Jasypt | 单体应用,密文存储在配置文件中 | 接入简单,开箱即用 | 加密密钥仍需安全管理 |
| Spring Cloud Config 加密 | 有配置中心的微服务 | 服务端统一加解密 | 依赖配置中心部署 |
| Vault / 云 Secret Manager | 安全要求严格的生产环境 | 动态凭据,审计,自动轮转 | 运维复杂度增加 |
以 Jasypt 为例,引入依赖后,在配置文件中使用 ENC(密文) 格式,启动时通过环境变量或命令行传入解密密钥即可:
spring:
datasource:
password: ENC(Bx0kPg5ZJ7f+RK...)
启动命令:
java -jar app.jar --jasypt.encryptor.password=your-master-key
4. 日志输出脱敏
敏感信息还可能通过日志泄露。实战中需注意:
- 日志配置中避免打印请求体中的明文密码、token。
- 自定义
Converter或日志Filter对手机号、身份证、银行卡号等字段脱敏。 - 生产环境禁止开启
debug或trace级别,Hibernate SQL 日志避免直接输出敏感参数。
22.5.3 环境隔离与权限控制
不同环境的敏感度差异巨大,必须做到“环境隔离不能相互穿透”:
- 开发/测试环境:使用独立的低权限凭据,数据脱敏或构造。
- 预发布/灰度环境:配置尽量与生产一致但使用独立资源,严格限制访问白名单。
- 生产环境:凭据由运维或安全团队管理,开发人员无法直接获取;配置变更需审批,配置中心开启审计日志。
另外,CI/CD 流水线中也需识别安全边界:
- 构建时扫描代码和配置中的潜在密钥泄露(如 GitLeaks、TruffleHog 工具)。
- 部署时注入凭据由 CD 系统或 K8s Secret 完成,镜像中不包含敏感值。
22.5.4 配置变更与动态刷新
传统修改配置需要重启应用,这在微服务集群中代价很大。Spring Cloud 配置中心或 Nacos 支持 @RefreshScope 动态刷新 Bean。敏感配置变更时需额外注意:
- 密码修改应触发服务实例的连接重建(如数据库连接池重新初始化),否则旧连接依然可用。
- 凭据轮转建议配合利用连接池的心跳检测,确保无缝切换。
总结:配置管理的成熟度直接关系到系统的安全性与运维效率。坚持“默认可用、外部注入、文件不存密、日志不泄敏”的准则,再结合合适的工具链,就能在便利与安全之间找到平衡。这些实践并非一蹴而就,可以从最基础的“把密码移出配置文件”开始逐步完善。