AWS Cloudwatch无法使用SSE发布到SNS主题

9
我有一个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都有验证。
我也收到了完全相同的错误,"null (Service: AWSKMS; Status Code: 400; Error Code: AccessDeniedException; Request ID: ccccccccccccccccccc)",在使用CMK时也出现了这种情况。我可以理解我的CMK不能正常工作,但我认为Amazon管理的密钥应该可以直接使用。
我尝试使用授予 sns.amazonaws.comevents.amazonaws.com 带有 kms:* 权限的 CMK。但出现了相同的错误。

你是否使用过 CloudTrail 查看失败的请求?我不确定它是否会被记录。我很好奇,因为虽然我提供的文档提到了 Decrypt 和 GenerateDataKey,但我想知道是否具备足够的权限。 - erik258
Cloudtrail没有记录请求 :( 我只能从Cloudwatch中看到日志,其中不包括API调用本身。我认为你可能是正确的,关于权限的问题。我会加以修正。 - Breedly
@Breedly,我很想了解你是如何找到上面展示的日志的。我也遇到了类似的问题,但我不知道在哪里找这些日志。 - Gabriel C
@GabrielC 你可以从历史选项卡中的CloudWatch警报中查看它。所有事件都被记录下来,你只需要点击你感兴趣的事件即可。 - Pv66
7个回答

10

因为被接受的答案似乎已过时,所以在此总结正确答案:

  1. 您无法使用Amazon托管的CMK alias/aws/sns,因为要将CloudWatch与使用KMS CMK加密的SNS主题连接起来,您需要在CMK上设置资源策略/访问策略,以便CloudWatch服务可以执行密钥上的kms:GenerateDataKey*kms:Decrypt操作,而Amazon管理密钥的访问策略无法进行编辑。

  2. 对于您的情况,您需要创建一个客户管理的对称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": "*"
        }
    ]
}

太棒了!你有文档链接或博客文章更新情况吗? - Breedly
不是一篇更新情况的博客文章,但我找到了这篇文章,重点介绍了CloudWatch到SNS将会和不会工作的情况。https://aws.amazon.com/premiumsupport/knowledge-center/cloudwatch-receive-sns-for-alarm-trigger/ - juji-gatame
好的,我没有测试这个的必要,但我会在我的评论中留下尝试它的话。如果人们验证了你的,那么我就会交换它们。 - Breedly
我也为什么这不起作用而苦恼。你只需要将CloudWatch服务添加到您的KMS CMK策略中即可。 - Andy N

5
更新:这些信息可能已经过时。请尝试其他答案,并让每个人知道它们是否适合您。
显然,根据使用服务器端加密(SSE)和AWS KMS保护Amazon SNS数据的说法,CloudWatch无法将消息发送到加密的SNS主题:

目前,CloudWatch警报不适用于Amazon SNS加密主题。有关发布警报到未加密主题的信息,请参见Amazon CloudWatch用户指南中的使用Amazon CloudWatch警报。

但是,博客文章使用AWS KMS加密发布到Amazon SNS的消息似乎表明您可以...

4
仅将下面的events.amazon.com权限添加到KMS密钥的资源策略中,对我来说就足够了,特别是允许已加密的SNS主题注册为'FAILED' CodeBuild和CodePipeline状态的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": "*"
        }

希望这能为其他人节省一些我所遭受的沮丧和时间。

2

1

虽然一些AWS服务在您的帐户中使用IAM角色,但其他服务则使用特定的principal来授予访问权限。请参见https://aws.amazon.com/blogs/compute/encrypting-messages-published-to-amazon-sns-with-aws-kms/

我认为在您的情况下,您需要允许CloudWatch principal events.amazonaws.com 在密钥策略中被授权使用您指定的KMS密钥。请参见上面链接中的“启用加密主题和事件源之间的兼容性”部分。

请注意,正如文档所说,“几个AWS服务将事件发布到Amazon SNS主题。要使这些事件源与加密主题配合使用,您必须首先创建一个客户管理的CMK,然后将以下语句添加到CMK的策略中。” 这仅适用于客户管理的密钥。


谢谢你提醒我添加那个信息!似乎没有办法修改alias/aws/sns KMS密钥的策略。密钥策略似乎只适用于客户管理的密钥。我之前尝试过使用包含该博客文章中列出的主体和操作的CMK。 - Breedly

0
我今天也遇到了同样的问题!我看到有建议授予CMK给cloudwatch.amazonaws.comevents.amazonaws.com。对于我来说,我需要同时授予两个才能起作用。这是我的Cloudformation定义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: '*'

为什么这里是资源而不是使用密钥的ARN来加强安全性呢? - undefined

0

通过在 KMS 中创建 Key police 并将该密钥重新关联到加密的 SNS,问题得以解决。

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": "*"
    }
]
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接