AWS在云原生架构中将凭据提升为一个具有完整生命周期的可信对象,它需要版本管理、定期轮转、权限审计和故障恢复策略。
一、Secrets Manager 凭据的静态与动态形态
Secrets Manager 用于管理客观存在、需要被系统记住的凭据,例如数据库密码、第三方 API Token 等。
但需要强调的是,Secrets Manager 中的凭据并不都是“静态不变的”,而是分为两种形态:
静态凭据(Static Secret)
- 凭据值本身不会自动变化
- 仅通过授权控制“谁可以读取”
- 典型如第三方 SaaS API Key、遗留系统密钥

动态凭据(Rotated Secret)
凭据值会被系统周期性更新
通过轮转函数同步修改后端系统(如 RDS)
凭据虽被“存储”,但其值本身是动态演进的

在 Secrets Manager 中创建可轮转的 RDS 凭据时,必须先填写一个用户名和密码,因为 Secrets Manager 并不创建数据库身份,而是接管并管理一个已存在的数据库账号。

在多用户交替轮转模式下,还需要指定一个管理员凭证密钥,用于在轮转过程中创建、修改或切换其他数据库用户;该凭证以独立 Secret 存在,用来明确权限边界,避免被轮转对象与管理权限发生循环依赖。

无论静态还是动态,Secrets Manager 的核心价值在于:
- 中央化存储
- 精细化访问控制(Resource Policy + IAM)
- 完整的生命周期与审计能力
- KMS默认加密保护
二、基于 IAM / STS 的临时凭据
与 Secrets Manager 不同,STS 提供的是完全不需要存储的瞬时凭据模型。
| |

凭据在需要时生成,在固定时间后自动失效:
- 默认有效期从 15 分钟到数小时
- 不需要集中保存
- 天然符合最小权限与零信任原则
这类机制广泛用于:
- EC2 / Lambda 的运行时身份
- 服务间调用
- 跨账户访问授权
架构上混用而非对立
在成熟的 AWS 架构中,这两条路径并非替代关系,而是协同存在:
- Secrets Manager 负责管理那些“必须存在”的凭据
- STS 负责解决“运行时我是谁、我能干什么”
尤其值得注意的是:
即便是可轮转的 Secrets,其“动态”体现在凭据值的不断迭代,而非访问身份的临时性。
三、RDS凭据轮转:单账号/双账号轮转与无密码认证的架构选择
凭据轮转是Secrets Manager的核心能力,但不同策略的选择直接影响系统的可用性水平。
https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotation-strategy.html

1. 单账号轮转:简单直接的实现

工作流程:
- 轮转Lambda被触发
- 在数据库中为现有用户(如
app_user)生成新密码 - 更新Secrets Manager中的凭据值
面临的挑战:
- 一致性窗口问题:在数据库密码已更新但Secret值未完全同步的短暂期间(通常几秒),部分应用实例可能因使用旧密码而连接失败
- 恢复依赖:要求应用程序具备健壮的连接重试和错误处理机制
适用场景:开发测试环境、非核心业务系统、或已具备完善重试架构的应用。
2. 双账号轮转:高可用生产环境的标准答案

这是AWS为关键业务系统推荐的设计模式,实现了近乎无缝的凭据切换。
核心机制:
- 在数据库中维护两个用户:
user_a和user_b - Secrets Manager始终只对外暴露其中一个有效凭据
- 两个用户交替承担“活跃角色”
轮转过程详解:
- 准备阶段:当
user_a为活跃用户时,轮转Lambda更新处于待机状态的user_b密码 - 切换阶段:确认
user_b更新成功后,立即将Secrets Manager中的凭据指向user_b - 兜底保障:即便切换过程存在毫秒级延迟,
user_a的旧凭据仍然有效,确保零服务中断
技术优势:
- 消除单点故障:任何时候都至少有一个有效数据库用户
- 平滑过渡:应用无需感知底层凭据变更
- 降低复杂性:减少对应用层重试逻辑的依赖
生产建议:对于RDS/Aurora生产数据库,首选双账号轮转模式。
AWS提供托管的轮转Lambda模板,大幅降低了实现复杂度。
| |
https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/

3. 另一条路径:IAM Database Authentication
在讨论 Secrets Manager 的 RDS 凭据轮转时,很容易产生一个误解:
“既然密码可以自动轮转,那数据库凭据问题是不是已经被彻底解决了?”
AWS 给出的答案是否定的。
对于一部分数据库引擎和使用场景,AWS 选择了一条完全不同的路径——不再管理密码,而是消除密码本身。
这就是 IAM Database Authentication。

