Amazon Simple Notification Service
开发人员指南 (API Version 2010-03-31)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

控制用户访问您的 AWS 账户

Amazon Simple Notification Service 集成了 AWS Identity and Access Management (IAM),让您可以指定 AWS 账户中的用户可以使用 Amazon SNS 资源执行的 Amazon SNS 操作。您可以指定策略中的特定主题。例如,您可以使用变量创建一项策略,向您机构中的特定用户授予权限,允许其通过您的 AWS 账户中的特定主题执行 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 策略仅对您 AWS 账户中的用户起到限制访问的作用,对其他 AWS 账户则没有限制作用。

您可对特定主题使用 Amazon SNS 策略,限制谁能使用该主题(例如,谁能向主题发布消息,谁能向它进行订阅等等)Amazon SNS 策略允许访问其他 AWS 账户,或访问您自己 AWS 账户内的用户。

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

 等效的 IAM 和 Amazon SNS 策略

注意

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

AWS IAM 和 Amazon SNS 策略之间有一项差别:通过 Amazon SNS 策略系统,您将获得向其他 AWS 账户提供许可的权限,而 IAM 策略却不可以。

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

例 1

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

 应用于 Bob 的 IAM 和 Amazon SNS 策略

如果 Bob 要发送对 AWS 账户中任何主题的订阅请求,那么 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) 格式。

Copy
arn:aws:sns:region:account_ID:topic_name

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

以下为 us-east-1 区域中名为 my_topic 主题的 ARN,属于 AWS 账户 123456789012。

Copy
arn:aws:sns:us-east-1:123456789012:my_topic

如果您拥有不同区域内名称为 my_topic 的主题,并受到 Amazon SNS 支持,那么您可以通过以下 ARN 指定主题。

Copy
arn:aws:sns:*:123456789012:my_topic

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

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

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

Amazon SNS 操作

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

您在策略中指定的所有操作必须加上小写的字符串 sns: 为前缀。例如,您可以使用 sns:* 指定所有 Amazon SNS 操作。有关操作列表的信息,请进入 Amazon Simple Notification Service API Reference

Amazon SNS 密钥

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

有关每个 AWS 服务支持的上下文键的列表以及 AWS 范围的策略键的列表,请参阅 IAM 用户指南 中的 AWS 服务操作和条件上下文键可用的全局条件键

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

  • sns:Endpoint –来自Subscribe请求或之前已确认的订阅的 URL,电子邮箱或 Amazon 资源名称。通过字符串条件(参阅 Amazon SNS 策略示例)限制访问特定终端节点(例如 *@yourcompany.com)。

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

Amazon SNS 策略示例

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

注意

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

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

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

Copy
{ "Version":"2012-10-17", "Statement":[{ "Effect":"Allow", "Action":["sns:CreateTopic","sns:ListTopics","sns:SetTopicAttributes","sns:DeleteTopic"], "Resource":"*" } ] }

例 2:允许 IT 群组向特定主题发布消息

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

Copy
{ "Version":"2012-10-17", "Statement":[{ "Effect":"Allow", "Action":"sns:Publish", "Resource":"arn:aws:sns:*:123456789012:topic_xyz" } ] }

例 3:向 AWS 账户中的用户赋予订阅主题的能力

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

Copy
{ "Version":"2012-10-17", "Statement":[{ "Effect":"Allow", "Action":["sns:Subscribe"], "Resource":"*", "Condition":{ "StringLike": { "SNS:Endpoint":"*@yourcompany.com" }, "StringEquals":{ "sns:Protocol":"email" } } } ] }

例 4:允许合作伙伴向特定主题发布消息

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

对于本示例,我们创建了名为 WidgetCo 的群组,其代表合作伙伴公司;我们还为需要访问权限的合作伙伴公司特定人员(应用程序)创建了用户;然后,我们将用户添加进群组。

随后我们将提供群组 Publish 访问权限的策略附加在名为 WidgetPartnerTopic 的特定主题中。

我们还需要阻止 WidgetCo 群组对主题以外的目标执行其他操作,因此我们添加一个语句,拒绝对 WidgetPartnerTopic 之外的其他任何主题执行 Publish 之外的其他任何 Amazon SNS 操作。只有在系统中的其他地方存在广泛策略(该策略向用户授予广泛访问 Amazon SNS 的权限)时,才需要执行此操作。

Copy
{ "Version":"2012-10-17", "Statement":[{ "Effect":"Allow", "Action":"sns:Publish", "Resource":"arn:aws:sns:*:123456789012:WidgetPartnerTopic" }, { "Effect":"Deny", "NotAction":"sns:Publish", "NotResource":"arn:aws:sns:*:123456789012:WidgetPartnerTopic" } ] }

使用临时安全证书

除了创建有其自己的安全证书的 IAM 用户之外,IAM 还可以让您给任何用户授予临时安全证书,从而使此用户可以访问您的 AWS 服务和资源。您可以管理有 AWS 账户的用户;这些用户是 IAM 用户。您还可以对您系统中没有 AWS 账户的用户进行管理;这些用户被称为联合用户。此外,“用户”还可以是您创建的能访问您的 AWS 资源的应用程序。

您可以使用上述临时安全证书对 Amazon SNS 发出请求。API 库会使用这些证书计算必要的签名值,以便对您的请求进行身份验证。如果您使用过期证书发送请求,那么 Amazon SNS 会拒绝该请求。

有关临时安全证书之 IAM 支持的更多信息,请转至 Using IAM 中的 Granting Temporary Access to Your AWS Resources

例 使用临时安全证书验证Amazon SNS请求

以下示例展示了如何获取临时安全证书来验证Amazon SNS请求。

Copy
http://sns.us-east-1.amazonaws.com/ ?Name=My-Topic &Action=CreateTopic &Signature=gfzIF53exFVdpSNb8AiwN3Lv%2FNYXh6S%2Br3yySK70oX4%3D &SignatureVersion=2 &SignatureMethod=HmacSHA256 &Timestamp=2010-03-31T12%3A00%3A00.000Z &SecurityToken=SecurityTokenValue &AWSAccessKeyId=Access Key ID provided by AWS Security Token Service