AWS SNS ConfirmSubscription 授权从未授予 IAM 用户

Posted

技术标签:

【中文标题】AWS SNS ConfirmSubscription 授权从未授予 IAM 用户【英文标题】:AWS SNS ConfirmSubscription authorization never granted to IAM user 【发布时间】:2021-11-17 03:43:29 【问题描述】:

目标:授予 IAM 用户确认 SNS 主题订阅的权限

问题:使用 AWS Web 控制台,无论我附加什么许可策略,我都无法向 IAM 用户账户授予适当的 SNS 权限。

步骤完成:我创建了一个主题,它跟踪 S3 对象的更改并通过 SNS 订阅(HTTPS/JSON 调用)将该信息推送到我的应用程序。

我收到请求的代码:

def self.confirm(arn, token)
    client = retrieve_client
    client.confirm_subscription(topic_arn: arn, token: token)
  end

  def self.retrieve_client
    creds = Aws::Credentials.new(
      Rails.application.credentials.dig(:aws, :access_key_id),
      Rails.application.credentials.dig(:aws, :secret_access_key)
    )
    Aws::SNS::Client.new(region: 'us-east-2', credentials: creds)
  end

当我的代码收到 SNS 确认请求时,我会收到以下错误消息:

Aws::SNS::Errors::AuthorizationError (User: arn:aws:iam::12345678912:user/user_name is not authorized to perform: SNS:ConfirmSubscription on resource: arn:aws:sns:us-east-2:12345678912:topic_name because no boundary policy allows the SNS:ConfirmSubscription action)

上述代码适用于不同的应用程序(但不同的 IAM 用户),所以我不认为代码是罪魁祸首。

我尝试将策略添加到组,然后将用户添加到组,没有任何变化。

我已经诉诸于直接向用户添加策略,没有任何变化。

这是我尝试过的两个最宽松的政策,我不知道我可以授予该用户哪些其他全面权限以使订阅确认生效。

主题栏arn:aws:sns:us-east-2:12345678912:topic_name

主题访问政策


  "Version": "2008-10-17",
  "Statement": [
    
      "Effect": "Allow",
      "Principal": "*",
      "Action": "sns:Publish",
      "Resource": "arn:aws:sns:us-east-2:12345678912:topic_name
        "StringEquals": 
          "AWS:SourceAccount": "12345678912"
        ,
        "ArnLike": 
          "AWS:SourceArn": "arn:aws:s3:*:*:*"
        
      
    
  ]

策略 1(来自 AWS Managed AmazonSNSFullAccess 策略):


    "Version": "2012-10-17",
    "Statement": [
        
            "Action": [
                "sns:*"
            ],
            "Effect": "Allow",
            "Resource": "*"
        
    ]

策略 2,我只需单击尽可能多的操作选项,看看是否有任何效果:


    "Version": "2012-10-17",
    "Statement": [
        
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "sns:TagResource",
                "sns:DeleteTopic",
                "sns:ListTopics",
                "sns:Unsubscribe",
                "sns:CreatePlatformEndpoint",
                "sns:SetTopicAttributes",
                "sns:UntagResource",
                "sns:OptInPhoneNumber",
                "sns:CheckIfPhoneNumberIsOptedOut",
                "sns:ListEndpointsByPlatformApplication",
                "sns:SetEndpointAttributes",
                "sns:Publish",
                "sns:DeletePlatformApplication",
                "sns:SetPlatformApplicationAttributes",
                "sns:VerifySMSSandboxPhoneNumber",
                "sns:Subscribe",
                "sns:ConfirmSubscription",
                "sns:RemovePermission",
                "sns:ListTagsForResource",
                "sns:DeleteSMSSandboxPhoneNumber",
                "sns:ListSubscriptionsByTopic",
                "sns:GetTopicAttributes",
                "sns:ListSMSSandboxPhoneNumbers",
                "sns:CreatePlatformApplication",
                "sns:SetSMSAttributes",
                "sns:CreateTopic",
                "sns:GetPlatformApplicationAttributes",
                "sns:GetSubscriptionAttributes",
                "sns:ListSubscriptions",
                "sns:AddPermission",
                "sns:ListOriginationNumbers",
                "sns:DeleteEndpoint",
                "sns:ListPhoneNumbersOptedOut",
                "sns:GetEndpointAttributes",
                "sns:SetSubscriptionAttributes",
                "sns:GetSMSSandboxAccountStatus",
                "sns:CreateSMSSandboxPhoneNumber",
                "sns:ListPlatformApplications",
                "sns:GetSMSAttributes"
            ],
            "Resource": "*"
        
    ]

我完全不清楚还需要哪些其他政策才能为该用户提供确认 SNS 订阅所需的授权。

【问题讨论】:

你的“边界政策”是什么? 那个,我不知道...必须查一下。 【参考方案1】:

感谢 Marcin 提出的关于“边界策略”的问题,我了解到 IAM 边界策略的概念是存在的,它是什么,然后解决了我的问题。

在某些时候,当设置 IAM 用户时,边界策略会附加到用户账户,这会排除其他服务或组策略可能提供给该用户的任何其他策略。

因此,当我检查有问题的 IAM 用户时,我发现了一个仅允许访问 AWS S3 服务的边界策略。该政策阻止了我向用户授予对 AWS SNS 服务的访问权限。

删除边界策略后,IAM 用户设置现在显示为“权限边界(未设置)”,并且 SNS 订阅的确认按预期工作。

感谢您的帮助,马辛!

【讨论】:

以上是关于AWS SNS ConfirmSubscription 授权从未授予 IAM 用户的主要内容,如果未能解决你的问题,请参考以下文章

aws cloudformation 模板 sns sqs

Camel AWS SNS例外

AWS - 在 SNS 订阅或 Lambda 函数上设置死信队列有啥区别?

AWS SNS 主题策略 Cloudformation

amazon-aws 使用 SNS 发送短信

如何使用 AWS CloudFormation 为 SNS 订阅指定“原始消息传递”?