当前位置: 首页 > 知识库问答 >
问题:

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

羊舌诚
2023-03-14

我是AWS KMS(钥匙管理服务)的新手。

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

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)可以成功接收消息,但其主体似乎未加密(仍为人类可读)。

{
  "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键?或者它可以成功读取消息?

共有1个答案

瞿文柏
2023-03-14

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

本例中使用的KMS(SSE)是静态消息加密:“……消息以加密形式存储在多个可用性区域(AZ)中,以确保持久性,并在交付到订阅的endpoint之前解密,例如亚马逊简单队列服务(Amazon SQS)队列、AWS Lambda函数以及HTTP和HTTPS webhooks。”

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

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

 类似资料:
  • 我们配置了EC2实例,该实例具有对SQS和EC2的完全权限的IAM角色。有没有什么方法可以在没有AWS的任何SDK/CLI支持的情况下发送消息到队列?仅使用来自EC2实例的简单REST调用?

  • 我创建了一个SNS主题,通过cli发布来自Cloudformation的所有信息。然而,当我检查队列时,它没有接收任何SNS消息。我通过订阅我的电子邮件来验证SNS是否正常工作,所以问题似乎出在队列和SNS之间的连接上。然而,我没有发现我的语法有任何问题。一、 据我所知,他们严格遵循了亚马逊的文档。 猛击:

  • 我试图从一个Python 3.8Lambda函数发布到一个KMS加密的SNS主题。我的lambda的代码是: 如果SNS没有加密,代码可以完美地工作······ ...但是当我通过以下选项加密SNS主题时: 在执行lambda时,我得到以下错误: {“errorMessage”:“调用发布操作时发生错误(KMSNotFound):无效键号AWS/SNS(服务:AWSKMS;状态代码:400;错误代

  • 我正在使用Amazon Textract的StartDocumentAnalysis函数异步扫描文件。S3存储桶中的pdf文件。正如文档所说,我应该会收到一份关于工作状态的通知,发送到提供的SNS主题。 返回用于获取操作结果的作业标识符(JobId)。当文本分析完成后,亚马逊文本将完成状态发布到您在中指定的亚马逊简单通知服务(Amazon SNS)主题。 我用来开始分析的代码如下: 我在AWS控制

  • 我试图通过社交网络从亚马逊SES获得电子邮件回复(退回、投诉和交付)。在亚马逊SQS控制台上,我看到消息已经在队列中,所以我确信亚马逊上的结构设置是正确的。 然后,使用Laravel 5.5,按照官方指南,我设置了一个队列来听SQS。我跳过了将作业分配到队列的部分,因为这将由SNS完成。为了简单起见,在作业处理程序中,我只需要转储我收到的内容。作业如下所示: 其配置如下所示: 为安全起见,实际值隐

  • 问题内容: 我正在尝试在办公室笔记本电脑上安装JDK,但是它说我需要管理员权限。我只能在工作中使用自己的帐户。 没有管理员权限的情况下如何安装Java开发套件? 问题答案: 这是一种在没有管理员特权或没有管理员密码的情况下安装Java的解决方法。为此,您需要安装不需要管理员特权的cygwin。在utils中,确保您选择cabextract.exe进行安装。 启动Cygwin Bash外壳。 键入c