在 Amazon 上使用基于身份的政策 SNS - Amazon Simple Notification Service

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

在 Amazon 上使用基于身份的政策 SNS

Amazon Simple Notification Service 与 AWS Identity and Access Management (IAM) 集成,因此您可以指定您的用户 AWS 账户 可以使用亚马逊SNS资源执行哪些亚马逊SNS操作。您可以指定策略中的特定主题。例如,您可以在创建策略时使用变量,该IAM策略授予组织中的某些用户对您的特定主题使用Publish操作的权限 AWS 账户。有关更多信息,请参阅《使用IAM》指南中的策略变量

重要

将亚马逊SNS与之搭配使用IAM并不会改变您使用亚马逊的方式SNS。亚马逊SNS操作没有变化,也没有与用户和访问控制相关的新亚马逊SNS操作。

有关涵盖 Amazon SNS 操作和资源的政策示例,请参阅亚马逊政策示例 SNS

IAM和 Amazon SNS 政策合而为一

您使用IAM政策来限制用户访问Amazon SNS 操作和主题。IAM策略只能限制您 AWS 账户内的用户访问权限,而不能限制其他用户的访问权限 AWS 账户。

您可以使用针对特定主题的 Amazon SNS 政策来限制谁可以处理该主题(例如,谁可以向该主题发布消息、谁可以订阅该主题等)。Amazon SNS 政策可以向其他 AWS 账户人或您自己的用户授予访问权限 AWS 账户。

要向您的用户授予访问您的亚马逊SNS主题的权限,您可以使用IAM政策、亚马逊SNS政策或两者兼而有之。在绝大部分情况下,无论采用上述哪种方式,都可以得到同样的结果。例如,下图显示了等效的IAM政策和 Amazon SNS 政策。该IAM政策允许亚马逊对您的 AWS 账户 主题中名为 topic_xyz 的SNSSubscribe操作IAM策略已附加到用户 Bob 和 Susan(这意味着 Bob 和 Susan 拥有策略中规定的权限)。亚马逊SNS政策同样授予 Bob 和 Susan 访问 topic_x Subscribe yz 的权限。

比较一项IAM策略和一项亚马逊SNS政策,显示这两个策略都向两个用户(Bob 和 Susan)授予同等权限,允许他们订阅其中特定的亚马逊SNS主题 AWS 账户。强调的关键区别在于,Amazon SNS 策略可以向不同用户授予权限 AWS 账户,而IAM策略却不能。
注意

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

AWS IAM和亚马逊SNS政策之间有一个区别:亚马逊SNS政策系统允许您向其他人授予权限 AWS 账户,而该IAM政策不允许您向其他人授予权限。

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

例 1

在此示例中,IAM政策和 Amazon SNS 政策都适用于 Bob。该IAM政策授予他Subscribe关于任何主题 AWS 账户的权限,而亚马逊SNS政策则授予他在特定主题Publish上使用的权限 (topic_xyz)。下图阐明了这一概念。

显示IAM策略和亚马逊SNS政策如何适用于用户 Bob,该IAM策略允许他订阅中的任何主题 AWS 账户,而亚马逊SNS政策则允许他向名为 “topic_xyz” 的特定主题发布消息。该图强调了策略授予的一般权限与亚马逊IAMSNS策略针对特定主题授予的特定权限之间的区别。

如果 Bob 发送订阅 AWS 账户中任何主题的请求,则IAM策略将允许该操作。如果 Bob 向 topic_xyz 发送发布消息的请求,则亚马逊的SNS政策将允许该操作。

例 2

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

说明添加拒绝所有主题的 “发布” 操作的IAM策略如何覆盖允许用户 Bob 向特定主题 “topic_xyz” 发布内容的现有亚马逊SNS政策。IAM拒绝政策优先于亚马逊SNS政策,从而有效地阻止 Bob 发布任何主题,包括 “topic_xyz”。

有关涵盖 Amazon SNS 操作和资源的政策示例,请参阅亚马逊政策示例 SNS。有关撰写亚马逊SNS政策的更多信息,请访问亚马逊技术文档SNS

Amazon SNS 资源ARN格式

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

arn:aws:sns:region:account_ID:topic_name

有关的更多信息ARNs,请转至ARNsIAM用户指南》

以下是在 us-east-2 区域命名的 MyTopic 主题的,属ARN于 123456789012。 AWS 账户

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 会在响应ARN中SNS返回该主题的内容。

亚马逊的SNSAPI行动

在IAM政策中,您可以指定 Amazon SNS 提供的任何操作。但是,ConfirmSubscriptionUnsubscribe操作不需要身份验证,这意味着即使您在策略中指定了这些操作,也IAM不会限制用户访问这些操作。

您在策略中指定的所有操作必须加上小写的字符串 sns: 为前缀。例如,要指定所有 Amazon SNS 操作,可以使用sns:*。要查看操作列表,请访问《Amazon 简单通知服务API参考》。

亚马逊SNS政策密钥

Amazon SNS 实施了以下 AWS 广泛的策略密钥,以及一些特定于服务的密钥。

有关每个条件键支持的条件键的列表 AWS 服务,请参阅《IAM用户指南》 AWS 服务中的操作、资源和条件键。有关可以用于多个条件键的列表 AWS 服务,请参阅《IAM用户指南》中的AWS 全局条件上下文密钥

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

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

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

亚马逊政策示例 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:让用户 AWS 账户 能够订阅主题

在示例中,我们创建授予访问 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政策来允许合作伙伴针对特定主题发布内容。如果您的合作伙伴有 AWS 账户,则使用Amazon SNS 政策可能会更容易。但是,合作伙伴公司中任何拥有 AWS 安全凭证的人都可以发布有关该主题的消息。本示例假设您想要对特定人员进行访问限制(或应用程序限制)。为此,您需要像对待自己公司的用户一样对待合作伙伴,并使用IAM政策而不是亚马逊SNS政策。

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

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

我们还想阻止该 WidgetCo 小组对主题做任何其他事情,因此我们添加了一份声明,拒绝允许除Publish此之外的任何主题之外的任何亚马逊SNS操作 WidgetPartnerTopic。只有当系统中的其他地方有一项广泛的政策,允许用户广泛访问亚马逊时,才需要这样做SNS。

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