最终生成的 Token 形式如下:
| |
3.1. 它解决的不是“密码安全”,而是“是否还需要密码”
在 IAM Database Authentication 模式下:
- 数据库账号不再依赖固定密码
- 应用使用 IAM / STS 的临时身份
- 动态生成一个 短期有效的数据库登录 Token
- 数据库直接验证该 IAM 身份是否被信任
这个 Token:
- 默认有效期最短约 15 分钟
- 无需存储
- 过期即失效
- 无法复用
数据库信任的不是密码而是 AWS 的身份体系。
3.2. 与 Secrets Manager 单账号轮转的本质区别
这两种机制常常被并列提及,但它们解决的是完全不同层次的问题。
| 对比维度 | IAM Database Authentication | Secrets Manager 单账号轮转 |
|---|---|---|
| 是否存在数据库密码 | ❌ 不存在 | ✅ 存在 |
| 凭据存储 | ❌ 不存储 | ✅ Secrets Manager |
| 认证方式 | IAM / STS 身份 | 用户名 + 密码 |
| 凭据有效期 | 分钟级 | 天 / 周级 |
| 是否需要轮转 | ❌ 不需要 | ✅ 必须 |
| 安全模型 | 零密码 | 托管密码 |
可以看到:
- IAM DB Auth 追求的是“密码消失”
- Secrets Manager 接受密码不可避免,并对其进行治理
3.3. 为什么 AWS 同时提供这两种机制?
原因很现实,也很工程化:
- 并非所有数据库引擎支持 IAM Auth
- 并非所有应用都能生成 IAM Token
- 并非所有生态系统都能无缝接入 AWS 身份体系
因此,AWS 的策略是:
能消除密码的地方,尽量消除; 消除不了的地方,让密码变得可控、可轮转、可审计。
3.4. 这两条路径在真实系统中的共存方式
在一个成熟的系统中,以下组合非常常见:
- 新开发的云原生服务 → IAM Database Authentication
- 旧系统 / 第三方工具 → Secrets Manager 管理密码
- 同一数据库,可能存在:
- IAM Auth 的逻辑用户
- 以及传统用户名 + 密码的用户
这并不是妥协,而是渐进式云原生演进的现实形态。
3.5. AWS 支持的数据库登录方式汇总
Amazon RDS 支持三种用户登录认证模式:传统的密码认证、外部 Kerberos/AD 认证,以及基于 AWS IAM 的短期令牌认证。 IAM Database Authentication 是一种“无密码登录”方式,通过由 AWS 生成、短期有效的认证令牌实现安全访问,无需在应用中保存密码。
每个数据库用户一次只能启用一种认证机制,且推荐使用具备最小权限的用户,而非主用户直接访问。
https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/database-authentication.html

密码认证的三种工程实现形态
在采用传统用户名/密码登录的前提下,AWS 提供了不同的凭据生命周期管理策略:
| 模式 | 是否自动轮转 | 特点 |
|---|---|---|
| 静态数据库密码 | ❌ 否 | 密码长期不变,风险最高 |
| Secrets Manager 单账号轮转 | ✅ 是 | 轮转主账号密码,切换窗口存在短暂风险 |
| Secrets Manager 双账号轮转 | ✅ 是 | 使用 active / standby 账号,零中断轮转 |
这三种模式 使用的都是同一种数据库认证机制,差异只在于密码是如何生成、存储、更新和切换的。
四、SecretsManager SDK缓存:性能优化与一致性权衡
https://docs.aws.amazon.com/secretsmanager/latest/userguide/best-practices.html

应用如何安全高效地消费凭据,是架构设计的另一个关键维度。
SDK的职责边界
https://docs.aws.amazon.com/secretsmanager/latest/userguide/retrieving-secrets_cache-python.html

AWS SDK提供了GetSecretValue等基础API,其设计遵循明确的责任分离原则:
- SDK负责的:网络传输、请求重试(对限流和临时故障)、响应解析
- SDK不负责的:业务逻辑错误处理(如权限不足、凭据失效)
- 重要澄清:当轮转导致认证失败时,SDK会如实返回错误,而不会在内部尝试重试——这个决策权留给应用架构师
缓存组件的双重性
为了降低延迟和API调用成本,缓存是必要组件,但需理解其局限性:
缓存的价值:
- 性能提升:本地内存读取避免网络往返
- 成本优化:减少
GetSecretValueAPI调用次数 - 冷启动优化:Lambda Extension缓存显著改善无服务器函数启动时间
缓存的风险:
- 陈旧数据问题:如果缓存TTL设置为5分钟,而凭据在第1分钟轮转,则应用将使用4分钟的过期凭据
- 一致性延迟:分布式系统中,缓存的失效传播需要时间
关键认知**:缓存是性能优化工具,而非**一致性保证机制。即使使用缓存,应用仍需准备处理凭据失效。
五、安全保障:双重授权与透明故障
Secrets Manager 的设计体现了 AWS 对云安全的核心思考:通过明确的权限边界和透明的故障模式,构建可预测、可管理的安全体系。
1. 权限的“双重锁死”机制
要成功读取一个加密的 Secret,必须通过两层独立的权限检查:
第一层:Secret 资源策略
- 定义哪些 IAM 主体(用户、角色)可以访问该 Secret
- 支持基于条件(如源IP、MFA)的细粒度控制
- 这是逻辑层面的访问控制
第二层:KMS 密钥策略
- 定义哪些主体可以解密用于加密 Secret 的 KMS 密钥
- 这是物理层面的加密控制
- 关键洞察:即使 Secret 策略配置错误允许了过多访问,如果攻击者没有 KMS 解密权限,依然无法获取明文
这种“双重主权”设计确保了纵深防御——单一配置错误不会导致全面沦陷。
2. 控制面与数据面的分离
理解 Secrets Manager 的关键是区分两个平面:
控制面操作:
- 创建/删除 Secret
- 配置轮转策略
- 更新资源策略
- 这些是相对低频的管理操作
数据面操作:
GetSecretValue读取凭据- 这是高频的业务操作
- 需要同时通过 Secret 策略和 KMS 策略验证
轮转的本质:这是一个控制面操作修改了数据面状态的过程。在分布式系统中,这种状态变更的传播必然存在延迟,这就是“一致性窗口”的根本来源。
3. 透明故障:拥抱分布式现实
AWS 选择不在 SDK 层隐藏轮转期间的故障,这一设计决策体现了成熟的工程哲学:
- 诚实的系统:将分布式系统的固有复杂性暴露给开发者,而不是用“魔法”掩盖
- 鼓励韧性设计:迫使开发者在应用层实现重试、回退、降级等容错模式
- 可预测的故障模式:明确的错误类型(
AccessDeniedException、ResourceNotFoundException)让故障处理变得系统化
这背后的理念是:在云原生世界中,故障不是异常状态,而是必须设计的正常运行场景之一。