应用安全SASTIaC【免费下载链接】tfsecTfsec is now part of Trivy项目地址https://gitcode.com/gh_mirrors/tf/tfsec点击查看免费下载导读本文深入解析 tfsec 内置检查规则aws-ssm-secret-use-customer-key旧 IDAWS095AWS Secrets Manager 在默认情况下会使用 AWS 自动创建的服务托管密钥对 secret 进行加密而这条规则要求显式指定客户托管密钥Customer Managed Key, CMK以便对密钥加密获得更强的控制力与细粒度管理能力。阅读本文后你将掌握该规则的确切判定逻辑、低严重级别low的含义、通过/失败的 Terraform 配置写法以及如何在 tfsec 中针对这条规则进行最小严重级别过滤、排除、忽略与自定义覆盖并将其无缝落地到 CI 流程。1. 规则总览项目值规则 ID长期标识aws-ssm-secret-use-customer-key旧版规则 IDLegacy IDAWS095Provider / 服务aws/ssm默认严重级别low规则标题Secrets Manager should use customer managed keys所属文档目录docs/checks/aws/ssm/secret-use-customer-key/index.md该规则在 tfsec 全量规则清单 rules.md 中登记为aws-ssm-secret-use-customer-key | aws | ssm | Secrets Manager should use customer managed keys并在 internal/pkg/legacy/map.go 中与旧版 IDAWS095建立映射关系因此在同时使用新旧两种 ID 的场景下例如--exclude、tfsec:ignore注释、配置文件等都能正确识别同一规则。从源码结构看当前 tfsec 版本基于defsec见 go.mod 中github.com/aquasecurity/defsec v0.84.1规则文档由 cmd/tfsec-docs/webpage.go 中的baseWebPageTemplate模板统一生成该模板定义了“标题、默认严重级别、Explanation、Possible Impact、Suggested Resolution、Insecure Example、Secure Example、Links”的标准文档结构——本文所分析的页面正是该模板输出的一个具体实例。2. 规则背景为什么 Secrets Manager 需要客户托管密钥AWS Secrets Manager 对 secret 的加密默认使用 AWS 自动创建、与账号绑定的默认密钥即 AWS 托管密钥aws/secretsmanager。这种托管方式下密钥的轮换周期、权限边界、删除策略均由 AWS 统一管理用户无法针对特定 secret 定制密钥策略。tfsec 官方文档对该规则的说明如下Explanation规则解释Secrets Manager 默认使用 AWS 创建的默认密钥加密 secret。为了确保对 secret 加密拥有控制力和粒度应当显式使用 CMK。Possible Impact可能影响使用 AWS 托管密钥会降低加密密钥的灵活性与控制力。Suggested Resolution建议修复使用客户托管密钥。简言之该检查属于“加密与密钥管理最佳实践”类规则核心诉求是把密钥的“所有权”与“控制权”交还给资源所有者从而可以按需设置密钥轮换如每 90 天自动轮换独立控制 KMS Key Policy 中允许谁加解密该 secret配合 CloudTrail 对密钥使用情况进行审计在密钥泄露或合规要求变化时独立吊销、禁用或删除该密钥而不影响其他资源。3. 失败示例Insecure Example下面的 Terraform 配置无法通过aws-ssm-secret-use-customer-key检查resource aws_secretsmanager_secret bad_example { name lambda_password }这段代码仅定义了aws_secretsmanager_secret资源的name属性没有设置kms_key_id。tfsec 据此判定该 secret 将回退到 AWS 默认密钥加密从而报告一条 low 级别的告警。对应的完整可运行扫描方式如下在当前仓库 docs/checks/aws/ssm/secret-use-customer-key/index.md 中即为该示例tfsec .4. 安全示例Secure Example下面的 Terraform 配置可以通过aws-ssm-secret-use-customer-key检查resource aws_kms_key secrets { enable_key_rotation true } resource aws_secretsmanager_secret good_example { name lambda_password kms_key_id aws_kms_key.secrets.arn }要点说明先创建一个aws_kms_key资源作为客户托管密钥并开启enable_key_rotation true自动轮换是 CMK 的重要控制手段在aws_secretsmanager_secret中通过kms_key_id显式引用aws_kms_key.secrets.arn一旦kms_key_id被显式设置tfsec 判定该 secret 不再依赖 AWS 默认密钥规则通过。kms_key_id参数对应 Terraform AWS Provider 中aws_secretsmanager_secret资源的官方参数其值可以是 KMS 密钥的 ARN、别名或 ID在 Terraform 中通常直接引用aws_kms_key资源的arn属性如上例所示。关于该参数的完整语义可参考 AWS Provider 官方文档中secretsmanager_secret的kms_key_id说明见本文末尾“参考链接”。5. 检查判定逻辑的源码侧印证虽然 tfsec 当前版本将具体规则的实现下沉到了defsec依赖见 go.mod但可以从仓库中确凿地印证以下几点规则归属rules.md 明确登记该规则属于awsProvider 的ssm服务分类因此它的标准输出格式为aws-ssm-secret-use-customer-key。旧 ID 兼容internal/pkg/legacy/map.go 将AWS095映射到aws-ssm-secret-use-customer-key说明在 ignore、exclude 等场景中新旧 ID 可以互相指代。扫描执行链路tfsec 的命令入口 internal/app/tfsec/cmd/root.go 通过scanner.New(options...)创建 terraform 扫描器并调用ScanFSWithMetrics执行扫描最终结果经过 flags.go 中配置的过滤选项如最低严重级别、排除规则列表后输出规则命中时按 root.go 中的getDetailedExitCode决定退出码。可以推断defsec中对本规则的判定逻辑为解析aws_secretsmanager_secret资源块检查其kms_key_id属性是否缺失或为空缺失即为失败显式设置则为通过。6. 在 CI 与日常扫描中如何用好这条规则6.1 运行前确认规则 ID使用tfsec --help可查看全部命令行参数完整参数表见 docs/guides/usage.md。扫描时以aws-ssm-secret-use-customer-key作为规则 ID 即可。6.2 按最低严重级别过滤由于本规则默认严重级别为low如果你的 CI 只关注MEDIUM及以上问题可以使用--minimum-severity让这类告警不再出现在输出中tfsec . --minimum-severity MEDIUM对应源码见 internal/app/tfsec/cmd/flags.go--minimum-severity的合法取值为CRITICAL、HIGH、MEDIUM、LOW。注意如果全部失败结果都是 LOW 级别tfsec 会返回专门的退出码2见 root.go便于 CI 区分“低危告警”与“高危阻断”。6.3 单独排除该规则在代码迁移期或确实需要临时使用默认密钥的场景下可通过--exclude短参数-e排除tfsec . --exclude aws-ssm-secret-use-customer-key也支持使用旧 IDtfsec . --exclude AWS095该参数解析逻辑位于 internal/app/tfsec/cmd/flags.go会调用ScannerWithExcludedRules过滤对应规则。6.4 通过配置文件管理如果项目里被排除的检查逐渐增多建议在仓库根目录的.tfsec目录放置config.json或config.yml会自动加载或使用--config-file显式指定详见 docs/guides/configuration/config.md。YAML 示例--- exclude: - aws-ssm-secret-use-customer-key支持带过期日期的排除到期后规则自动重新启用--- exclude: - aws-ssm-secret-use-customer-key:2026-12-31配置文件还支持severity_overrides可以将该规则的严重级别上调例如在安全敏感项目里把low提升为HIGH以强制阻断--- severity_overrides: aws-ssm-secret-use-customer-key: HIGH6.5 行内忽略tfsec:ignore如果某处代码确实需要保留 AWS 默认密钥例如临时实验环境可以在资源块行尾或上方添加注释忽略该规则详见 docs/guides/configuration/ignores.mdresource aws_secretsmanager_secret tmp_secret { name tmp_password #tfsec:ignore:aws-ssm-secret-use-customer-key }也支持旧 ID 与过期日期#tfsec:ignore:AWS095:exp:2026-12-31 resource aws_secretsmanager_secret tmp_secret { name tmp_password }7. 常见问题Q1该规则为何属于ssm服务分类而不是单独的secretsmanagerA1这是 tfsec 的历史分类方式。在 rules.md 与 docs/checks/aws/ssm/index.md 中Secrets Manager 相关检查包括avoid-leaks-via-http与本规则统一归在aws/ssm分类下与 AWS 控制台/Provider 中 Secrets Manager 与 SSM Parameter Store 同属“密钥管理”语义一致。Q2是不是所有 AWS 托管密钥场景都会触发A2是的。只要aws_secretsmanager_secret未显式设置kms_key_id规则即判定失败与 secret 的内容、名称无关。Q3只设置kms_key_id但密钥不带轮换是否安全A3kms_key_id是本规则唯一判定依据因此只要显式设置了该属性规则即通过但建议同时为aws_kms_key开启enable_key_rotation true如本文安全示例以获得更完整的密钥生命周期管理。8. 参考链接Terraform AWS Provideraws_secretsmanager_secret资源中kms_key_id参数的官方说明registry.terraform.ioresources/secretsmanager_secret#kms_key_idAWS 文档Secrets Manager 与 KMS 集成、默认密钥与 CMK 的加密行为说明docs.aws.amazon.comkms/latest/developerguide/services-secrets-manager.html#asm-encrypt9. 延伸阅读仓库内规则总清单 rules.mdSSM 分类下全部检查 docs/checks/aws/ssm/index.md配置文件详解 docs/guides/configuration/config.md忽略规则指南 docs/guides/configuration/ignores.md命令行参数总表 docs/guides/usage.md旧 ID 映射表 internal/pkg/legacy/map.go规则文档生成模板 cmd/tfsec-docs/webpage.gotfsec 主命令入口 internal/app/tfsec/cmd/root.go赞分享应用安全SASTIaC【免费下载链接】tfsecTfsec is now part of Trivy项目地址https://gitcode.com/gh_mirrors/tf/tfsec点击查看免费下载相关推荐用 AWS CDK 批量创建 Secrets Manager 随机用户名密码密钥aws-doc-sdk-examples secrets-manager 栈实战解析用 AWS CDK 批量创建 Secrets Manager 随机用户名密码密钥aws doc sdk examples secrets manager 栈实示例工程教程后端Nanobot OpenAI 兼容 API 完整指南用 /v1/chat/completions 把本地 Agent 接入任何应用Nanobot OpenAI 兼容 API 完整指南用 /v1/chat/completions 把本地 Agent 接入任何应用 Nanobot 内置了一套应用安全SASTIaC使用 AWS Secrets Manager 集成 Vector在配置中安全托管 API Key 与数据库密码使用 AWS Secrets Manager 集成 Vector在配置中安全托管 API Key 与数据库密码 AWS Secrets Manager 是 A可观测性数据工程数据集成日志分析上一篇Tengine ngx_debug_pool 模块实战内存池占用诊断与逐模块内存剖析指南下一篇从游戏小白到创作大师HS2-HF_Patch如何重塑你的《Honey Select 2》体验创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考