本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
在 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 的权限。
注意
上述示例显示了不带任何条件的简单策略。您可以在上述任一策略中指定特定条件,并获得同样的结果。
AWS IAM和亚马逊SNS政策之间有一个区别:亚马逊SNS政策系统允许您向其他人授予权限 AWS 账户,而该IAM政策不允许您向其他人授予权限。
将由您自己决定如何是否上述两种系统管理您的权限,您可以根据自身需求做出决定。以下示例展示这两种策略系统是如何共同运行的。
例 1
在此示例中,IAM政策和 Amazon SNS 政策都适用于 Bob。该IAM政策授予他Subscribe
关于任何主题 AWS 账户的权限,而亚马逊SNS政策则授予他在特定主题Publish
上使用的权限 (topic_xyz)。下图阐明了这一概念。
如果 Bob 发送订阅 AWS 账户中任何主题的请求,则IAM策略将允许该操作。如果 Bob 向 topic_xyz 发送发布消息的请求,则亚马逊的SNS政策将允许该操作。
例 2
在本示例中,我们基于示例 1(其中,Bob 拥有两个适用于他的策略)来进行描述。让我们看看 Bob 无法向 topic_xyz 发布消息的情况,因此您要将其发布主题的功能全部删除。最简单的方法是添加一个IAM策略,拒绝他访问所有主题的Publish
操作。第三项政策取代了最初允许他向 topic_xyz 发布内容的 Amazon SNS 政策,因为明确拒绝总是优先于允许(有关策略评估逻辑的更多信息,请参阅)。评估逻辑下图阐明了这一概念。
有关涵盖 Amazon SNS 操作和资源的政策示例,请参阅亚马逊政策示例 SNS。有关撰写亚马逊SNS政策的更多信息,请访问亚马逊技术文档SNS
Amazon SNS 资源ARN格式
对于 AmazonSNS,主题是您可以在策略中指定的唯一资源类型。以下是主题的 Amazon 资源名称 (ARN) 格式。
arn:aws:sns:region
:account_ID
:topic_name
有关的更多信息ARNs,请转至ARNs《IAM用户指南》。
以下是在 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 提供的任何操作。但是,ConfirmSubscription
和Unsubscribe
操作不需要身份验证,这意味着即使您在策略中指定了这些操作,也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:允许群组创建和管理主题
在本示例中,我们创建授权访问 CreateTopic
、ListTopics
、SetTopicAttributes
和 DeleteTopic
的策略。
{ "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:Protocol
和 sns: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" } ] }