4. AWS Systems Manager Parameter Store:与 Secrets Manager 对比、标准/高级参数、层次结构

说起 AWS 里的密钥管理,很多人第一个想到的是 Secrets Manager。但我个人习惯先看看 Parameter Store。为什么?因为它免费,而且功能其实不弱。我刚开始接触云安全时,总觉得 Secrets Manager 才是正统,后来在一个成本敏感的项目里,Parameter Store 帮我省了一大笔钱,嗯,从那时起我就认真研究它了。

4.1 Parameter Store 是什么?

说白了,Parameter Store 就是 AWS 的一个集中化参数仓库。它可以存数据库连接串、、配置项,甚至整个 JSON 文件。你想想看,它和 Secrets Manager 都能存敏感信息,但定位完全不同。

特性 AWS Systems Manager Parameter Store AWS Secrets Manager
定价 标准参数免费,高级参数 $0.05/参数/月 每个 secret $0.40/月,外加 API 调用费
最大密钥长度 标准 4KB,高级 8KB 64KB
自动轮换 不支持(需配合 Lambda) 内置轮换(RDS、自定义)
层次结构 原生支持路径树(如 /prod/db/password) 不支持层次结构,必须用标签
CloudFormation 集成 支持(AWS::SSM::Parameter) 支持(AWS::SecretsManager::Secret)
访问控制 基于 IAM + KMS(高级参数) 基于 IAM + 资源策略
跨账户共享 通过 Resource Access Manager 通过资源策略直接共享

表格里就能看出关键差异。如果你只需要存一些配置值,且不要求自动轮换,Parameter Store 就是性价比之王。我曾经在一个微服务架构里,用了 200 多个参数来管理不同环境的配置,每个月账单几乎为 0。换成 Secrets Manager 的话,光基础费就 80 美元了。

4.2 标准参数 vs 高级参数

Parameter Store 内部有两种参数类型,很多人一开始没注意,结果踩了坑。我记得有个同事把 存为标准参数,后来发现数据被加密了,但用的是默认的 SSM 托管的 KMS 密钥,而他的 Lambda 角色没有解密权限……嗯,这里要仔细说。

标准参数

  • 免费,单参数最大 4KB
  • 默认使用 SSM 托管的 KMS 密钥(aws/ssm)加密
  • 不支持自动轮换
  • 非敏感数据可用纯文本(String 或 StringList)

高级参数

  • 每参数每月 $0.05,但支持 8KB 大小
  • 必须使用 KMS 客户管理密钥(CMK)
  • 支持参数策略(如过期时间、通知事件)
  • 适合存密码、令牌等敏感数据

一个小技巧:如果你需要将标准参数升级为高级参数,不能直接改类型。必须新建一个高级参数,然后把旧参数删除。我在一次迁移中漏删了旧参数,结果应用还在读标准参数,新密文根本没用上,排查了半天。

4.3 层次结构:这才是 Parameter Store 的大杀器

Secrets Manager 没有层次路径的概念,你只能用名字来区分。但 Parameter Store 可以像文件系统一样组织参数。举个例子:

/myapp/prod/db/host
/myapp/prod/db/port
/myapp/prod/db/password
/myapp/dev/db/host
/myapp/dev/db/port
/myapp/dev/db/password

有了层次结构,你可以用通配符一次性获取整个子树。比如用 AWS CLI:

aws ssm get-parameters-by-path --path /myapp/prod/ --recursive --with-decryption

这个特性在微服务场景下特别实用。我做过一个项目,每个服务有自己的 /service-a/prod/、/service-b/prod/ 层级,代码里只需要拼一个路径前缀就能拿到所有配置,避免了硬编码。

层次结构的最佳实践

  • 用环境做第一级:/prod/、/staging/、/dev/
  • 用服务名做第二级:/prod/orders/、/prod/auth/
  • 用具体配置项做第三级:/prod/orders/db_url
  • 别忘了加 WithDecryption=true,否则加密参数返回的是密文

小心权限陷阱:层次结构的参数,IAM policy 可以用 Path 条件限制。比如只允许访问 /prod/* 下的参数。但我遇到过一个问题——标准参数路径写错了,权限给了 /prood/*,结果生产环境怎么都读不到参数,因为在控制台里参数名拼写错误。建议写 IaC 时用代码生成路径,避免手打。

4.4 什么时候用 Parameter Store,什么时候用 Secrets Manager?

我会按这个简单原则判断:

  1. 存非敏感配置(端口号、域名、feature flag) → Parameter Store 标准参数(免费)
  2. 存敏感数据但能接受手动轮换或自定义自动化 → Parameter Store 高级参数(便宜)
  3. 需要自动轮换、跨账户共享、审计事件详情 → Secrets Manager(付费但省心)

我曾经把 RDS 密码存在 Parameter Store 高级参数里,然后写了一个 Lambda 每月轮换一次。虽然能跑,但维护起来比 Secrets Manager 的自动轮换麻烦不少。所以如果预算允许,数据库密码这种东西我还是建议上 Secrets Manager。

Parameter Store 层次结构与参数类型对比 Parameter Store 层次结构及参数类型决策树 Parameter Store 层次结构(路径树) /prod/db/host /prod/db/password /staging/api/key 参数类型选择 标准参数 最大4KB · 免费 高级参数 最大8KB · 收费 核心决策点: • 只需要简单路径分组?用层次结构 • 存非敏感配置?标准参数(免费) • 存敏感数据且需要自定义轮换?高级参数 • 自动轮换/丰富审计?去 Secrets Manager 注:层次结构和参数类型可以组合使用,例如 /prod/db/password 可以是高级参数。

4.5 实战避坑指南

我曾经有过一次惨痛经历。当时为了节省成本,把所有密码都放在 Parameter Store 标准参数里,用的是默认加密。结果在审计时发现,所有 EC2 实例的实例角色默认都有 ssm:GetParameters 权限,一个低权限的实例就能读走数据库密码。后来我紧急改成了高级参数,并限制只有特定服务角色的实例才能访问指定路径。

安全基线:

  • 敏感数据必须用高级参数 + 客户管理 KMS 密钥
  • 对每个参数或路径设置严格的 IAM 条件
  • 定期使用 AWS Config 规则检查是否有非加密参数存储了密码(关键字:password、secret、key)

4.6 总结要点

  • Parameter Store 免费层非常适合配置管理,层次结构是独一无二的优势
  • 标准参数只适合非敏感数据,高级参数才适合密钥
  • 与 Secrets Manager 的选择并非二选一,完全可以混用——非敏感用 SSM,敏感用 SM
  • 层次路径要规划好,建议从第一天就用 /环境/服务/项目 的格式,否则改起来很痛苦

嗯,这一章内容就这些。下一个章节我们会深入 Parameter Store 的自动化与 CI/CD 集成,看看怎么在 CodePipeline 里安全地注入参数——到时候我会分享一个差点把生产环境搞挂的真实案例。