将 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?的主要内容,如果未能解决你的问题,请参考以下文章