渗透测试用另一个 AWS 账号的只读凭证调用 kms:Decrypt,直接解开了订单密文,密钥策略里 Principal 是星号,Condition 也没限制账号。乍看像缓存或者权限的锅,追下去往往不是。
aws kms get-key-policy --key-id key-1234 --policy-name default aws kms decrypt --ciphertext-blob fileb://cipher.bin --key-id key-1234 --profile other-account
追下去是这么回事:密钥策略默认允许了所有主体,只要 IAM 侧给了 kms:Decrypt 就能用。策略和 IAM 是两套门,任意一套放宽都会放行。创建密钥时用了示例模板,没改 Principal。
「KMS 密钥策略」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。
偶发问题先统计频率,一小时几次和一天一次,查法完全不同。改完顺手把文档补一句,省得下次自己重新推一遍。
监控和日志的时间要对上,时区不一致会多绕很大一圈。
具体做法是,把 Principal 收窄到具体账号和角色 ARN;加 kms:ViaService 条件 限定只能从指定服务调用;开启密钥策略变更的 CloudTrail 告警;用另一个账号的凭证再调一次确认被拒。
验收就看一点,跨账号 Decrypt 返回 AccessDenied 密钥策略里 Principal 只剩业务角色。
