SQS 可以在没有特定 KMS 权限的情况下从 SNS 接收加密消息

SQS can receive encrypted message from SNS with no specific KMS permission

我是 AWS KMS(密钥管理服务)的新学员。

目前我想创建一个 SNS,它启用了服务器端加密 (SSE) 并将消息发布到订阅 Amazon SQS 队列。

Cloudformation 的资源部分是这样的: (未显示 CMK 密钥和 SNS Arn)

Resources:
  MySNSTopic: 
    Type: AWS::SNS::Topic
    Properties:  
      TopicName: !Ref TopicName 
      KmsMasterKeyId: (My_CMK_Key)

  MySQS:
    Type: AWS::SQS::Queue
    Properties:
      QueueName: "MySQS"
      
  MySQSPermissions:
    Type: AWS::SQS::QueuePolicy
    Properties:
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Sid: MySQSPolicy
            Effect: Allow
            Principal: '*'
            Action:
              - sqs:SendMessage
            Resource: !GetAtt MySQS.Arn
            Condition:
              ArnEquals:
                aws:SourceArn: (My_SNS_ARN)
      Queues:
        - !Ref MySQS
            
  MySQSSubscription:
    Type: AWS::SNS::Subscription
    Properties:
      Protocol: sqs
      Endpoint: !GetAtt MySQS.Arn
      Region: !Ref AWS::Region
      TopicArn: (My_SNS_ARN)

如您所见,只有 SNS 主题启用了 SSE,但 SQS 只是订阅 SNS 主题。

当我尝试向 SNS 主题发布消息时。 SQS 队列 (MySQS) 可以成功接收消息,但看起来它的 Body 没有加密(仍然是人类可读的)。

{
  "Type" : "Notification",
  "MessageId" : (id),
  "TopicArn" : (Arn),
  "Subject" : "The message from SNS topic",
  "Message" : "The message should be encrypted", // Looks like it is not encrypted?
  "Timestamp" : "....",
  "SignatureVersion" : "1",
  "Signature" : (Signature string),
  "SigningCertURL" : (Signing URL),
  "UnsubscribeURL" :  (Unscribed URL)
}

我的问题是:

  1. 我如何知道来自此 SNS 主题的消息已加密?
  2. SQS 队列如何接收看似未加密的消息(来自 SNS 主题)?这种情况下的 SQS 队列不使用 SNS 主题使用的相同 CMK,并且也没有指定任何 KMS 权限。
  3. 如果我创建一个 Lambda 函数来从此 SQS 队列检索数据,它是否需要 CMK 密钥?还是可以成功读取消息?

Amazon SNS API 已通过安全 HTTP (HTTPS) 提供服务,并使用传输层安全性 (TLS) 对所有传输中 的消息进行加密。

并且在这种情况下使用的 KMS (SSE) 是静态消息加密:“...消息以加密形式存储 跨多个可用区 (AZ) 以确保持久性,并且 在交付 到订阅端点之前被解密,例如 Amazon Simple Queue Service (Amazon SQS) 队列、AWS Lambda 函数和 HTTP和 HTTPS webhooks。

长话短说,我们在这种情况下使用的 CMK 是“使所有消息在 SNS 中时都被加密”,而不是“加密传输中的消息”。

文档:https://aws.amazon.com/blogs/compute/encrypting-messages-published-to-amazon-sns-with-aws-kms/