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

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

Amazon SNS 访问控制的示例案例

本节描述了针对访问控制的几个典型使用案例示例。

授予对主题的 Amazon Web Services 账户 访问权限

假设您在 Amazon 中有一个主题SNS,并且您想允许一个或多个 Amazon Web Services 账户 主题对该主题执行特定操作,例如发布消息。您可以使用 Amazon SNS API 操作来完成此操作AddPermission

AddPermission操作允许您指定主题、列表 Amazon Web Services 账户 IDs、操作列表和标签。SNS然后,Amazon 会自动生成新的政策声明,并将其添加到该主题的访问控制策略中。您无需自己撰写政策声明,亚马逊会为您SNS处理。如果您以后需要删除该策略,则可以通过致电RemovePermission并提供您在添加权限时使用的标签来实现。

例如,如果您调用 AddPermission arn: aws: sns: us-east-2:444455556666:,MyTopic指定 ID Amazon Web Services 账户 1111-2222-3333 Publish、操作和标签,亚马逊将生成以下策略声明并将其插入到该主题的访问控制策略中:grant-1234-publishSNS

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

添加此声明后, Amazon Web Services 账户 1111-2222-3333 将有权向该主题发布消息。

其他信息:

  • 自定义策略管理:虽然AddPermission可以方便地授予权限,但对于更复杂的场景,例如添加条件或向特定IAM角色或服务授予权限,手动管理主题的访问控制策略通常很有用。为此,您可以使用SetTopicAttributesAPI直接更新策略属性。

  • 安全最佳实践:在授予权限时要谨慎行事,确保只有受信任的实体 Amazon Web Services 账户 或实体才能访问您的 Amazon SNS 主题。定期审查和审核您的主题所附的政策,以维护安全性。

  • 政策限制:请记住,Amazon SNS 政策的规模和复杂性有限制。如果您需要添加许多权限或复杂条件,请确保您的策略保持在这些限制范围内。

将订阅限制为 HTTPS

要将您的 Amazon SNS 主题的通知传送协议限制为HTTPS,您必须创建自定义策略。Amazon 中的AddPermission操作SNS不允许您在授予主题访问权限时指定协议限制。因此,您需要手动编写强制执行此限制的策略,然后使用SetTopicAttributes操作将该策略应用于您的主题。

