AWS在云原生架构中将凭据提升为一个具有完整生命周期的可信对象,它需要版本管理、定期轮转、权限审计和故障恢复策略。

一、Secrets Manager 凭据的静态与动态形态

Secrets Manager 用于管理客观存在、需要被系统记住的凭据,例如数据库密码、第三方 API Token 等。

但需要强调的是,Secrets Manager 中的凭据并不都是“静态不变的”,而是分为两种形态:

  • 静态凭据(Static Secret)

    • 凭据值本身不会自动变化
    • 仅通过授权控制“谁可以读取”
    • 典型如第三方 SaaS API Key、遗留系统密钥
    Clipboard_Screenshot_1768287945
  • 动态凭据(Rotated Secret)

    • 凭据值会被系统周期性更新

    • 通过轮转函数同步修改后端系统(如 RDS)

    • 凭据虽被“存储”,但其值本身是动态演进的

      Clipboard_Screenshot_1768288009

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

      image-20260114095253822

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

      Clipboard_Screenshot_1768355520

无论静态还是动态,Secrets Manager 的核心价值在于:

  • 中央化存储
  • 精细化访问控制(Resource Policy + IAM)
  • 完整的生命周期与审计能力
  • KMS默认加密保护

二、基于 IAM / STS 的临时凭据

与 Secrets Manager 不同,STS 提供的是完全不需要存储的瞬时凭据模型

1
 aws sts get-session-token AppleM2Max --duration-seconds 3600

image-20260113151947163

凭据在需要时生成,在固定时间后自动失效:

  • 默认有效期从 15 分钟到数小时
  • 不需要集中保存
  • 天然符合最小权限与零信任原则

这类机制广泛用于:

  • EC2 / Lambda 的运行时身份
  • 服务间调用
  • 跨账户访问授权

架构上混用而非对立

在成熟的 AWS 架构中,这两条路径并非替代关系,而是协同存在:

  • Secrets Manager 负责管理那些“必须存在”的凭据
  • STS 负责解决“运行时我是谁、我能干什么”

尤其值得注意的是:

即便是可轮转的 Secrets,其“动态”体现在凭据值的不断迭代,而非访问身份的临时性。

三、RDS凭据轮转:单账号/双账号轮转与无密码认证的架构选择

凭据轮转是Secrets Manager的核心能力,但不同策略的选择直接影响系统的可用性水平。

https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotation-strategy.html

b31f340836f18e4b5b8814407927b8cd

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

Clipboard_Screenshot_1768292847

工作流程

  1. 轮转Lambda被触发
  2. 在数据库中为现有用户(如app_user)生成新密码
  3. 更新Secrets Manager中的凭据值

面临的挑战

  • 一致性窗口问题:在数据库密码已更新但Secret值未完全同步的短暂期间(通常几秒),部分应用实例可能因使用旧密码而连接失败
  • 恢复依赖:要求应用程序具备健壮的连接重试和错误处理机制

适用场景:开发测试环境、非核心业务系统、或已具备完善重试架构的应用。

2. 双账号轮转:高可用生产环境的标准答案

Clipboard_Screenshot_1768293179 image-20260113163348372 Clipboard_Screenshot_1768293703 Clipboard_Screenshot_1768293862

这是AWS为关键业务系统推荐的设计模式,实现了近乎无缝的凭据切换。

核心机制

  • 在数据库中维护两个用户:user_auser_b
  • Secrets Manager始终只对外暴露其中一个有效凭据
  • 两个用户交替承担“活跃角色”

轮转过程详解

  1. 准备阶段:当user_a为活跃用户时,轮转Lambda更新处于待机状态的user_b密码
  2. 切换阶段:确认user_b更新成功后,立即将Secrets Manager中的凭据指向user_b
  3. 兜底保障:即便切换过程存在毫秒级延迟,user_a的旧凭据仍然有效,确保零服务中断

技术优势

  • 消除单点故障:任何时候都至少有一个有效数据库用户
  • 平滑过渡:应用无需感知底层凭据变更
  • 降低复杂性:减少对应用层重试逻辑的依赖

生产建议:对于RDS/Aurora生产数据库,首选双账号轮转模式

