AWS Cloudwatch无法通过SSE发布到SNS主题

时间:2019-05-31 15:24:12

标签: amazon-web-services amazon-iam

我有一个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.comevents.amazonaws.com权限。同样的错误。

5 个答案:

答案 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)

这里只是总结正确答案,因为接受的答案似乎已经过时了:

  1. 您不能使用 Amazon 托管 CMK alias/aws/sns,因为要将 cloudwatch 与使用 KMS CMK 加密的 SNS 主题连接,您需要在 CMK 上设置资源策略/访问策略,以便Cloudwatch 服务可以对密钥执行 kms:GenerateDataKey*kms:Decrypt 操作,并且无法编辑亚马逊托管密钥的访问策略。

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

答案 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.comevents.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: '*'