如何订阅 S3 事件到 SQS 队列,而不暴露 SQS 给外部?

4

我遇到了一个可能看起来很简单的问题。

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

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

当我创建[S3事件 -> SQS]时,任何其他权限都会导致我看到这个错误:无法验证以下目标配置。目标队列上的权限不允许S3从此存储桶发布通知。

Principals=*使我担忧。根据我所找到的文档,这意味着任何人都可以访问SQS队列。这是真的吗?这显然非常糟糕。

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

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


将主体设置为存储桶的 ARN 是否也会导致出现此错误? - hephalump
@hephalump 我该如何将存储桶的arn添加为主体?S3存储桶arn不是“Principal”属性的有效条目。 “Principal”的工具提示显示:“允许或拒绝权限的人员的AWS帐户号码”,现在,可能有一种方法在策略文档配置中指定存储桶作为主体,但我认为这不会起作用。从概念上讲,我不认为S3存储桶是一个主体。(我可能错了...) - James Wierzba
它看起来很像一个 IAM 策略... 当你放入你的12位数字账号时,也会产生错误吗? - hephalump
1个回答

4

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

   "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" }
  }  

以下示例取自文档

{
   "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" - Janaka Bandara

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