AWS Secrets Manager 的密钥管理 - 自动轮换与应用集成
通过 Lambda 函数自动轮换 RDS/Aurora 密码,使用 SDK 缓存库从应用无缝获取。还介绍与 Parameter Store 的选择。
Secrets Manager 的角色与 Systems Manager Parameter Store 的区别
Secrets Manager 是安全保存和管理数据库密码、API 密钥、OAuth 令牌等机密信息的服务。与类似服务 Systems Manager Parameter Store (SecureString) 的最大区别是自动轮换功能的有无。Secrets Manager 标准提供通过 Lambda 函数自动轮换 RDS、Aurora、Redshift、DocumentDB 密码的机制。Parameter Store 适合配置值和标志的管理,相比每个密钥每月 0.40 USD 的 Secrets Manager,免费额度更大。需要自动轮换的认证信息用 Secrets Manager,其他配置值用 Parameter Store 是常见的选择。
自动轮换的机制
自动轮换是 Lambda 函数定期更新密钥值的机制。RDS 或 Aurora 的情况下,可使用 AWS 提供的轮换用 Lambda 模板。轮换分 4 个步骤执行:createSecret 生成新密码,setSecret 更新数据库密码,testSecret 验证新密码的连接,finishSecret 切换密钥的版本标签。轮换间隔可设置 1 天到 365 天,根据安全策略通常为 30 天或 90 天。为防止轮换期间的停机,推荐采用交替用户策略 (交替使用 2 个数据库用户)。
从应用获取的模式
从应用获取密钥的基本模式是使用 AWS SDK 的 GetSecretValue API。Lambda 函数中,在函数初始化阶段获取密钥并缓存到全局变量,避免每次请求的 API 调用。使用 AWS 提供的缓存库 (Python 的 aws-secretsmanager-caching、Java 的 aws-secretsmanager-jdbc),内置基于 TTL 的缓存和轮换时的自动刷新。ECS 任务中,在任务定义的 secrets 字段指定 Secrets Manager 的 ARN,容器启动时自动注入为环境变量。CloudFormation 模板中使用动态引用 ({{resolve:secretsmanager:MySecret}}),无需在模板中直接写入密钥值即可引用。 关于密码管理的详细解析,也可参考Amazon 的相关书籍。
Secrets Manager 的费用
Secrets Manager 的费用为每个密钥每月约 0.40 美元,每 10,000 次 API 调用约 0.05 美元。自动轮换用 Lambda 函数的执行费用也会产生,但考虑轮换频率 (每 30~90 天) 金额很小。与 Parameter Store 的 SecureString (标准参数免费) 相比成本较高,但考虑自动轮换功能的价值来选择。通过 Lambda 的缓存库减少 API 调用次数,优化成本。
总结
Secrets Manager 是自动化认证信息生命周期管理的服务。通过自动轮换强制密码定期更新,通过 IAM 策略控制访问,通过 KMS 加密,多层降低认证信息泄露风险。消除在代码或仓库中嵌入密码的做法,将安全最佳实践应用于整个组织。