将基于身份的策略用于 Amazon SNS - Amazon Simple Notification Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

将基于身份的策略用于 Amazon SNS

Amazon Simple Notification Service 集成了 Amazon Identity and Access Management (IAM),让您可以指定用户在您的 Amazon Web Services 账户 中可以使用 Amazon SNS 资源执行哪些 Amazon SNS 操作。您可以指定策略中的特定主题。例如,您可以使用变量创建一项 IAM 策略,此策略向您组织中的特定用户授予权限,允许其通过您的 Amazon Web Services 账户 中的特定主题执行 Publish 操作。有关更多信息,请参阅 Using IAM 指南中的 Policy Variables

重要

结合使用 Amazon SNS 和 IAM 并不会改变您使用 Amazon SNS 的方式。Amazon SNS 操作没有发生变化,且没有关于用户和访问控制的新 Amazon SNS 操作。

有关涉及 Amazon SNS 操作和资源的策略示例,请参阅 Amazon SNS 的策略示例

IAM 和 Amazon SNS 策略一起使用

您可以利用 IAM 策略限制您的用户对 Amazon SNS 操作和主题的访问权限。IAM 策略仅对您 Amazon 账户中的用户起到限制访问的作用,对其他 Amazon Web Services 账户 则没有限制作用。

您可对特定主题使用 Amazon SNS 策略,以限制谁能使用该主题(例如,谁能向主题发布消息,谁能订阅该主题等)。Amazon SNS 策略可以授予对其他 Amazon Web Services 账户 或者您自己的 Amazon Web Services 账户 中的用户的访问权限。

您可以使用 IAM 策略、Amazon SNS 策略或此两者向您的用户授予访问 Amazon SNS 主题的权限。在绝大部分情况下,无论采用上述哪种方式,都可以得到同样的结果。例如,下图显示了等效的 IAM 策略和 Amazon SNS 策略。IAM 策略允许在您的 Amazon 账户中针对名为 topic_xyz 的主题执行 Amazon SNS Subscribe 操作。IAM 策略附加在用户 Bob 和 Susan 上(表示 Bob 和 Susan 拥有策略所述的权限)。 策略Amazon SNS同样也会向 Bob 和 Susan 授予对 topic_xyz 访问 Subscribe 的权限。


          等效的 IAM 和 Amazon SNS 策略
注意

上述示例显示了不带任何条件的简单策略。您可以在上述任一策略中指定特定条件,并获得同样的结果。

Amazon IAM 和 Amazon SNS 策略之间有一项差别:通过 Amazon SNS 策略系统,您将能够向其他 Amazon Web Services 账户 授予权限,而 IAM 策略却不可以。

将由您自己决定如何是否上述两种系统管理您的权限,您可以根据自身需求做出决定。以下示例展示这两种策略系统是如何共同运行的。

例 1

在本示例中,IAM 策略和 Amazon SNS 策略均会应用于 Bob。IAM 策略向他授予对任何 Amazon Web Services 账户 账户主题进行 Subscribe 操作的权限,而 Amazon SNS 策略则向其授予仅对特定主题 (topic_xyz) 进行 Publish 操作的权限。下图阐明了这一概念。


            应用于 Bob 的 IAM 和 Amazon SNS 策略

如果 Bob 要发送对 Amazon 账户中任何主题的订阅请求,那么 IAM 策略将允许此操作。如果 Bob 要发送向 topic_xyz 发布消息的请求,那么 Amazon SNS 策略将允许此操作。

例 2

在本示例中,我们基于示例 1(其中,Bob 拥有两个适用于他的策略)来进行描述。让我们看看 Bob 无法向 topic_xyz 发布消息的情况,因此您要将其发布主题的功能全部删除。完成上述操作最简单的方法就是在所有主题中添加拒绝他访问 Publish 操作的 IAM 策略。第三项策略将覆盖 Amazon SNS 策略,该策略最初为其授予向 topic_xyz 发布的权限,覆盖的原因是显式拒绝始终覆盖允许策略(有关策略评估逻辑的更多信息,请参阅 评估逻辑)。下图阐明了这一概念。


            “Deny”策略会覆盖 Amazon SNS 策略

有关涉及 Amazon SNS 操作和资源的策略示例,请参阅 Amazon SNS 的策略示例。有关编写 Amazon SNS 策略的更多信息,请参阅 Amazon SNS 的技术文档

Amazon SNS 资源 ARN 格式

对于 Amazon SNS,主题是您可以在策略中指定的唯一资源类型。以下是主题的 Amazon Resource Name (ARN) 格式。

arn:aws:sns:region:account_ID:topic_name

有关 ARN 的更多信息,请前往 IAM 用户指南中的 ARN

以下是在 us-east-2 地区命名的 MyTopic 主题的 ARN,属于 123456789012。Amazon Web Services 账户

arn:aws:sns:us-east-2:123456789012:MyTopic

如果您 MyTopic 在 Amazon SNS 支持的每个不同区域中都有一个名为的主题,则可以使用以下 ARN 来指定主题。

