我有一个 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 策略模拟器来识别他们缺少权限的地方,但似乎没有办法验证服务对其他服务的访问。这是我能做到的吗?
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
是有验证的。
"null (Service: AWSKMS; Status Code: 400; Error Code: AccessDeniedException; Request ID: ccccccccccccccccccc)"
,以这种方式使用 CMK 时,我也收到了完全相同的错误。我可以理解我的 CMK 无法正常工作,但我认为亚马逊托管密钥应该开箱即用。
我尝试使用授予sns.amazonaws.com
和events.amazonaws.com
kms:*
权限的 CMK。同样的错误。
只是在这里总结正确答案,因为接受的答案似乎已经过时了:。
您不能使用 Amazon 托管 CMKalias/aws/sns
因为为了将 cloudwatch 与使用 KMS CMK 加密的 SNS 主题连接,您需要在 CMK 上设置资源策略/访问策略,以便 cloudwatch 服务可以对密钥执行kms:GenerateDataKey*
和kms:Decrypt
操作,并且无法编辑 Amazon 托管式密钥上的访问策略。对于您的情况,您需要创建客户托管的对称 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": "*"
}
]
}
更新:此信息可能已过时。请尝试其他答案,并让每个人都知道它们是否适合您。
显然,CloudWatch无法根据使用服务器端加密 (SSE) 和 AWS KMS 保护 Amazon SNS 数据向加密的 SNS主题发送消息:
目前,CloudWatch 警报不适用于 Amazon SNS 加密主题。有关将警报发布到未加密主题的信息,请参阅《Amazon CloudWatch 用户指南 》中的使用 Amazon CloudWatch 警报。
但是,博客文章使用AWS KMS 加密发布到 Amazon SNS 的消息似乎表明您可以...
🤦
将以下events.amazon.com
权限添加到 KMS 密钥的资源策略中对我很有用,特别是允许已加密 SNS 主题注册为"失败"CodeBuild 和 CodePipeline 状态Targets
的AWS::Events::Rule
。
{
"Sid": "Allow Events use of key (for publishing to CMK encrypted SNS topics)",
"Effect": "Allow",
"Principal": {
"Service": "events.amazonaws.com"
},
"Action": [
"kms:Decrypt",
"kms:GenerateDataKey*"
],
"Resource": "*"
}
希望这能为其他人节省一些挫败感和时间。
该服务不是"events.amazonaws.com",而是"cloudwatch.amazonaws.com"。在密钥策略中更改此设置后,您应该会收到 SNS 通知。
有关详细信息,请参阅 https://docs.aws.amazon.com/sns/latest/dg/sns-server-side-encryption.html。
虽然某些 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 的策略中。 这仅适用于客户管理的密钥。
我今天遇到了同样的问题!我看到有人建议将 CMK 授予cloudwatch.amazonaws.com
和events.amazonaws.com
.对我来说,我需要授予两者才能起作用。以下是我对 CMK 的云形成定义的全部内容。
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: '*'
Problema resolvido apenas criando a Key Police no KMS re vinculando essa key a SNS que está encrypt;
enter code here{
"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::XXXXXXXXXXXXX: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": "*"
}
]
}