将 S3 事件订阅到 SQS 队列而不向世界公开 SQS?

Posted

技术标签:

【中文标题】将 S3 事件订阅到 SQS 队列而不向世界公开 SQS?【英文标题】:Subscribe S3 events to SQS queue without exposing SQS to the world? 【发布时间】:2019-05-03 01:40:12 【问题描述】:

我正在为我认为简单的任务而苦苦挣扎。

我想将我的 SQS 队列配置为允许我账户中的 S3 存储桶发送消息,但不允许外人发送消息。 (外部人员是指不是我的 AWS 账户成员的任何委托人)

我可以上班的唯一SQS权限配置是Effect=Allow, Principals=*, Actions=SQS:SendMessage, Conditions=None

任何其他权限都会导致我在创建 [S3 事件 -> SQS] 时看到此错误:Unable to validate the following destination configurations. Permissions on the destination queue do not allow S3 to publish notifications from this bucket.

Principals=* 关心我。 根据我能找到的文档,这意味着世界上任何人都可以访问 SQS 队列。这是真的?这显然很糟糕。

如何允许我的 S3 存储桶将消息发送到我的 SQS 队列,而不是匿名用户推送消息?

我可以允许我的 AWS 账户中的任何资源向 SQS 发送消息。我只需要阻止匿名 AWS 用户的访问。这是一个非常基本的要求,我很惊讶我找不到一个简单的方法来做到这一点。

【问题讨论】:

将主体设置为存储桶的 arn 是否也会产生此错误? @hephalump 如何将存储桶的 arn 添加为主体? S3 存储桶 arn 不是 Principal 属性的有效条目。 Principal 上的工具提示为:The AWS account number(s) of the person(s) allowed or denied permissions——现在,可能有一种方法可以将存储桶指定为策略文档配置中的主体,但我认为它不会起作用。从概念上讲,我不认为 S3 存储桶是主体。 (我可能错了……) 它看起来很像 IAM 策略...当您输入 12 位帐号时,它也会产生错误吗? 【参考方案1】:

您可以在文档中找到安全配置

   "Condition": 
      "ArnLike":  "aws:SourceArn": "arn:aws:s3:*:*:bucket-name" 
   

请注意,对于 Amazon SNS 和 Amazon SQS IAM 策略,您可以在策略中指定 StringLike 条件,而不是 ArnLike 条件。

"Condition":          
  "StringLike":  "aws:SourceArn": "arn:aws:s3:*:*:bucket-name" 
    

来自the doc的完整示例


   "Sid": "example-statement-ID",
   "Effect": "Allow",
   "Principal": 
     "AWS": "*"  
   ,
   "Action": [
    "SQS:SendMessage"
   ],
   "Resource": "SQS-ARN",
   "Condition": 
      "ArnLike":  "aws:SourceArn": "arn:aws:s3:*:*:bucket-name" 
   
  

【讨论】:

对于其他搜索者,您可以将此策略设置为队列,通过 CLI 使用 aws sqs set-queue-attributes --queue-url <url> --attributes Policy="JSON stringified policy document"

以上是关于将 S3 事件订阅到 SQS 队列而不向世界公开 SQS?的主要内容,如果未能解决你的问题,请参考以下文章

到 KMS_MANAGED 加密 SQS 队列(在 CDK 中)的 S3 事件通知不起作用

如何将 SQS 队列订阅到 Java 中的 SNS 主题

模拟 AWS 服务和 Lambda 最佳实践

使用SQS接收SES消息

处理 SQS 项目队列的多线程方法

有没有办法在 AWS S3 上托管一个静态网站而不提供公共访问权限?