用于 Amazon SNS 访问控制的案例 - Amazon Simple Notification Service
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

用于 Amazon SNS 访问控制的案例

本节提供了针对访问控制的几个典型使用案例。

授权 AWS 账户访问一个主题

假设您在 Amazon SNS 系统中有一个主题。最简单的情况是,您希望让您的一个或多个 AWS 账户访问某个特定主题操作(例如,Publish)。

您可以使用 Amazon SNS API操作 AddPermission。需要一个主题,一个AWS帐户列表 IDs、操作列表和标签,并在主题的访问控制策略中自动创建新语句。这样,您不需要编写自己的策略,因为 Amazon SNS 将自动为您征程新的策略语句。随后,您能使用标签通过调用RemovePermission取消这个策略语句。

例如,如果您使用 AWS 账户 ID 1111-2222-3333、Publish 操作及标签 grant-1234-publish 对主题 arn:aws:sns:us-east-2:444455556666:MyTopic 调用 AddPermission,那么 Amazon SNS 会生成并插入以下访问控制策略语句:

{ "Statement": [{ "Sid": "grant-1234-publish", "Effect": "Allow", "Principal": { "AWS": "111122223333" }, "Action": ["sns:Publish"], "Resource": "arn:aws:sns:us-east-2:444455556666:MyTopic" }] }

添加这条语句之后,具有 AWS 账户 1111-2222-3333 的用户就可向该主题发布消息。

限制 HTTPS 订阅

在以下示例中,您可以将通知传输协议限定为 HTTPS。

当授权某人访问您的主题的权限时,您需要了解如何为该主题编写您自己的策略,因为 Amazon SNS AddPermission 操作不让您指定协议限制。这样,您可编写你自己的策略,然后使用SetTopicAttributes操作为您新的策略设置新主题Policy属性。

以下完整策略示例授权 AWS 账户 ID 1111-2222-3333 订阅一个主题的通知。

{ "Statement": [{ "Sid": "Statement1", "Effect": "Allow", "Principal": { "AWS": "111122223333" }, "Action": ["sns:Subscribe"], "Resource": "arn:aws:sns:us-east-2:444455556666:MyTopic", "Condition": { "StringEquals": { "sns:Protocol": "https" } } }] }

向 Amazon SQS 队列发布消息

在此使用案例中,您希望从您的主题发布消息至 Amazon SQS 队列。和 Amazon SNS 一样,Amazon SQS 使用 Amazon 访问控制策略语言。为了让 Amazon SNS 发送消息,您将需要使用 Amazon SQS 操作 SetQueueAttributes 在队列中设置策略。

此外,您需要了解如何编写自己的策略,因为 Amazon SQSAddPermission 操作不创建带条件的策略语句。

注意

以下展示的例子是一个 Amazon SQS 策略(对您队列的访问进行控制),而不是一个 Amazon SNS 策略(对您主题的访问进行控制)。这些操作都是 Amazon SQS 操作,并且资源是队列的 Amazon 资源名称 (ARN)。您可通过QueueArn操作检索队列的GetQueueAttributes属性决定队列的 ARN。

{ "Statement": [{ "Sid": "Allow-SNS-SendMessage", "Effect": "Allow", "Principal": { "Service": "sns.amazonaws.com" }, "Action": ["sqs:SendMessage"], "Resource": "arn:aws:sqs:us-east-2:444455556666:MyQueue", "Condition": { "ArnEquals": { "aws:SourceArn": "arn:aws:sns:us-east-2:444455556666:MyTopic" } } }] }

这种策略,根据发送到队列信息的信息来源,利用aws:SourceArn条件限制对队列的访问。仅当消息来自您自己的主题时,您才可以使用这种策略允许 Amazon SNS 向您的队列发送消息。在这种情况下,您可以指定一个特定的主题,主题的 ARN 是 arn:aws:sns:us-east-2:444455556666:MyTopic。

前述策略是您可以编写并添加到特定队列的 Amazon SQS 策略的一个例子。它将授予访问 Amazon SNS 和其他 AWS 服务的权限。Amazon SNS 为所有新创建的主题授予默认策略。默认策略授予所有其他 AWS 服务访问您的主题的权限。默认策略使用 aws:SourceArn 条件以确保 AWS 服务仅代表您拥有的 AWS 资源访问您的主题。

允许任何 AWS 资源向主题发布信息

在这种情况下,您想要配置一个主题策略以便另一个 AWS 账户资源(例如,Amazon S3 存储桶,Amazon EC2 实例或 Amazon SQS 队列)能向主题发布消息。这个样例假定您编写自己的策略然后使用SetTopicAttributes操作为您新建策略设定主题Policy的属性。

在以下示例语句中,这些策略中的主题所有者是 1111-2222-3333,AWS 资源所有者是 4444-5555-6666。该示例授权 AWS 账户 ID 4444-5555-6666 从账户拥有的任何 AWS 资源向 My-Topic 发布消息。

