Amazon SNS 访问控制的示例案例 - Amazon Simple Notification Service

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

Amazon SNS 访问控制的示例案例

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

授予对主题的 AWS 账户 访问权限

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

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

例如,如果您调用 AddPermission arn: aws: sns: us-east-2:444455556666:,MyTopic指定 ID AWS 账户 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" }] }

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

其他信息:

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

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

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

将订阅限制为 HTTPS

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

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

  1. 撰写政策。该策略必须指定您要授予访问权限的 AWS 账户 ID,并强制执行仅允许HTTPS订阅的条件。以下是一个策略示例,它授予 AWS 账户 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使用 AWS访问控制策略语言,但您必须在亚马逊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 不会自动授予允许其他人 AWS 服务 访问新创建主题的默认策略。您必须明确定义并附加策略以控制对您的 Amazon SNS 主题的访问权限。

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

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

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

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

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

    下面是一个策略示例:

    { "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 是拥有亚马逊话题 AWS 账户 的 ID。SNS

    • 亚马逊 S3 存储桶所有者 — 444455556666 是 AWS 账户 拥有发送通知的亚马逊 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条件可确保只有源自指定 AWS 账户 (在本例中为 444455556666)的事件才能触发亚马逊主题。SNS这是一项安全措施,可防止未经授权的账户向您的主题发送通知。

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

    • 亚马逊API网关

    • Amazon CloudWatch

    • Amazon DevOps Guru

    • Amazon EventBridge

    • Amazon GameLift

    • 亚马逊 Pinpoint SMS 和语音 API

    • Amazon RDS

    • Amazon Redshift

    • Amazon S3 Glacier

    • Amazon SES

    • Amazon Simple Storage Service

    • AWS CodeCommit

    • AWS Directory Service

    • AWS Lambda

    • AWS Systems Manager Incident Manager

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

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

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

您可以 AWS 服务 允许其他人发布他人拥有的主题 AWS 账户。假设您登录了 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 GameLift

  • 亚马逊 Pinpoint SMS 和语音 API

  • Amazon RDS

  • Amazon Redshift

  • Amazon SES

  • AWS CodeCommit

  • AWS Directory Service

  • AWS Lambda

  • AWS Systems Manager Incident Manager

aws:SourceAccountaws:SourceOwner

重要

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

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

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

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

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

在此示例中,组织 AWS 账户 中的任何成员都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 主题

在这种情况下,账号 444455556666 中的主题只能从带有 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" } } }] }