arn:aws:sns:*:123456789012:MyTopic

您可以在主题名称中使用 * 和 ? 通配符。例如,以下可以参考由 Bob 创建、前缀为 bob_ 的所有主题。

arn:aws:sns:*:123456789012:bob_*

为方便起见,您创建主题时,Amazon SNS 将在响应中返回主题 ARN。

Amazon SNS API 操作

在 IAM 策略中,您可以指定任何由 Amazon SNS 提供的操作。但是,ConfirmSubscriptionUnsubscribe 操作无需验证,这表示即使您在策略中指定了上述操作,IAM 也不会限制用户访问这些操作。

您在策略中指定的所有操作必须加上小写的字符串 sns: 为前缀。例如,您可以使用 sns:* 指定所有 Amazon SNS 操作。欲了解操作列表,请前往 Amazon Simple Notification Service API 参考

Amazon SNS 策略密钥

Amazon SNS 实现以下 Amazon 范围的策略密钥,以及一些服务专用密钥。

有关每个 Amazon Web Service 支持的条件键的列表,请参阅《IAM 用户指南》中的 Amazon Web Services 的操作、资源和条件键。有关可在多个 Amazon Web Services 中使用的条件键的列表,请参阅《IAM 用户指南》中的 Amazon 全局条件上下文键

Amazon SNS 使用下列服务特定密钥。使用策略中限制访问 Subscribe 请求的这些密钥。

  • sns:endpoint—来自 Subscribe 请求或之前已确认的订阅的 URL、电子邮件地址或 ARN。通过字符串条件(请参阅 Amazon SNS 的策略示例)限制访问特定终端节点(例如 *@yourcompany.com)。

  • sns:protocol—来自 Subscribe 请求或之前已确认的订阅的 protocol 值。与字符串条件一起使用(请参阅 Amazon SNS 的策略示例),以限制向特定传输协议发布消息(例如,https)。

Amazon SNS 的策略示例

本节演示几个控制用户访问 Amazon SNS 的单一策略。

注意

未来,根据策略陈述的目标,Amazon SNS 可能会添加在逻辑上包含以下策略之一的新操作。

例 1:允许群组创建和管理主题

在本示例中,我们创建授权访问 CreateTopicListTopicsSetTopicAttributesDeleteTopic 的策略。

{ "Statement": [{ "Effect": "Allow", "Action": ["sns:CreateTopic", "sns:ListTopics", "sns:SetTopicAttributes", "sns:DeleteTopic"], "Resource": "*" }] }
例 2:允许 IT 群组向特定主题发布消息

在本示例中,我们为 IT 创建群组,并将授权访问 Publish 的策略分配至相关特定主题上。

{ "Statement": [{ "Effect": "Allow", "Action": "sns:Publish", "Resource": "arn:aws:sns:*:123456789012:MyTopic" }] }
例 3:向 Amazon Web Services 账户 中的用户赋予订阅主题的能力

在示例中,我们创建授予访问 Subscribe 操作的权限的策略,以及针对 sns:Protocolsns:Endpoint 策略密钥的字符串匹配条件。

{ "Statement": [{ "Effect": "Allow", "Action": ["sns:Subscribe"], "Resource": "*", "Condition": { "StringLike": { "SNS:Endpoint": "*@example.com" }, "StringEquals": { "sns:Protocol": "email" } } }] }
例 4:允许合作伙伴向特定主题发布消息

您可以利用 Amazon SNS 策略或 IAM 策略允许一位合作伙伴发布到特定主题。如果合作伙伴拥有 Amazon Web Services 账户,这样会比使用 Amazon SNS 策略简单。但是,合作伙伴公司的任何拥有 Amazon 安全凭证的人也可以向主题发布消息。本示例假设您想要对特定人员进行访问限制(或应用程序限制)。要实现上述目的,您需要像对待您公司内的用户一样对待合作伙伴,并使用 IAM 策略而非 Amazon SNS 策略。

在此示例中,我们创建了一个名 WidgetCo 为代表合作伙伴公司的群组;我们为合作伙伴公司中需要访问权限的特定人员(或应用程序)创建一个用户;然后将该用户放入该群组。

然后,我们附加一个策略,授予该群组对名为的特定主题的Publish访问权限WidgetPartnerTopic

我们还想阻止该 WidgetCo 小组对主题进行任何其他操作,因此我们添加了一份声明,拒绝允许除以外的任何主题以外Publish的任何其他主题进行任何 Amazon SNS 操作。 WidgetPartnerTopic只有在系统中的其他地方存在广泛策略(该策略向用户授予广泛访问 Amazon SNS 的权限)时,才需要执行此操作。

{ "Statement": [{ "Effect": "Allow", "Action": "sns:Publish", "Resource": "arn:aws:sns:*:123456789012:WidgetPartnerTopic" }, { "Effect": "Deny", "NotAction": "sns:Publish", "NotResource": "arn:aws:sns:*:123456789012:WidgetPartnerTopic" } ] }