AWS提供托管的轮转Lambda模板,大幅降低了实现复杂度。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Amazon RDS  Aurora 轮转模板
单用户轮转策略
SecretsManagerRDSDb2RotationSingleUser - IBM Db2 数据库
SecretsManagerRDSMariaDBRotationSingleUser - MariaDB 数据库
SecretsManagerRDSMySQLRotationSingleUser - MySQL 数据库
SecretsManagerRDSOracleRotationSingleUser - Oracle 数据库
SecretsManagerRDSPostgreSQLRotationSingleUser - PostgreSQL 数据库
双用户轮转策略(交替用户)
SecretsManagerRDSDb2RotationMultiUser - IBM Db2 数据库
SecretsManagerRDSMariaDBRotationMultiUser - MariaDB 数据库
SecretsManagerRDSMySQLRotationMultiUser - MySQL 数据库
SecretsManagerRDSOracleRotationMultiUser - Oracle 数据库
SecretsManagerRDSPostgreSQLRotationMultiUser - PostgreSQL 数据库
Amazon DocumentDB 轮转模板
SecretsManagerMongoDBRotationSingleUser - 单用户轮转
SecretsManagerMongoDBRotationMultiUser - 双用户轮转
Amazon Redshift 轮转模板
SecretsManagerRedshiftRotationSingleUser - 单用户轮转
SecretsManagerRedshiftRotationMultiUser - 双用户轮转
Amazon ElastiCache 轮转模板
SecretsManagerElastiCacheRotationSingleUser - 用于轮转用户密码
Amazon Timestream for InfluxDB 轮转模板
SecretsManagerTimestreamInfluxDBRotationSingleUser - 单用户轮转
Active Directory 轮转模板
SecretsManagerADRotationSingleUser - 单用户凭据轮转
SecretsManagerADRotationSingleUserWithKeytab -  keytab 的单用户凭据轮转
通用轮转模板
SecretsManagerRotationTemplate - 适用于任何类型密钥的通用模板

https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/

Clipboard_Screenshot_1768289659 image-20260113164525261

3. 另一条路径:IAM Database Authentication

在讨论 Secrets Manager 的 RDS 凭据轮转时,很容易产生一个误解:

“既然密码可以自动轮转,那数据库凭据问题是不是已经被彻底解决了?”

AWS 给出的答案是否定的。

对于一部分数据库引擎和使用场景,AWS 选择了一条完全不同的路径——不再管理密码,而是消除密码本身。

这就是 IAM Database Authentication

img

最终生成的 Token 形式如下:

1
database-1.ctg20gsqsqbx.ap-northeast-1.rds.amazonaws.com:3306/?Action=connect&DBUser=admin&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAVETEZN373SAWMX6G%2F20260113%2Fap-northeast-1d%2Frds-db%2Faws4_request&X-Amz-Date=20260113T074808Z&X-Amz-Expires=900&X-Amz-SignedHeaders=host&X-Amz-Signature=2b818fda12607011c582f2d56a1f8541f372f98db3278a52672386f435abcdad

3.1. 它解决的不是“密码安全”,而是“是否还需要密码”

在 IAM Database Authentication 模式下:

  • 数据库账号不再依赖固定密码
  • 应用使用 IAM / STS 的临时身份
  • 动态生成一个 短期有效的数据库登录 Token
  • 数据库直接验证该 IAM 身份是否被信任

这个 Token:

  • 默认有效期最短约 15 分钟
  • 无需存储
  • 过期即失效
  • 无法复用

数据库信任的不是密码而是 AWS 的身份体系。

3.2. 与 Secrets Manager 单账号轮转的本质区别

这两种机制常常被并列提及,但它们解决的是完全不同层次的问题

对比维度IAM Database AuthenticationSecrets 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

Clipboard_Screenshot_1768290759 Clipboard_Screenshot_1768290860
密码认证的三种工程实现形态

在采用传统用户名/密码登录的前提下,AWS 提供了不同的凭据生命周期管理策略:

模式是否自动轮转特点
静态数据库密码❌ 否密码长期不变,风险最高
Secrets Manager 单账号轮转✅ 是轮转主账号密码,切换窗口存在短暂风险
Secrets Manager 双账号轮转✅ 是使用 active / standby 账号,零中断轮转

这三种模式 使用的都是同一种数据库认证机制,差异只在于密码是如何生成、存储、更新和切换的。

四、SecretsManager SDK缓存:性能优化与一致性权衡

https://docs.aws.amazon.com/secretsmanager/latest/userguide/best-practices.html

Clipboard_Screenshot_1768288963 Clipboard_Screenshot_1768289103

应用如何安全高效地消费凭据,是架构设计的另一个关键维度。

SDK的职责边界

https://docs.aws.amazon.com/secretsmanager/latest/userguide/retrieving-secrets_cache-python.html

Clipboard_Screenshot_1768289232

AWS SDK提供了GetSecretValue等基础API,其设计遵循明确的责任分离原则:

  • SDK负责的:网络传输、请求重试(对限流和临时故障)、响应解析
  • SDK不负责的:业务逻辑错误处理(如权限不足、凭据失效)
  • 重要澄清:当轮转导致认证失败时,SDK会如实返回错误,而不会在内部尝试重试——这个决策权留给应用架构师

缓存组件的双重性

为了降低延迟和API调用成本,缓存是必要组件,但需理解其局限性:

缓存的价值

  • 性能提升:本地内存读取避免网络往返
  • 成本优化:减少GetSecretValue API调用次数
  • 冷启动优化: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 层隐藏轮转期间的故障,这一设计决策体现了成熟的工程哲学:

  • 诚实的系统:将分布式系统的固有复杂性暴露给开发者,而不是用“魔法”掩盖
  • 鼓励韧性设计:迫使开发者在应用层实现重试、回退、降级等容错模式
  • 可预测的故障模式:明确的错误类型(AccessDeniedExceptionResourceNotFoundException)让故障处理变得系统化

这背后的理念是:在云原生世界中,故障不是异常状态,而是必须设计的正常运行场景之一。