您可以通过以下方式创建政策,将订阅限制为HTTPS:

  1. 撰写政策。该策略必须指定您要授予访问权限的 Amazon Web Services 账户 ID,并强制执行仅允许HTTPS订阅的条件。以下是一个策略示例,它授予 Amazon Web Services 账户 ID 1111-2222-3333 订阅该主题的权限,但前提是使用的协议是。HTTPS

    { "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" } } }] }
  2. 应用政策。使用 Amazon 中的SetTopicAttributes操作SNSAPI将此政策应用于您的主题。将主题的Policy属性设置为您创建的JSON策略。

    snsClient.setTopicAttributes(SetTopicAttributesRequest.builder() .topicArn("arn:aws:sns:us-east-2:444455556666:MyTopic") .attributeName("Policy") .attributeValue(jsonPolicyString) // The JSON policy as a string .build());

其他信息:

  • 自定义访问控制。这种方法允许您实施更精细的访问控制,例如限制订阅协议,而光靠AddPermission操作是不可能的。自定义策略为需要特定条件(例如协议强制执行或 IP 地址限制)的场景提供了灵活性。

  • 安全最佳实践。限制订阅HTTPS可以确保传输中的数据经过加密,从而增强通知的安全性。定期查看您的主题政策,确保它们符合您的安全和合规性要求。

  • 政策测试。在生产环境中应用策略之前,请在开发环境中对其进行测试,以确保其行为符合预期。这有助于防止意外访问问题或意外限制。

将消息发布到 Amazon SQS 队列

要将来自您的亚马逊SNS主题的消息发布到亚马逊SQS队列,您需要在亚马逊SQS队列上配置正确的权限。虽然亚马逊SNS和亚马逊都SQS使用 Amazon访问控制策略语言,但您必须在亚马逊SQS队列上明确设置策略,以允许从亚马逊SNS主题发送消息。

您可以通过使用SetQueueAttributes操作将自定义策略应用于 Amazon SQS 队列来实现此目的。与亚马逊不同SNS,亚马逊SQS不支持创建带有条件的政策声明的AddPermission操作。因此,您必须手动编写策略。

以下是授予亚马逊向您的队列发送消息的SNS权限的亚马逊SQS政策示例。请注意,此政策与亚马逊SQS队列相关联,而不是与亚马逊SNS主题相关联。指定的操作是亚马逊SQS操作,资源是队列的亚马逊资源名称 (ARN)。您可以使用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条件根据所发送消息的来源限制对SQS队列的访问权限。这样可以确保只允许将来自指定SNS主题(在本例中为 arn: aws: sns: us-east-2:444455556666:)的消息传送到队列。MyTopic

其他信息:

  • 队列ARN。确保使用GetQueueAttributes操作检索正确ARN的 Amazon SQS 队列。这ARN对于设置正确的权限至关重要。

  • 安全最佳实践。设置策略时,请始终遵循最低权限原则。仅向亚马逊SNS主题授予与亚马逊SQS队列进行交互的必要权限,并定期查看您的政策,确保政策的有效 up-to-date 性和安全性

  • Amazon 中的默认政策SNS。与某些误解相反,Amazon SNS 不会自动授予允许其他人 Amazon Web Services 服务 访问新创建主题的默认策略。您必须明确定义并附加策略以控制对您的 Amazon SNS 主题的访问权限。

  • 测试和验证。设置策略后,通过向亚马逊SNS主题发布消息并验证消息是否已成功传送到亚马逊SQS队列来测试集成。这有助于确认策略的配置是否正确。

允许 Amazon S3 事件通知发布到主题

要允许另一个 Amazon Web Services 账户 Amazon S3 存储桶向您的亚马逊SNS主题发布事件通知,您需要相应地配置该主题的访问策略。这包括编写自定义策略,向特定的 Amazon S3 服务授予权限, Amazon Web Services 账户 然后将此策略应用于您的 Amazon SNS 主题。

您可以通过以下方式进行设置:

  1. 撰写政策。该政策应授予 Amazon S3 服务 (s3.amazonaws.com) 发布到您的 Amazon SNS 主题的必要权限。您将使用SourceAccount条件来确保只有拥有 Amazon S3 存储桶的指定 Amazon Web Services 账户人员才能向您的主题发布通知。

    下面是一个策略示例:

    { "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" } } }] }
    • 话题所有者 — 111122223333 是拥有亚马逊话题 Amazon Web Services 账户 的 ID。SNS

    • 亚马逊 S3 存储桶所有者 — 444455556666 是 Amazon Web Services 账户 拥有发送通知的亚马逊 S3 存储桶的 ID。

  2. 应用政策。使用SetTopicAttributes操作针对您的 Amazon SNS 主题设置此政策。这将更新主题的访问控制,使其包含您的自定义策略中指定的权限。

    snsClient.setTopicAttributes(SetTopicAttributesRequest.builder() .topicArn("arn:aws:sns:us-east-2:111122223333:MyTopic") .attributeName("Policy") .attributeValue(jsonPolicyString) // The JSON policy as a string .build());

其他信息:

  • 使用SourceAccount条件。SourceAccount条件可确保只有源自指定 Amazon Web Services 账户 (在本例中为 444455556666)的事件才能触发亚马逊主题。SNS这是一项安全措施,可防止未经授权的账户向您的主题发送通知。

  • 其他服务支持SourceAccount以下服务支持该SourceAccount条件。当您想要根据原始账户限制对您的 Amazon SNS 主题的访问时,使用此条件至关重要。

    • 亚马逊API网关

    • Amazon CloudWatch

    • Amazon DevOps Guru

    • Amazon ElastiCache

    • Amazon EventBridge

    • Amazon GameLift

    • 亚马逊 Pinpoint SMS 和语音 API

    • Amazon RDS

    • Amazon Redshift

    • Amazon S3 Glacier

    • Amazon SES

    • Amazon Simple Storage Service

    • Amazon CodeCommit

    • Amazon Directory Service

    • Amazon Lambda

    • Amazon Systems Manager Incident Manager

  • 测试和验证。应用策略后,通过在 Amazon S3 存储桶中触发事件并确认该事件已成功发布到您的 Amazon SNS 主题来测试设置。这将有助于确保您的策略配置正确。

  • 安全最佳实践。定期审查和审核您的 Amazon SNS 主题政策,确保它们符合您的安全要求。仅限可信账户和服务访问权限对于维护安全运营至关重要。

允许 Amazon SES 向其他账户拥有的主题发布内容

您可以 Amazon Web Services 服务 允许其他人发布他人拥有的主题 Amazon Web Services 账户。假设您登录了 111122223333 账户,打开了SES亚马逊,并创建了一封电子邮件。要向 444455556666 账户拥有的亚马逊SNS主题发布有关此电子邮件的通知,您需要创建如下政策。为此,您需要提供有关委托人(其他服务)和每个资源的所有权的信息。该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" } } } ] }

向 Amazon 发布活动时SNS,以下服务支持aws:SourceOwner

  • 亚马逊API网关

  • Amazon CloudWatch

  • Amazon DevOps Guru

  • Amazon ElastiCache

  • Amazon GameLift

  • 亚马逊 Pinpoint SMS 和语音 API

  • Amazon RDS

  • Amazon Redshift

  • Amazon SES

  • Amazon CodeCommit

  • Amazon Directory Service

  • Amazon Lambda

  • Amazon Systems Manager Incident Manager

aws:SourceAccountaws:SourceOwner

重要

aws:SourceOwner已弃用,新服务SNS只能通过aws:SourceArnaws:SourceAccount与 Amazon 集成。对于目前支持的现有服务,Amazon SNS 仍保持向后兼容性aws:SourceOwner

aws:SourceAccountaws:SourceOwner条件键均由某些人在发布到 Amazon SNS 主题 Amazon Web Services 服务 时设置。如果支持,则该值将是服务代表其发布数据的 12 位 Amazon 账户 ID。一些服务支持其中一项,一些服务支持另一项。

允许组织中的账户 Amazon Organizations 向其他账户中的主题发布内容

该 Amazon Organizations 服务可帮助您集中管理账单,控制访问权限和安全性,并在整个系统中共享资源 Amazon Web Services 账户。

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

在此示例中,组织 Amazon Web Services 账户 中的任何成员都myOrgId可以在账户MyTopic中向 Amazon 发布SNS主题444455556666。该策略使用 aws:PrincipalOrgID 全局条件键检查组织 ID 值。

{ "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 警报发布到账户中的亚马逊SNS主题444455556666

{ "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 主题

在这种情况下,账户 44455556666 中的主题只能从带有 ID 的终端节点发布。VPC vpce-1ab2c34d

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