我有一个Route53运行状况检查,该检查将其指标提交给Cloudwatch,最后Cloudwatch指定阈值并应通过SNS发送警报。
但是,我希望对SNS主题进行加密。当我使用alias/aws/sns
键打开SNS主题加密时,我在Cloudwatch消息历史记录中收到以下消息:
{
"actionState": "Failed",
"stateUpdateTimestamp": 123456778899,
"notificationResource": "arn:aws:sns:xx-region-y:zzzzzzzzzz:topic_name",
"publishedMessage": null,
"error": "null (Service: AWSKMS; Status Code: 400; Error Code: AccessDeniedException; Request ID: ccccccccccccccccccc)"
}
看来 并不是Cloudwatch的IAM问题,而是SNS本身未经授权可以使用KMS资源。
我喜欢为IAM用户使用IAM策略模拟器来识别缺少权限的地方,但是似乎没有一种方法可以验证服务对其他服务的访问。那是我可以管理的事情吗?
https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_testing-policies.html
我还通过以下策略在CMK中进行了尝试:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "sns.amazonaws.com"
},
"Action": [
"kms:GenerateDataKey*",
"kms:Decrypt"
],
"Resource": "*"
},
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "route53.amazonaws.com"
},
"Action": [
"kms:GenerateDataKey*",
"kms:Decrypt"
],
"Resource": "*"
},
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "events.amazonaws.com"
},
"Action": [
"kms:GenerateDataKey*",
"kms:Decrypt"
],
"Resource": "*"
},
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::XXXXXXXX:role/OrganizationAccountAccessRole"
},
"Action": "kms:*",
"Resource": "*"
}
]
}
我几乎和负责人一道投掷飞镖,但我认为SNS的sns.amazonaws.com
和Cloudwatch的events.amazonaws.com
都可以通过验证。
当以这种方式使用CMK时,我也收到完全相同的错误"null (Service: AWSKMS; Status Code: 400; Error Code: AccessDeniedException; Request ID: ccccccccccccccccccc)"
。我可以理解我的CMK无法正常工作,但是我认为应该可以直接使用Amazon托管密钥。
我尝试使用CMK授予sns.amazonaws.com
和events.amazonaws.com
权限。同样的错误。
答案 0 :(得分:1)
虽然某些AWS服务在您的帐户中使用IAM角色,但其他服务却使用特定的主要来授予访问权限。参见https://aws.amazon.com/blogs/compute/encrypting-messages-published-to-amazon-sns-with-aws-kms/。
在您的情况下,我认为您需要允许Cloudwatch主体events.amazonaws.com
被允许使用密钥策略中指定的KMS密钥。请参阅以上链接中的“启用加密主题和事件源之间的兼容性”部分。
请注意,如文档所述,“多个AWS服务将事件发布到Amazon SNS主题。要使这些事件源能够与加密主题一起使用,您必须首先创建一个客户管理的CMK,然后将以下语句添加到策略中CMK”。这仅适用于客户管理的密钥。
答案 1 :(得分:1)
该服务不是“ events.amazonaws.com”,而是“ cloudwatch.amazonaws.com”。在密钥策略中更改此设置后,您应该会收到SNS通知。
有关更多信息,请参见https://docs.aws.amazon.com/sns/latest/dg/sns-server-side-encryption.html。
答案 2 :(得分:1)
这里只是总结正确答案,因为接受的答案似乎已经过时了:
您不能使用 Amazon 托管 CMK alias/aws/sns
,因为要将 cloudwatch 与使用 KMS CMK 加密的 SNS 主题连接,您需要在 CMK 上设置资源策略/访问策略,以便Cloudwatch 服务可以对密钥执行 kms:GenerateDataKey*
和 kms:Decrypt
操作,并且无法编辑亚马逊托管密钥的访问策略。
对于您的情况,您需要创建一个客户管理的对称 CMK,并编辑访问策略以允许 cloudwatch 服务委托人访问该 CMK。访问策略将如下所示:
"Version": "2012-10-17",
"Id": "key-policies",
"Statement": [
{
"Sid": "Enable IAM User Permissions for administration of this key",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::xxxxxxxxxxxx:root"
},
"Action": "kms:*",
"Resource": "*"
},
{
"Sid": "Allow cloudwatch metric to use this key",
"Effect": "Allow",
"Principal": {
"Service": "cloudwatch.amazonaws.com"
},
"Action": [
"kms:Decrypt",
"kms:GenerateDataKey*"
],
"Resource": "*"
}
]
}
答案 3 :(得分:0)
显然,CloudWatch 不能根据Protecting Amazon SNS Data Using Server-Side Encryption (SSE) and AWS KMS将消息发送到加密的SNS主题:
当前,CloudWatch警报不适用于Amazon SNS加密主题。有关将警报发布到未加密主题的信息,请参阅Amazon CloudWatch用户指南中的使用Amazon CloudWatch警报。
但是,博客文章Encrypting messages published to Amazon SNS with AWS KMS似乎表明您可以...
答案 4 :(得分:0)
我今天遇到了同样的问题!我看到有人建议将CMK授予cloudwatch.amazonaws.com
和events.amazonaws.com
。对于我来说,我需要同意这两者才能正常工作。这是我对CMK的Cloudformation定义的全部。
InternalSNSKey:
Type: AWS::KMS::Key
Properties:
Description: IA-Internal-SNS Encryption Key
KeyPolicy:
Version: 2012-10-17
Id: allow-root-access-to-key
Statement:
- Sid: allow-root-to-delegate-actions
Effect: Allow
Principal:
AWS: !Sub arn:aws:iam::${AWS::AccountId}:root
Action:
- kms:*
Resource: '*'
- Sid: allow-cloudwatch-to-use-key
Effect: Allow
Principal:
Service: cloudwatch.amazonaws.com
Action:
- kms:Decrypt
- kms:GenerateDataKey*
Resource: '*'
- Sid: allow-events-to-use-key
Effect: Allow
Principal:
Service: events.amazonaws.com
Action:
- kms:Decrypt
- kms:GenerateDataKey*
Resource: '*'