AWS 默认访问策略 SNS 主题和 SQS q

Posted

技术标签:

【中文标题】AWS 默认访问策略 SNS 主题和 SQS q【英文标题】:AWS default Access Policy SNS topics and SQS q's 【发布时间】:2020-05-12 16:39:04 【问题描述】:

为了进一步加强我们解决方案的安全性,我们现在正在研究使用的 SNS 主题和 SQS 队列。我们所有的组件都位于同一个 AWS 账户中。

首先,我们希望根据 IP 限制对 SQS 队列的访问。所以只允许来自我们的 NAT 网关 IP 的请求。我们不允许匿名访问我们的 SQS 队列。

但似乎没有办法实现这一点,因为 SQS 队列的创建者 - AWS 账户 ID - 默认具有访问权限。因此,您无法为同一 AWS 账户 ID 中的其他用户创建有效权限。因为这个新创建的用户 user2 将属于同一个 AWS 账户 ID,具有相同的权限集。

我的理解是否正确,只要他们的 IAM 策略允许,同一 AWS 账户 ID 中的所有用户默认都可以访问所有创建的 SQS 队列?我的假设是否正确,SNS 主题也有同样的行为?

以下是我想要实施的政策。除了这个政策,我没有其他适用于此 SQS q 的政策。但它不尊重源 IP 条件。当我使用正确的 AWS 访问密钥/秘密组合时,我仍然可以从任何地方连接。仅当我将 AWS 委托人设置为 * - 所有人 - 策略似乎才有效。


  "Version": "2012-10-17",
  "Id": "arn:aws:sqs:eu-west-1:4564645646464564:madcowtestqueue/SQSDefaultPolicy",
  "Statement": [
    
      "Sid": "Sid1589365989662",
      "Effect": "Allow",
      "Principal": 
        "AWS": "arn:aws:iam::4564645646464564:user/user2"
      ,
      "Action": [
        "SQS:DeleteMessage",
        "SQS:SendMessage",
        "SQS:ReceiveMessage"
      ],
      "Resource": "arn:aws:sqs:eu-west-1:143631359317:madcowtestqueue",
      "Condition": 
        "IpAddress": 
          "aws:SourceIp": "1.1.1.1"
        
      
    
  ]

参考:

Using identity-based policies with Amazon SQS - Amazon Simple Queue Service

Using identity-based policies with Amazon SNS - Amazon Simple Notification Service

【问题讨论】:

SNS 和 SQS 都支持基于资源的策略。因此,您不仅限于使用基于身份的策略来控制访问。为 sqs 提供的链接还显示了如何使用基于 IP 地址的 sqs 资源策略。 能否编辑您的问题以阐明您的要求?例如,不清楚您所说的“为同一 AWS 账户 id 中的另一个用户创建有效权限”是什么意思。 【参考方案1】:

亚马逊 SQS

Amazon SQS 能够定义Amazon SQS policies。除了 IAM 策略之外,还可以使用这些策略授予对队列的访问权限。

例如,可以添加允许匿名访问队列的策略,这对于外部应用程序向队列发送消息很有用。

有趣的是,这些策略还可用于控制通过 IP 地址访问队列

为了对此进行测试,我做了以下操作:

创建了一个 Amazon SQS 队列 使用 Amazon EC2 实例向队列发送消息 -- 成功 向 SQS 队列添加了以下策略:

  "Version": "2012-10-17",
  "Id": "Queue1_Policy_UUID",
  "Statement": [
    
      "Sid": "Queue1_AnonymousAccess_AllActions_IPLimit_Deny",
      "Effect": "Deny",
      "Principal": "*",
      "Action": "SQS:SendMessage",
      "Resource": "arn:aws:sqs:ap-southeast-2:xxx:queue",
      "Condition": 
        "NotIpAddress": 
          "aws:SourceIp": "54.1.2.3/32"
        
      
    
  ]

IP 地址是我的 Amazon EC2 实例的 IP 地址。

然后我尝试再次从 EC2 实例向队列发送消息 -- 成功 然后我从自己的计算机上运行了相同的命令 -- 不成功

因此,SQS 策略似乎可以覆盖通过 IAM 授予的权限。

(小心...我在队列中添加了拒绝sqs:* 的策略,但我无法编辑策略或删除队列!我必须使用 root 帐户删除它。)

亚马逊 SNS

使用此访问策略,我设法通过 Amazon SNS 实现了相同的结果:


  "Version": "2008-10-17",
  "Id": "__default_policy_ID",
  "Statement": [
    
      "Sid": "__default_statement_ID",
      "Effect": "Deny",
      "Principal": 
        "AWS": "*"
      ,
      "Action": "SNS:Publish",
      "Resource": "arn:aws:sns:ap-southeast-2:xxx:topic",
      "Condition": 
        "NotIpAddress": 
          "aws:SourceIp": "54.1.2.3/32"
        
      
    
  ]

【讨论】:

您好约翰,感谢您的回复。我了解我可以制定包含源 IP 等条件的访问策略。但此设置似乎仅在您将 AWS 委托人设置为所有人时才有效。我的目标是通过不允许匿名访问(仅允许特定的 AWS 帐户 ID)以及设置源 IP 来获得额外的安全层。但这似乎不可行,因为我注意到每当我配置具有 AWS 主体集和源 IP 条件的策略时,它都会被忽略,因为似乎默认策略开始生效 - AWS 账户中的所有用户都可以访问。这就是我最初的问题。 能否请您确认您想要实现的规则集?请尽可能清楚地描述它,因为不清楚您所说的“仅特定的 AWS 账户 id”是什么意思,以及是否需要与 IP 地址规则结合或作为 替代 IP 地址规则。例如,您是说“如果它来自此 IP 地址,它总是可以的,如果它来自具有正确权限的 IAM 用户,它总是可以的”?随意更新问题以添加这些额外的详细信息,而不是将其作为评论。

以上是关于AWS 默认访问策略 SNS 主题和 SQS q的主要内容,如果未能解决你的问题,请参考以下文章

AWS SNS 主题策略 Cloudformation

aws cloudformation 模板 sns sqs

Cloudformation - 如何在代码中设置 SNS 订阅的过滤策略?

在Python中使用aws的sns和sqs

Serverless 订阅其他区域的 SNS

来自账户 A 的 AWS Cloudwatch 警报无法发布到账户 B 中的 SNS 主题