{ "Statement": [{ "Effect": "Allow", "Principal": { "Service": "someservice.amazonaws.com" }, "Action": "sns:Publish", "Resource": "arn:aws:sns:us-east-2:111122223333:MyTopic", "Condition": { "StringEquals": { "AWS:SourceAccount": "444455556666" } } }] }

允许 Amazon S3 存储桶向主题发布消息

在本例中,您希望配置一个主题策略以便另外一个 AWS 账户的 Amazon S3 存储桶能向您的主题发布消息。有关通过 Amazon S3 发布通知的更多信息,请转至设置存储桶事件的通知

这个样例假定您编写自己的策略然后使用SetTopicAttributes操作为您新建策略设定主题Policy的属性。

下面的示例语句使用 SourceAccount 条件,确保只有 Amazon S3 拥有者账户才能访问主题。在本例中,主题所有者是 1111-2222-3333,Amazon S3 所有者是 4444-5555-6666。示例表明,任何 Amazon S3 桶所有权 4444-5555-6666 允许发布到 MyTopic.

{ "Statement": [{ "Effect": "Allow", "Principal": { "Service": "s3.amazonaws.com" }, "Action": "sns:Publish", "Resource": "arn:aws:sns:us-east-2:111122223333:MyTopic", "Condition": { "StringEquals": { "AWS:SourceAccount": "444455556666" } } }] }

允许另一个 AWS 发布到另一个帐户拥有的主题的服务

您可以允许另一个 AWS 发布到另一个 AWS 帐户。假设您签到 111122223333 帐户,已打开 Amazon SES和创建了电子邮件。将有关此电子邮件的通知发布到 Amazon SNS 的话题 444455556666 帐户拥有,您将创建如下所示的策略。为此,您需要提供有关主体(其他服务)和每个资源所有权的信息。的 Resource 语句提供主题ARN,其中包括主题所有者的帐户ID, 444455556666. 的 "aws:SourceOwner": "111122223333" 语句指明您的帐户拥有电子邮件。

{ "Version": "2008-10-17", "Id": "__default_policy_ID", "Statement": [ { "Sid": "__default_statement_ID", "Effect": "Allow", "Principal": { "Service": "ses.amazonaws.com" }, "Action": "SNS:Publish", "Resource": "arn:aws:sns:us-east-2:444455556666:MyTopic", "Condition": { "StringEquals": { "aws:SourceOwner": "111122223333" } } } ] }

aws:SourceAccount 对比 aws:SourceOwner

aws:SourceAccountaws:SourceOwner 条件密钥类似,因为它们都标识资源所有者。本节描述了每个条件密钥与创建访问策略时何时使用每个条件密钥之间的差异 Amazon SNS 主题。

当您从创建主题时 Amazon SNS 控制台,默认策略使用 aws:SourceOwner 条件键,以便仅允许主题所有者发布和订阅主题。的值 aws:SourceOwner 是主题所有者。在更高级的访问策略中,使用条件键,如下所示:

  • 使用 aws:SourceAccount 为其他帐户配置发布和订阅主题的条件。

  • 使用 aws:SourceOwner 允许发布来自另一个 AWS 服务。使用上述示例指定其他服务资源和 Amazon SNS 主题。

允许 AWS 组织中的账户发布到其他账户中的主题

AWS Organizations 服务可帮助您集中管理账单、控制访问权限和安全性以及跨 AWS 账户共享资源。

您可以在 Organizations 控制台中找到您的组织 ID。有关更多信息,请参阅从主账户查看组织的详细信息

在这个例子, AWS 组织中的帐户 myOrgId 可以发布到 Amazon SNS 主题 MyTopic 账户中 444455556666。策略使用检查组织ID值 aws:PrincipalOrgID 全局条件键。

{ "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "SNS:Publish", "Resource": "arn:aws:sns:us-east-2:444455556666:MyTopic", "Condition": { "StringEquals": { "aws:PrincipalOrgID": "myOrgId" } } } ] }

允许任何 CloudWatch 警报发布到不同账户中的主题

在这种情况下,将允许账户 111122223333 中的任何 CloudWatch 警报发布到账户 444455556666 中的 Amazon SNS 主题。

{ "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "SNS:Publish", "Resource": "arn:aws:sns:us-east-2:444455556666:MyTopic", "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:cloudwatch:us-east-2:111122223333:alarm:*" } } } ] }

仅限从特定 VPC 终端节点发布到 Amazon SNS 主题

在这种情况下,账户 444455556666 中的主题只允许从具有 ID vpc-1ab2c34d 的 VPC 终端节点发布。

{ "Statement": [{ "Effect": "Deny", "Principal": "*", "Action": "SNS:Publish", "Resource": "arn:aws:sns:us-east-2:444455556666:MyTopic", "Condition": { "StringNotEquals": { "aws:sourceVpce": "vpc-1ab2c34d" } } }] }