我最近通过手动将 KMS 密钥添加到 Control Tower SNS 主题中“破坏”了 Control Tower。当 Control Tower 检查或升级堆栈时,这种方法效果不佳。我不得不移除密钥并调整一些堆栈以使其处于健康状态,但现在 SNS 主题未加密,Security Hub 不高兴。
之前,我向所有组织账户(每个账户一个)部署了一个用于 SNS 主题的 KMS 密钥,但现在我明白,如果我在创建或修改着陆区时给 Control Tower 一个密钥,它就可以帮我完成这个任务。据我所知,这个密钥必须是管理账户中的单个密钥,并且具有允许至少 Config 和 CloudTrail 服务的策略,但也可以在我的所有账户中使用。
如果有人能给我提供一个模板,我将不胜感激。谢谢。:)
答案1
我不能放过这个,所以我去测试并发现下面可能是一个很好的解决方案。
我学到的要点:
- 看起来服务只需要“kms:GenerateDataKey”权限。
- 如果您想要 *-通配符,请使用“StringLike”条件,而不是“StringEquals”
这文档非常有用。我无法成功制定使用“aws:SourceArn”或“aws:SourceAccount”的策略,但我确实成功使用了“kms:EncryptionContext:context”。
这是我的政策,帐号已删除:
{
"Version": "2012-10-17",
"Id": "SNS-KMS-Key",
"Statement": [
{
"Sid": "Key admin in mgmt account",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::112211221122:root"
},
"Action": "kms:*",
"Resource": "*"
},
{
"Sid": "AWS-services permissions in all accounts",
"Effect": "Allow",
"Principal": {
"Service": [
"config.amazonaws.com",
"cloudtrail.amazonaws.com"
]
},
"Action": [
"kms:GenerateDataKey",
"kms:Encrypt",
"kms:Decrypt",
"kms:DescribeKey",
"kms:ReEncrypt*"
],
"Resource": "*"
}
]
}
我希望有人觉得这很有用。请注意,我怀疑你可以并且可能应该使用条件来限制最后一条语句。我自己没能做到这一点。
答案2
我能够通过结合上述答案并允许以下 AWS 服务角色使用密钥来实现这一点:
"arn:aws:iam::112211221122:role/service-role/AWSControlTowerConfigAggregatorRoleForOrganizations",
"arn:aws:iam::112211221122:role/service-role/AWSControlTowerStackSetRole",
"arn:aws:iam::112211221122:role/service-role/AWSControlTowerAdmin",
"arn:aws:iam::112211221122:role/service-role/AWSControlTowerCloudTrailRole"
我不知道这些是否都是必要的,我只是猜测。