

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

# Amazon SNS 中的 Identity and Access Management
<a name="security-iam"></a>

访问 Amazon SNS 需要有 AWS 可用于验证您的请求的证书。这些证书必须具有访问 AWS 资源（例如 Amazon SNS 主题和消息）的权限。下面几部分提供详细信息来说明如何使用 [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) 和 Amazon SNS 控制谁能访问您的资源，从而对这些资源进行保护。

AWS Identity and Access Management (IAM) AWS 服务 可帮助管理员安全地控制对 AWS 资源的访问权限。IAM 管理员控制谁可以*通过身份验证*（登录）和*获得授权*（具有权限）来使用 Amazon SNS 资源。您可以使用 IAM AWS 服务 ，无需支付额外费用。

## 受众
<a name="security_iam_audience"></a>

您的使用方式 AWS Identity and Access Management (IAM) 因您的角色而异：
+ **服务用户**：如果您无法访问功能，请从管理员处请求权限（请参阅[Amazon Simple Notification Service 身份和访问故障排查](security_iam_troubleshoot.md)）
+ **服务管理员**：确定用户访问权限并提交权限请求（请参阅[Amazon SNS 如何与 IAM 配合使用](security_iam_service-with-iam.md)）
+ **IAM 管理员**：编写用于管理访问权限的策略（请参阅[适用于 Amazon Simple Notification Service 的基于身份的策略示例](security_iam_id-based-policy-examples.md)）

## 使用身份进行身份验证
<a name="security_iam_authentication"></a>

身份验证是您 AWS 使用身份凭证登录的方式。您必须以 AWS 账户 根用户、IAM 用户身份或通过担任 IAM 角色进行身份验证。

您可以使用来自身份源的证书 AWS IAM Identity Center （例如（IAM Identity Center）、单点登录身份验证或 Google/Facebook 证书，以联合身份登录。有关登录的更多信息，请参阅《AWS 登录 用户指南》**中的[如何登录您的 AWS 账户](https://docs.aws.amazon.com/signin/latest/userguide/how-to-sign-in.html)。

对于编程访问， AWS 提供 SDK 和 CLI 来对请求进行加密签名。有关更多信息，请参阅*《IAM 用户指南》*中的[适用于 API 请求的AWS 签名版本 4](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_sigv.html)。

### AWS 账户 root 用户
<a name="security_iam_authentication-rootuser"></a>

 创建时 AWS 账户，首先会有一个名为 AWS 账户 *root 用户的*登录身份，该身份可以完全访问所有资源 AWS 服务 和资源。我们强烈建议不要使用根用户进行日常任务。有关需要根用户凭证的任务，请参阅《IAM 用户指南》**中的[需要根用户凭证的任务](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html#root-user-tasks)。

### 联合身份
<a name="security_iam_authentication-federated"></a>

作为最佳实践，要求人类用户使用与身份提供商的联合身份验证才能 AWS 服务 使用临时证书进行访问。

*联合身份是指*来自您的企业目录、Web 身份提供商的用户 Directory Service ，或者 AWS 服务 使用来自身份源的凭据进行访问的用户。联合身份代入可提供临时凭证的角色。

要集中管理访问权限，建议使用。 AWS IAM Identity Center有关更多信息，请参阅《AWS IAM Identity Center 用户指南》**中的[什么是 IAM Identity Center？](https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html)。

### IAM 用户和群组
<a name="security_iam_authentication-iamuser"></a>

*[IAM 用户](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html)*是对某个人员或应用程序具有特定权限的一个身份。建议使用临时凭证，而非具有长期凭证的 IAM 用户。有关更多信息，请参阅 *IAM 用户指南*[中的要求人类用户使用身份提供商的联合身份验证才能 AWS 使用临时证书进行访问](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#bp-users-federation-idp)。

[https://docs.aws.amazon.com/IAM/latest/UserGuide/id_groups.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_groups.html)指定一组 IAM 用户，便于更轻松地对大量用户进行权限管理。有关更多信息，请参阅*《IAM 用户指南》*中的 [IAM 用户使用案例](https://docs.aws.amazon.com/IAM/latest/UserGuide/gs-identities-iam-users.html)。

### IAM 角色
<a name="security_iam_authentication-iamrole"></a>

*[IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)*是具有特定权限的身份，可提供临时凭证。您可以通过[从用户切换到 IAM 角色（控制台）](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-console.html)或调用 AWS CLI 或 AWS API 操作来代入角色。有关更多信息，请参阅《IAM 用户指南》**中的[担任角色的方法](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_manage-assume.html)。

IAM 角色对于联合用户访问、临时 IAM 用户权限、跨账户访问、跨服务访问以及在 Amazon EC2 上运行的应用程序非常有用。有关更多信息，请参阅《IAM 用户指南》**中的 [IAM 中的跨账户资源访问](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies-cross-account-resource-access.html)。

## 使用策略管理访问
<a name="security_iam_access-manage"></a>

您可以 AWS 通过创建策略并将其附加到 AWS 身份或资源来控制中的访问权限。策略定义了与身份或资源关联时的权限。 AWS 在委托人提出请求时评估这些政策。大多数策略都以 JSON 文档的 AWS 形式存储在中。有关 JSON 策略文档的更多信息，请参阅*《IAM 用户指南》*中的 [JSON 策略概述](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#access_policies-json)。

管理员使用策略，通过定义哪个**主体**可以在什么**条件**下对哪些**资源**执行哪些**操作**来指定谁有权访问什么。

默认情况下，用户和角色没有权限。IAM 管理员创建 IAM 策略并将其添加到角色中，然后用户可以担任这些角色。IAM 策略定义权限，与执行操作所用的方法无关。

### 基于身份的策略
<a name="security_iam_access-manage-id-based-policies"></a>

基于身份的策略是您附加到身份（用户、组或角色）的 JSON 权限策略文档。这些策略控制身份可以执行什么操作、对哪些资源执行以及在什么条件下执行。要了解如何创建基于身份的策略，请参阅《IAM 用户指南》**中的[使用客户管理型策略定义自定义 IAM 权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)。

基于身份的策略可以是*内联策略*（直接嵌入到单个身份中）或*托管策略*（附加到多个身份的独立策略）。要了解如何在托管策略和内联策略之间进行选择，请参阅*《IAM 用户指南》*中的[在托管策略与内联策略之间进行选择](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies-choosing-managed-or-inline.html)。

### 基于资源的策略
<a name="security_iam_access-manage-resource-based-policies"></a>

基于资源的策略是附加到资源的 JSON 策略文档。示例包括 IAM *角色信任策略*和 Amazon S3 *存储桶策略*。在支持基于资源的策略的服务中，服务管理员可以使用它们来控制对特定资源的访问。您必须在基于资源的策略中[指定主体](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html)。

基于资源的策略是位于该服务中的内联策略。您不能在基于资源的策略中使用 IAM 中的 AWS 托管策略。

### 其他策略类型
<a name="security_iam_access-manage-other-policies"></a>

AWS 支持其他策略类型，这些策略类型可以设置更常见的策略类型授予的最大权限：
+ **权限边界** – 设置基于身份的策略可以授予 IAM 实体的最大权限。有关更多信息，请参阅《 IAM 用户指南》**中的 [IAM 实体的权限边界](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html)。
+ **服务控制策略 (SCPs)**-在中指定组织或组织单位的最大权限 AWS Organizations。有关更多信息，请参阅《AWS Organizations 用户指南》**中的[服务控制策略](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html)。
+ **资源控制策略 (RCPs)**-设置账户中资源的最大可用权限。有关更多信息，请参阅《*AWS Organizations 用户指南》*中的[资源控制策略 (RCPs)](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_rcps.html)。
+ **会话策略** – 在为角色或联合用户创建临时会话时，作为参数传递的高级策略。有关更多信息，请参阅《IAM 用户指南》**中的[会话策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session)。

### 多个策略类型
<a name="security_iam_access-manage-multiple-policies"></a>

当多个类型的策略应用于一个请求时，生成的权限更加复杂和难以理解。要了解在涉及多种策略类型时如何 AWS 确定是否允许请求，请参阅 *IAM 用户指南*中的[策略评估逻辑](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html)。

## 访问控制
<a name="access-control"></a>

Amazon SNS 拥有自己的基于资源的权限系统，该系统使用以与 AWS Identity and Access Management (IAM) 策略相同的语言编写的策略。这意味着 Amazon SNS 策略与 IAM 策略的作用类似。

**注意**  
重要的是要明白，所有人 AWS 账户 都可以将其权限委托给其账户下的用户。跨账户访问允许您共享对 AWS 资源的访问，而不需要管理其他用户。有关使用跨账户访问的信息，请参阅 *IAM 用户指南*中的[启用跨账户访问](https://docs.aws.amazon.com/IAM/latest/UserGuide/Delegation.html)。

# Amazon SNS 访问控制应用场景
<a name="sns-when-to-use-access-control"></a>

对于如何授权或拒绝资源访问，您有很大的灵活性。然而，普通的使用案例都相当简单。
+ 您想向其他人授予 AWS 账户 特定类型的主题操作（例如 “发布”）。有关更多信息，请参阅 [授予对主题的 AWS 账户 访问权限](sns-access-policy-use-cases.md#sns-grant-aws-account-access-to-topic)。
+ 您希望仅对 HTTPS 协议限制主题订阅。有关更多信息，请参阅 [限制 HTTPS 订阅](sns-access-policy-use-cases.md#sns-limit-subscriptions-to-https)。
+ 您希望允许 Amazon SNS 向 Amazon SQS 队列发布消息。有关更多信息，请参阅 [发布消息到 Amazon SQS 队列](sns-access-policy-use-cases.md#sns-publish-messages-to-sqs-queue)。

# Amazon SNS 访问策略关键概念
<a name="sns-access-policy-language-key-concepts"></a>

以下章节介绍了您需要了解的概念，以便使用访问策略语言。它们都按逻辑顺序介绍，您需要了解的第一项术语在清单最前面。

## 权限
<a name="permissions"></a>

*权限*是指允许或不允许访问某种特殊资源的概念。权限基本遵循这种形式：“如果 D 适用时，那么 A 被允许或未被允许向 C 执行 B”。例如：只要 *Jane 使用 HTTP 协议*（D），那么 *Jane*（A）就可以向 *TopicA*（C）*发布*（B）消息。每当 Jane 向 TopicA 发布信息时，服务器会检查她是否有权限或该请求是否满足权限中所规定的条件。

## 语句
<a name="statement"></a>

*语句*是指对用访问策略语言编写的单个权限的正式说明。您通常编写的语句是一个更大的容器式文档，被称为*策略*（见下一概念），的一部分。

## Policy
<a name="policy"></a>

*策略*是一个文档（使用访问策略语言编写），充当存放一个或多个语句的容器。例如，策略中可能包含两个语句：一个语句规定 Jane 可以使用电子邮件协议进行订阅，另一个语句规定 Bob 不能向主题 A 发布消息。如下图所示，等效的场景将具有两个策略，一个策略规定 Jane 可以使用电子邮件协议进行订阅，另一个策略规定 Bob 不能向主题 A 发布消息。

![\[比较了在 Amazon SNS 中组织策略声明的两种方式。在左边，单个策略（策略 A）包含两个语句。在右边，相同的两个语句被分成两个策略，每个策略包含一个语句。该图说明了这两种方法在权限的定义和强制执行方面是等同的。\]](http://docs.aws.amazon.com/zh_cn/sns/latest/dg/images/AccessPolicyLanguage_Statement_and_Policy.gif)


策略文档中只允许使用 ASCII 字符。你可以利用`aws:SourceAccount`和解决`aws:SourceOwner`需要插入其他包含非 ASCII 字符 AWS ARNs 的服务的场景。请参阅 [`aws:SourceAccount` 与 `aws:SourceOwner`](sns-access-policy-use-cases.md#source-account-versus-source-owner) 之间的差异。



## Issuer
<a name="issuer"></a>

*发布者*是指编写策略以授予资源权限的人。发行者（根据定义）始终是资源所有者。 AWS 不允许 AWS 服务用户为他们不拥有的资源创建策略。如果 John 是资源所有者，则在 John 提交他为授予该资源权限而编写的策略时，将 AWS 验证他的身份。

## Principal
<a name="principal"></a>

*委托人*是指在策略中获取权限的个人和多个人。委托人是“如果 D 适用的情况下，那么 A 可以对 C 执行 B ”语句中的 A。在策略中，您可将委托人设置为“任何人”（即，您可指定一个通配符代表所有人）。您这样操作，例如，如果您不想根据请求者的实际身份限制访问，那么您可以根据其他的识别特征，例如请求者的 IP 地址。

## Action
<a name="action"></a>

*操作*是委托人可以执行的活动。操作是“如果 D 适用的情况下，那么 A 可以对 C 执行 B”语句中的 B。通常，操作只是请求中的操作 AWS。例如，Jane 使用 `Action``=Subscribe` 向 Amazon SNS 发送请求。在一个策略中您可指定一个或多个操作。

## 资源
<a name="resource"></a>

*资源*是委托人请求访问的数据元。在表述“在满足 D 的情况下，A 拥有对 C 执行 B 的许可”中，C 即指资源。

## 条件与密钥
<a name="conditions"></a>

*条件*是任何有关权限的限制条件和具体内容。条件是“如果 D 适用的情况下，那么 A 可以对 C 执行 B”语句中的 D。说明条件的策略部分可能是整个部分最详细且最复杂的内容。普通条件与以下项目相关：
+ 日期和时间（例如，请求必须在指定日期前到达）
+ IP 地址（例如，请求者的 IP 地址必须是某个特定 CIDR 范围的一部分）

一个*密钥*是设置访问限制指定的特性。例如，访问日期和时间。

您需使用*条件*和*密钥*一起明确说明限制。下列示例可帮助您以最简单的方式了解如何实际实施限制：若您要在 2010 年 5 月 30 日之前限制访问，则使用名为 `DateLessThan` 的条件。您可以使用名为 `aws:CurrentTime` 的密钥并将其设置为 `2010-05-30T00:00:00Z`。 AWS 定义您可以使用的条件和键。 AWS 服务本身（例如，Amazon SQS 或 Amazon SNS）也可能定义特定于服务的密钥。有关更多信息，请参阅 [Amazon SNS API 权限：操作和资源参考](sns-access-policy-language-api-permissions-reference.md)。

## 请求者
<a name="requester"></a>

*请求*者是向 AWS 服务发送请求并请求访问特定资源的人。请求者向其发送的请求本质上 AWS 是：“在 D 适用的情况下，你允许我对 C 执行 B 吗？”

## 评估
<a name="evaluation"></a>

*评估*是 AWS 服务根据适用的策略确定是否应拒绝或允许传入请求的流程。有关评估逻辑的信息，请查见[评估逻辑](sns-access-policy-language-evaluation-logic.md)。

## 效果
<a name="effect"></a>

*效果*是指在评估期间您希望一个策略语句返回的结果。当您在一个策略中编写语句时，您需指定该值，可能值为*拒绝*和*允许*。

例如，您可以编写一个策略，并声明*拒绝*所有来自南极洲地区的请求（效果相当于：如果请求是使用为南极洲配置的 IP 地址发出的，则拒绝该请求）。同样地，您可以编写一个策略，其中声明*允许*所有*并非*来自南极洲地区的请求（效果=如果请求不是来自南极洲地区，则允许）。虽然这两个语句看似执行相同的操作，但是在访问策略语言逻辑上，它们是不同的。有关更多信息，请参阅 [评估逻辑](sns-access-policy-language-evaluation-logic.md)。

尽管仅可指定两个效果值（“允许”或“拒绝”），但在执行策略评估时，却可能产生三种不同的结果，即：*默认拒绝*、*允许*或*显式拒绝*。有关更多详细，参见以下概念和 [评估逻辑](sns-access-policy-language-evaluation-logic.md)。

## 默认拒绝
<a name="Define_SoftDeny"></a>

*默认拒绝*是从一个策略中没有允许或显式拒绝的默认结果。

## 允许
<a name="allow"></a>

假设任何声明的条件已满足，效果=允许的语句会产生*允许*。例如：若在 2010 年 4 月 30 日下午 1:00 之前收到请求，则请求将获得允许。“允许”可置换所有“默认拒绝”，但无法置换“显式拒绝”。

## 显式拒绝
<a name="Define_HardDeny"></a>

假设任何声明的条件已满足，效果=拒绝的语句会产生*显式拒绝*。例如：拒绝来自南极洲的所有请求。不管其他什么策略会允许，所有来自南极洲地区的请求都会被拒绝。

# Amazon SNS 访问控制架构概述
<a name="sns-access-policy-language-architectural-overview"></a>

下列图和表格介绍了为您提供资源访问控制的相互作用的主要组成部分。

![\[AWS 服务中的访问控制流程。它显示了作为资源所有者的您如何通过策略管理您的资源（例如 Amazon SQS 队列）。这些策略由 AWS 服务的访问策略语言评估代码进行评估，以确定是应允许还是拒绝请求者的传入请求访问资源。该图包含与资源所有者、资源、策略、传入请求和评估逻辑相对应的编号元素。\]](http://docs.aws.amazon.com/zh_cn/sns/latest/dg/images/AccessPolicyLanguage_Arch_Overview.gif)



|  |  | 
| --- |--- |
| 1 |  您，资源所有者。  | 
| 2 |  您的资源（包含在 AWS 服务中；例如，Amazon SQS 队列）。  | 
| 3 |  您的策略。 通常情况下，每个资源拥有一个策略，虽然您可以有多个。该 AWS 服务本身提供了一个 API，您可以用来上传和管理您的政策。  | 
| 4 |  请求者及其对 AWS 服务的传入请求。  | 
| 5 |  访问策略语言评估代码。 这是 AWS 服务中的一组代码，用于根据适用的策略评估传入的请求，并确定是否允许请求者访问资源。有关产品如何做出决定的信息，请参见 [评估逻辑](sns-access-policy-language-evaluation-logic.md)。  | 

# 在 Amazon SNS 中使用访问策略语言
<a name="sns-access-policy-language-using"></a>

下面的图表介绍了访问控制与访问策略语言协作的一般过程。

![\[如何在 AWS中将访问控制与访问策略语言结合使用的 6 个步骤。首先是为您的资源编写策略，将其添加到系统中，然后进入请求者提出请求的各个阶段， AWS 服务 评估适用的策略，最后是服务根据评估结果批准或拒绝请求。\]](http://docs.aws.amazon.com/zh_cn/sns/latest/dg/images/AccessPolicyLanguage_Basic_Flow.gif)



**将访问控制与访问策略语言一起使用的过程**  

|  |  | 
| --- |--- |
|  1  |  为您的资源编写一个策略。 例如，您编写策略为 Amazon SNS 主题指定权限。  | 
|  2  |  您将保单上传到 AWS。 该 AWS 服务本身提供了一个用于上传政策的 API。例如，您使用 Amazon SNS `SetTopicAttributes` 操作为特定的 Amazon SNS 主题上载策略。  | 
|  3  |  某人向您发出使用您的资源的请求。 例如，某用户向 Amazon SNS 发送使用您的一个主题的请求。  | 
|  4  |  该 AWS 服务决定哪些策略适用于该请求。 例如，Amazon SNS 将查看所有可用的 Amazon SNS 策略，并确定哪些策略适用（基于资源是什么、请求者是谁等）。  | 
|  5  |  该 AWS 服务对策略进行评估。 例如，Amazon SNS 将对策略进行评估，确定是否允许请求者使用您的主题。有关决策逻辑的信息，请参见[评估逻辑](sns-access-policy-language-evaluation-logic.md)。  | 
|  6  |  该 AWS 服务要么拒绝请求，要么继续处理请求。 例如，根据策略评估结果，服务将返回一个“访问被拒绝”的错误信息给请求者，或继续处理该请求。  | 

# 评估逻辑
<a name="sns-access-policy-language-evaluation-logic"></a>

评价期间的目的是为了确定应该允许还是拒绝授予请求。评估逻辑遵循多个基本规则：
+ 在默认情况下，除了您，任何人提出使用您资源的请求均会被拒绝。
+ 一个允许可以超控任何其他默认拒绝
+ 一个显式拒绝可以超控任何允许
+ 策略评估的顺序不重要

以下流程图和讨论更加详细地描述了如何做出决定。

![\[说明了 AWS 用于确定应允许还是拒绝访问资源的请求的决策过程。它以默认拒绝开始，检查适用策略中是否存在任何显式拒绝，然后查找任何允许指令，最后，如果未找到允许，则默认情况下拒绝请求。\]](http://docs.aws.amazon.com/zh_cn/sns/latest/dg/images/AccessPolicyLanguage_Evaluation_Flow.gif)



|  |  | 
| --- |--- |
| 1 |  决定开始是一个默认拒绝。  | 
| 2 |   然后执行代码将评估适用于请求的所有策略（根据资源、委托人、操作和条件）。 执行代码评估策略的顺序不重要。  | 
| 3 |   在所有这些策略中，执行代码将寻找一个能适用于请求的显式拒绝指令。 即使仅找到一处，执行代码也会发回“拒绝”的决定，并结束处理流程（此为“显式拒绝”；有关更多信息，请参见 [显式拒绝](sns-access-policy-language-key-concepts.md#Define_HardDeny)）。  | 
| 4 |  如果没有找到显式拒绝，那么执行代码将寻找适用于请求的任何“允许”指令。 如果它还是找到了一个，那么执行代码将返回一个“允许”决定，且整个过程完成（服务将继续处理该请求）。  | 
| 5 |  如果没有找到允许，那么最终的决定将是“拒绝”，因为没有显式拒绝或允许，所以这将被视为是一个*默认拒绝*（有关更多信息，请参见[默认拒绝](sns-access-policy-language-key-concepts.md#Define_SoftDeny)）。  | 

## 显式拒绝和默认拒绝的相互作用
<a name="denials"></a>

如果策略不直接适用于请求，那么策略将产生一个默认拒绝。例如，如果用户请求使用 Amazon SNS，但该主题的策略根本没有提及该用户的 AWS 账户 政策，则该策略会导致默认拒绝。

如果一个语句中的某个条件未被满足，那么策略将产生一个默认拒绝。如果语句中的所有条件都满足，那么根据策略中的效果元素的值，策略或许会产生允许，或许会产生显式拒绝。如果一个条件未被满足，策略没有指定如何处理，那么在那种情况下默认值将产生一个默认拒绝。

例如，假设您想要阻止来自南极洲地区的请求进入。只要请求不是来自于南极洲地区，您编写的策略（称作策略 A1）将允许接受请求。下列示意图说明了该策略。

![\[说明了一个策略（策略 A1），如果请求不是来自于南极洲地区，该策略会允许接受请求。它显示的条件是，请求不得来自南极洲才能生成“允许”效果；否则，默认操作是拒绝请求。\]](http://docs.aws.amazon.com/zh_cn/sns/latest/dg/images/AccessPolicyLanguage_Allow_Override_1.gif)


如果某人从美国发出请求，那么条件已经满足 (该请求不是来自南极洲)。因此，该请求将被允许。但是，如果某人从南极洲地区发出请求，那么条件未满足，因此策略结果将是默认拒绝。

您可通过按照下列示意图重新编写策略（称作策略 A2）将结果转变为一个显式拒绝。此时，如果请求是来自南极洲地区，那么策略将明确拒绝该请求。

![\[说明了明确拒绝来自南极洲的请求的策略（策略 A2）。它表明，当条件得到满足（请求来自南极洲）时，该策略的结果是显式拒绝，这意味着在此类情况下，请求总是被拒绝。\]](http://docs.aws.amazon.com/zh_cn/sns/latest/dg/images/AccessPolicyLanguage_Allow_Override_2.gif)


如果某人从南极洲发出请求，那么条件已经满足，策略的结果将是一个显式拒绝。

默认拒绝和显式拒绝的区别很重要，因为默认拒绝可以被允许覆盖，但显式拒绝就不能。例如，假设有另一个策略，允许在 2010 年 6 月 1 日到达的请求。那么，与限制从南极洲访问的策略相结合，该策略将如何对总体结果产生影响？ 当将按日期要求设置的策略与上述策略 A1 和 A2 相结合时，我们将对比综合结果。方案 1 是将策略 A1 与策略 B 相结合，方案 2 是将策略 A2 与策略 B 相结合。以下图表和讨论显示了如果于 2010 年 6 月 1 日从南极洲区域发出请求输入时的结果。

![\[比较了两种场景，其中策略根据请求的来源（南极洲）和请求日期（2010 年 6 月 1 日）限制访问权限。在场景 1 中，策略组合会导致默认拒绝被允许覆盖，允许请求。在场景 2 中，一个策略的显式拒绝会覆盖另一个策略的允许，从而导致请求被拒绝。\]](http://docs.aws.amazon.com/zh_cn/sns/latest/dg/images/AccessPolicyLanguage_Allow_Override.gif)


在方案 1 中，策略 A1 将返回一个默认拒绝，如本节之前所描述的那样。Policy B 返回“允许”结果，因为该策略（依照定义）允许在 2010 年 6 月 1 日发送请求。Policy B 返回的“允许”结果将置换 Policy A1 的“默认拒绝”结果，因此，请求获得允许。

在方案 2 中，策略 A2 返回了一个显式拒绝，如本节之前所描述的那样。此外，策略 B 返回了一个允许。从策略 A2 发出的显式拒绝将超控从策略 B 发出的允许，因此该请求会被拒绝。

# 用于 Amazon SNS 访问控制的示例案例
<a name="sns-access-policy-use-cases"></a>

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

## 授予对主题的 AWS 账户 访问权限
<a name="sns-grant-aws-account-access-to-topic"></a>

假设您在 Amazon SNS 中有一个主题，并且您想允许一个或多个 AWS 账户 主题对该主题执行特定操作，例如发布消息。使用 Amazon SNS API 操作 `AddPermission` 即可做到这一点。

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

例如，如果您调用 `AddPermission` arn: aws: sns: us-east-2:444455556666:，指定 MyTopic ID 1111-2222-3333 AWS 账户 、操作`Publish`和标签，Amazon `grant-1234-publish` 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 将有权向该主题发布消息。

**其他信息：**
+ **自定义策略管理：**虽然 `AddPermission` 可以方便地授予权限，但对于更复杂的场景，例如添加条件或向特定 IAM 角色或服务授予权限，手动管理主题的访问控制策略通常很有用。为此，您可以使用 `SetTopicAttributes` API 直接更新策略属性。
+ **安全最佳实践：**在授予权限时要谨慎行事，确保只有受信任的实体 AWS 账户 或实体才能访问您的 Amazon SNS 主题。定期审查和审核您的主题所附的策略，以维护安全性。
+ **策略限制：**请记住，Amazon SNS 策略的规模和复杂性有限制。如果您需要添加许多权限或复杂条件，请确保您的策略保持在这些限制范围内。

## 限制 HTTPS 订阅
<a name="sns-limit-subscriptions-to-https"></a>

要将您的 Amazon SNS 主题的通知传送协议限制为 HTTPS，您必须创建自定义策略。Amazon SNS 中的 `AddPermission` 操作不允许您在授予主题访问权限时指定协议限制。因此，您需要手动编写强制执行此限制的策略，然后使用 `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"
         }
       }
     }]
   }
   ```

1. **应用策略**。使用 Amazon SNS API 中的 `SetTopicAttributes` 操作将此策略应用于您的主题。将主题的 `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 队列
<a name="sns-publish-messages-to-sqs-queue"></a>

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

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

以下是 Amazon SQS 策略的示例，该策略授予对 Amazon SNS 向队列发送消息的权限。请注意，此策略与 Amazon SQS 队列有关，与 Amazon SNS 主题无关。这些指定操作都是 Amazon SQS 操作，并且资源是队列的 Amazon 资源名称（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` 操作检索 Amazon SQS 队列的正确 ARN。此 ARN 对于设置正确的权限至关重要。
+ **安全最佳实践。**设置策略时，请始终遵循最低权限原则。仅向 Amazon SNS 主题授予与 Amazon SQS 队列进行交互的必要权限，并定期查看您的政策，确保其有效且安全 up-to-date
+ **Amazon SNS 中的默认策略。**Amazon SNS 不会自动授予允许其他 AWS 服务 或账户访问新创建主题的默认策略。默认情况下，Amazon SNS 主题是在没有权限的情况下创建的，这意味着它们是私有的，只有创建它们的账户才能访问。要为其他 AWS 服务、账户或委托人启用访问权限，您必须明确定义访问策略并将其附加到该主题。这符合最低权限原则，确保默认情况下不会授予任何意外访问权限。
+ **测试和验证。**设置策略后，通过将消息发布到 Amazon SNS 主题并验证消息是否已成功传送到 Amazon SQS 队列来测试集成。这有助于确认策略配置是否正确。

## 允许 Amazon S3 事件通知发布到主题
<a name="sns-allow-s3-bucket-to-publish-to-topic"></a>

要允许另一个 Amazon S3 存储桶 AWS 账户 向您的 Amazon SNS 主题发布事件通知，您需要相应地配置该主题的访问策略。这包括编写自定义策略，向特定 AWS 账户 的 Amazon S3 服务授予权限，然后将此策略应用于您的 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 账户 拥有亚马逊 SNS 话题的 ID。
   + **亚马逊 S3 存储桶所有者** — 444455556666 是 AWS 账户 拥有发送通知的亚马逊 S3 存储桶的 ID。

1. **应用策略**。使用 `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）的事件才能触发 Amazon SNS 主题。这是一项安全措施，可防止未经授权的账户向您的主题发送通知。
+ **其他服务支持 `SourceAccount`。**以下服务支持 `SourceAccount` 条件。当您想要根据原始账户限制访问您的 Amazon SNS 主题时，使用此条件至关重要。
  + Amazon API Gateway
  + Amazon CloudWatch
  + Amazon DevOps Guru
  + Amazon EventBridge
  + 亚马逊 GameLift 服务器
  + Amazon Pinpoint SMS 和 Voice API
  + Amazon RDS
  + Amazon Redshift
  + Amazon Glacier
  + Amazon SES
  + Amazon Simple Storage Service
  + AWS CodeCommit
  + Directory Service
  + AWS Lambda
  + AWS Systems Manager Incident Manager
+ **测试和验证。**应用策略后，通过在 Amazon S3 存储桶中触发事件并确认该事件已成功发布到您的 Amazon SNS 主题来测试设置。这将有助于确保您的策略配置正确。
+ **安全最佳实践。**定期审查和审核您的 Amazon SNS 主题策略，确保它们符合您的安全要求。仅限可信账户和服务访问对于维护安全运营至关重要。

## 允许 Amazon SES 向其他账户拥有的主题发布
<a name="sns-allow-specified-service-to-publish-to-topic"></a>

您可以 AWS 服务 允许其他人发布他人拥有的主题 AWS 账户。假设您登录了 111122223333 账户，打开了 Amazon SES 并创建了一封电子邮件。要将有关此电子邮件的通知发布到 444455556666 账户拥有的 Amazon SNS 主题，您需要创建一个如下所示的策略。为此，您需要提供有关委托人（其他服务）和每个资源的所有权的信息。`Resource` 语句提供主题 ARN，其中包括主题所有者的账户 ID 444455556666。`"aws:SourceOwner": "111122223333"` 语句指定您的账户拥有该电子邮件。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-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`：
+ Amazon API Gateway
+ Amazon CloudWatch
+ Amazon DevOps Guru
+ 亚马逊 GameLift 服务器
+ Amazon Pinpoint SMS 和 Voice API
+ Amazon RDS
+ Amazon Redshift
+ Amazon SES
+ AWS CodeCommit
+ Directory Service
+ AWS Lambda
+ AWS Systems Manager Incident Manager

## `aws:SourceAccount` 与 `aws:SourceOwner`
<a name="source-account-versus-source-owner"></a>

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

`aws:SourceAccount` 和 `aws:SourceOwner` 条件键由一些 AWS 服务 在它们发布到 Amazon SNS 主题时设置。如果支持，则该值将是服务代表其发布数据的 12 位 AWS 账户 ID。一些服务支持其中一项，一些服务支持另一项。
+ [允许 Amazon S3 事件通知发布到主题](#sns-allow-s3-bucket-to-publish-to-topic)请参阅，了解 Amazon S3 通知的使用方式`aws:SourceAccount`以及支持该条件的 AWS 服务列表。
+ [允许 Amazon SES 向其他账户拥有的主题发布](#sns-allow-specified-service-to-publish-to-topic)有关 Amazon SES 的使用方式`aws:SourceOwner`以及支持该条件的 AWS 服务列表，请参阅。

## 允许组织中的账户 AWS Organizations 向其他账户中的主题发布内容
<a name="sns-allow-organization-to-publish-to-topic-in-another-account"></a>

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

您可以在 [Organizations 控制台](https://console.aws.amazon.com/organizations/)中找到您的组织 ID。有关更多信息，请参阅[从管理账户查看组织的详细信息](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_org_details.html#orgs_view_org)。

在此示例中，任何组织成员都`myOrgId`可以在账户 AWS 账户 中向 Amazon SNS 主题发布内容`MyTopic`。`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 警报发布到其他账户中的主题
<a name="sns-allow-cloudwatch-alarm-to-publish-to-topic-in-another-account"></a>

使用以下步骤调用带有不同 CloudWatch 警报的 Amazon SNS 主题。 AWS 账户此示例使用两个账户：
+ **账户 A** 用于创建 CloudWatch 警报。
+ **账户 B** 用于创建 SNS 主题。

**在账户 B 中创建 SNS 主题**

1. 登录 [Amazon SNS 控制台](https://console.aws.amazon.com/sns/home)。

1. 在导航窗格中，选择**主题**，然后选择**创建主题**。

1. 为主题类型选择**标准**，然后为该主题创建名称。

1. 选择**创建主题**，然后复制该主题的 **ARN**。

1. 在导航窗格中，选择**订阅**，然后选择**创建订阅**。

1. 在**主题 ARN** 部分添加主题的 ARN，选择**电子邮件**作为协议，然后**输入电子邮件地址**。

1. 选择**创建订阅**，然后检查您的电子邮件来**确认订阅**。

**在账户 A 中创建 CloudWatch 警报**

1. 打开 CloudWatch 控制台，网址为[https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)。

1. 在导航窗格中，选择**警报**，然后选择**创建警报**。

1. 如果您尚未创建警报，请立即创建一个。否则，请选择您的**指标**，然后提供阈值和比较参数的详细信息。

1. 在**配置操作**的**通知**下，选择**使用主题 ARN 通知其他账户**，然后输入账户 B 中的**主题 ARN**。

1. 为警报创建名称，然后选择**创建警报**。

**更新账户 B 中 SNS 主题的访问策略**

1. 登录 [Amazon SNS 控制台](https://console.aws.amazon.com/sns/home)。

1. 在左侧导航窗格中，选择**主题**，然后选择该主题。

1. 选择**编辑**，然后将以下内容添加到策略中：

**注意**  
请将以下策略中的示例值替换为您的实际值。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Id": "__default_policy_ID",
    "Statement": [
        {
            "Sid": "__default_statement_ID",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": [
                "SNS:GetTopicAttributes",
                "SNS:SetTopicAttributes",
                "SNS:AddPermission",
                "SNS:RemovePermission",
                "SNS:DeleteTopic",
                "SNS:Subscribe",
                "SNS:ListSubscriptionsByTopic",
                "SNS:Publish"
            ],
            "Resource": "arn:aws:cloudwatch:us-west-1:111122223333:alarm:",
            "Condition": {
                "ArnLike": {
                    "aws:SourceArn": "arn:aws:cloudwatch:us-west-1:111122223333:alarm:"
                }
            }
        }
    ]
}
```

------

**测试警报**

要测试警报，您可以根据指标数据点更改警报阈值，也可以手动更改警报状态。当您更改警报阈值或警报状态时，您会收到一封电子邮件通知。

**使用本地 Amazon SNS 主题并转发消息的解决方法**

使用以下步骤为警报启用跨账户 Amazon SNS 通知 CloudWatch：

1. 使用与**CloudWatch警报**相同的账户 (111122223333) 创建[**亚马逊 SNS 主题**](sns-create-topic.md)。

1. 为该亚马逊 SNS 主题订阅 [**Lambda 函数**](lambda-console.md)或[亚马逊 EventBridge规则](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-s3-object-created-tutorial.html)。

1. 然后，Lambda 函数或 EventBridge 规则可以将消息发布到目标账户 (444455556666) 中的 Amazon SNS 主题。

## 仅限从特定 VPC 终端节点发布到 Amazon SNS 主题
<a name="sns-restrict-publication-only-from-specified-vpc-endpoint"></a>

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

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

# Amazon SNS 如何与 IAM 配合使用
<a name="security_iam_service-with-iam"></a>

在使用 IAM 管理对 Amazon SNS 的访问权限之前，了解哪些 IAM 功能可用于 Amazon SNS。






**可与 Amazon Simple Notification Service 结合使用的 IAM 功能**  

| IAM 功能 | Amazon SNS 支持 | 
| --- | --- | 
|  [基于身份的策略](security-iam.md#security_iam_service-with-iam-id-based-policies)  |   是  | 
|  [基于资源的策略](security-iam.md#security_iam_service-with-iam-resource-based-policies)  |  是  | 
|  [策略操作](security-iam.md#security_iam_service-with-iam-id-based-policies-actions)  |   是  | 
|  [策略资源](security-iam.md#security_iam_service-with-iam-id-based-policies-resources)  |   是  | 
|  [策略条件键（特定于服务）](security-iam.md#security_iam_service-with-iam-id-based-policies-conditionkeys)  |   是  | 
|  [ACLs](security-iam.md#security_iam_service-with-iam-acls)  |   否   | 
|  [ABAC（策略中的标签）](security-iam.md#security_iam_service-with-iam-tags)  |   部分  | 
|  [临时凭证](security-iam.md#security_iam_service-with-iam-roles-tempcreds)  |   是  | 
|  [主体权限](security-iam.md#security_iam_service-with-iam-principal-permissions)  |   是  | 
|  [服务角色](security-iam.md#security_iam_service-with-iam-roles-service)  |   是  | 
|  [服务关联角色](security-iam.md#security_iam_service-with-iam-roles-service-linked)  |   否   | 

要全面了解 Amazon SNS 和其他 AWS 服务如何与大多数 IAM 功能配合使用，请参阅 IAM *用户指南中与 IAM 配合使用的AWS *[服务](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html)。

# AWS 的托管策略 Amazon Simple Notification Service
<a name="security-iam-awsmanpol"></a>



 AWS 托管策略是由创建和管理的独立策略 AWS。 AWS 托管策略旨在为许多常见用例提供权限，以便您可以开始为用户、组和角色分配权限。

请记住， AWS 托管策略可能不会为您的特定用例授予最低权限权限，因为它们可供所有 AWS 客户使用。我们建议通过定义特定于使用案例的[客户管理型策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#customer-managed-policies)来进一步减少权限。

您无法更改 AWS 托管策略中定义的权限。如果 AWS 更新 AWS 托管策略中定义的权限，则更新会影响该策略所关联的所有委托人身份（用户、组和角色）。 AWS 最有可能在启动新的 API 或现有服务可以使用新 AWS 服务 的 API 操作时更新 AWS 托管策略。

有关更多信息，请参阅《IAM 用户指南》**中的 [AWS 托管式策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies)。

 





## AWS 托管策略：Amazon A SNSFull ccess
<a name="security-iam-awsmanpol-AmazonSNSFullAccess"></a>

`AmazonSNSFullAccess`使用提供对 Amazon SNS 的完全访问权限。 AWS 管理控制台该策略还包括以下针对使用 Amazon SNS 调用 AWS End User Messaging SMS 时的读取和写入操作。您可以将此策略附加到您的用户、组或角色。

**权限详细信息**

以下权限仅在使用 Amazon SNS APIs 时适用：
+ `sns:*` – 允许执行与 Amazon SNS 相关的任何操作的完全权限。此通配符（\$1）表示用户可以执行所有可能的 Amazon SNS 操作。
+ `sms-voice:DescribeVerifiedDestinationNumbers` – 允许您检索已通过验证可在 AWS 账户中发送短信的电话号码列表。
+ `sms-voice:CreateVerifiedDestinationNumber`— 允许您验证新的电话号码，以便在其中使用短信服务 AWS。
+ `sms-voice:SendDestinationNumberVerificationCode` – 允许您向正在 AWS中进行短信收发验证的电话号码发送验证码。
+ `sms-voice:SendTextMessage` - 允许您创建新的短信并将其发送到接收者的电话号码。每次调用时，`SendTextMessage` 仅向一个接收者发送短信。
+ `sms-voice:DeleteVerifiedDestinationNumber`— 允许您从已验证的号码列表中删除电话号码 AWS 账户
+ `sms-voice:VerifyDestinationNumber` – 允许您启动和完成要用于 AWS中的短信收发服务的电话号码的验证过程。
+ `sms-voice:DescribeAccountAttributes` - 允许您检索有关与 AWS中的短信收发服务相关的账户级别属性的详细信息。
+ `sms-voice:DescribeSpendLimits` - 允许您检索有关与 AWS 账户中的短信收发服务相关的支出限额的信息
+ `sms-voice:DescribePhoneNumbers` - 允许您检索与 AWS 账户 中的短信收发服务关联的电话号码的详细信息
+ `sms-voice:SetTextMessageSpendLimitOverride`— 允许您在其中设置或改写短信的支出限额 AWS 账户
+ `sms-voice:DescribeOptedOutNumbers` - 允许您检索已选择不接收来自您的 AWS 账户的短信的电话号码列表。
+ `sms-voice:DeleteOptedOutNumber`— 允许您从已选择退出的号码列表中删除电话号码 AWS 账户

**`AmazonSNSFullAccess` 示例策略**

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "SNSFullAccess",
            "Effect": "Allow",
            "Action": "sns:*",
            "Resource": "*"
        },
        {
            "Sid": "SMSAccessViaSNS",
            "Effect": "Allow",
            "Action": [
                "sms-voice:DescribeVerifiedDestinationNumbers",
                "sms-voice:CreateVerifiedDestinationNumber",
                "sms-voice:SendDestinationNumberVerificationCode",
                "sms-voice:SendTextMessage",
                "sms-voice:DeleteVerifiedDestinationNumber",
                "sms-voice:VerifyDestinationNumber",
                "sms-voice:DescribeAccountAttributes",
                "sms-voice:DescribeSpendLimits",
                "sms-voice:DescribePhoneNumbers",
                "sms-voice:SetTextMessageSpendLimitOverride",
                "sms-voice:DescribeOptedOutNumbers",
                "sms-voice:DeleteOptedOutNumber"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:CalledViaLast": "sns.amazonaws.com"
                }
            }
        }
    ]
}
```

------

要查看此策略的权限，请参阅《*AWS 托管策略参考》中的 [Amazon A SNSFull cces](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonSNSFullAccess.html) s*。

## AWS 托管策略：Amazon SNSRead OnlyAccess
<a name="security-iam-awsmanpol-AmazonSNSReadOnlyAccess"></a>

`AmazonSNSReadOnlyAccess` 通过 AWS 管理控制台提供对 Amazon SNS 的只读访问权限。该策略还包括以下使用 Amazon SNS 调用 AWS End User Messaging SMS 时的只读操作。您可以将此策略附加到用户、组和角色。

**权限详细信息**

以下权限仅在使用 Amazon SNS APIs 时适用：
+ `sns:GetTopicAttributes` - 允许您检索 Amazon SNS 主题的属性。这包括主题的 ARN（Amazon 资源名称）、订阅用户列表、交付策略、访问控制策略以及与该主题关联的任何其他元数据等信息。
+ `sns:List*` - 允许您对 Amazon SNS 资源执行任何以 `List` 开头的操作。这包括列出与 Amazon SNS 相关的各种元素的权限，例如：
  + `sns:ListTopics` - 允许您在 AWS 账户中检索所有 Amazon SNS 主题的列表。
  + `sns:ListSubscriptions` - 允许您检索 Amazon SNS 主题的所有订阅列表。
  + `sns:ListSubscriptionsByTopic` - 允许您列出对 Amazon SNS 主题的所有订阅。
  + `sns:ListPlatformApplications` - 允许您列出为移动推送通知创建的所有平台应用程序。
  + `sns:ListEndpointsByPlatformApplication` - 允许您列出与平台应用程序关联的所有端点。
+ `sns:CheckIfPhoneNumberIsOptedOut` - 允许您检查特定的电话号码是否已选择不通过 Amazon SNS 接收短信。
+ `sns:GetEndpointAttributes` - 允许您检索与 Amazon SNS 平台应用程序关联的端点的属性。这可能包括端点的启用状态、自定义用户数据以及与端点关联的任何其他元数据等属性。
+ `sns:GetDataProtectionPolicy` - 允许您检索与 Amazon SNS 主题相关的数据保护策略。
+ `sns:GetPlatformApplicationAttributes` - 允许您检索 Amazon SNS 平台应用程序的属性。Amazon SNS 中使用平台应用程序，通过 Apple Push Notification Service（APNS）或 Firebase Cloud Messaging（FCM）等服务向移动设备发送推送通知。
+ `sns:GetSMSAttributes` - 允许您检索 AWS 账户的默认短信设置。
+ `sns:GetSMSSandboxAccountStatus` - 允许您检索 AWS 账户的短信沙盒的当前状态。
+ `sns:GetSubscriptionAttributes` - 允许您检索 Amazon SNS 主题的特定订阅的属性。
+ `sms-voice:DescribeVerifiedDestinationNumbers`— 允许您查看或检索已通过验证可在其中发送 SMS 消息的电话号码列表 AWS 账户
+ `sms-voice:DescribeAccountAttributes` - 允许您查看或检索有关与 AWS中的短信收发服务相关的账户级别属性的信息。
+ `sms-voice:DescribeSpendLimits` - 允许您查看或检索有关与您的 AWS 账户中的短信收发服务相关的支出限额的信息
+ `sms-voice:DescribePhoneNumbers` – 允许您查看或检索有关用于 AWS 账户中的短信收发服务的电话号码的信息
+ `sms-voice:DescribeOptedOutNumbers` - 允许您查看或检索已选择不接收来自您的 AWS 账户的短信的电话号码列表

**`AmazonSNSReadOnlyAccess` 示例策略**

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "SNSReadOnlyAccess",
            "Effect": "Allow",
            "Action": [
                "sns:GetTopicAttributes",
                "sns:List*",
                "sns:CheckIfPhoneNumberIsOptedOut",
                "sns:GetEndpointAttributes",
                "sns:GetDataProtectionPolicy",
                "sns:GetPlatformApplicationAttributes",
                "sns:GetSMSAttributes",
                "sns:GetSMSSandboxAccountStatus",
                "sns:GetSubscriptionAttributes"
            ],
            "Resource": "*"
        },
        {
            "Sid": "SMSAccessViaSNS",
            "Effect": "Allow",
            "Action": [
                "sms-voice:DescribeVerifiedDestinationNumbers",
                "sms-voice:DescribeAccountAttributes",
                "sms-voice:DescribeSpendLimits",
                "sms-voice:DescribePhoneNumbers",
                "sms-voice:DescribeOptedOutNumbers"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:CalledViaLast": "sns.amazonaws.com"
                }
            }
        }
    ]
}
```

------

要查看此策略的权限，请参阅《*AWS 托管策略参考》中的 [Amazon A SNSFull cces](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonSNSFullAccess.html) s*。

## 亚马逊 SNS 更新了托管政策 AWS
<a name="security-iam-awsmanpol-updates"></a>



查看自该服务开始跟踪这些更改以来对 Amazon SNS AWS 托管政策的更新的详细信息。有关此页面更改的自动提示，请订阅 Amazon SNS 文档历史记录页面上的 RSS 源。




| 更改 | 描述 | 日期 | 
| --- | --- | --- | 
|   [AmazonSNSFullAccess](#security-iam-awsmanpol-AmazonSNSFullAccess)：对现有策略的更新  |  Amazon SNS 添加了新的权限，允许使用 AWS 管理控制台完全访问 Amazon SNS。  | 09/24/2024 | 
|  [亚马逊 SNSRead OnlyAccess](#security-iam-awsmanpol-AmazonSNSReadOnlyAccess)-更新现有政策  |  Amazon SNS 添加了新的权限，允许使用 AWS 管理控制台对 Amazon SNS 进行只读访问。  | 09/24/2024 | 
|  Amazon SNS 开启了跟踪更改  |  Amazon SNS 开始跟踪其 AWS 托管政策的变更。  | 08/27/2024 | 

## Amazon SNS 的策略操作
<a name="security_iam_service-with-iam-id-based-policies-actions"></a>

**支持策略操作：**是

管理员可以使用 AWS JSON 策略来指定谁有权访问什么。也就是说，哪个**主体**可以对什么**资源**执行**操作**，以及在什么**条件**下执行。

JSON 策略的 `Action` 元素描述可用于在策略中允许或拒绝访问的操作。在策略中包含操作以授予执行关联操作的权限。



要查看 Amazon SNS 操作的列表，请参阅《服务授权参考》**中的 [Amazon Simple Notification Service 定义的资源](https://docs.aws.amazon.com/IAM/latest/UserGuide/list_amazonsns.html)。

Amazon SNS 中的策略操作在操作前面使用以下前缀：

```
sns
```

要在单个语句中指定多项操作，请使用逗号将它们隔开。

```
"Action": [
      "sns:action1",
      "sns:action2"
         ]
```





要查看 Amazon SNS 基于身份的策略的示例，请参阅[适用于 Amazon Simple Notification Service 的基于身份的策略示例](security_iam_id-based-policy-examples.md)。

## Amazon SNS 的策略资源
<a name="security_iam_service-with-iam-id-based-policies-resources"></a>

**支持策略资源：**是

管理员可以使用 AWS JSON 策略来指定谁有权访问什么。也就是说，哪个**主体**可以对什么**资源**执行**操作**，以及在什么**条件**下执行。

`Resource` JSON 策略元素指定要向其应用操作的一个或多个对象。作为最佳实践，请使用其 [Amazon 资源名称（ARN）](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference-arns.html)指定资源。对于不支持资源级权限的操作，请使用通配符 (\$1) 指示语句应用于所有资源。

```
"Resource": "*"
```

要查看 Amazon SNS 资源类型及其列表 ARNs，请参阅服务*授权*参考中的[亚马逊简单通知服务定义的操作](https://docs.aws.amazon.com/IAM/latest/UserGuide/list_amazonsns.html)。要了解您可以在哪些操作中指定每个资源的 ARN，请参阅 [Amazon Simple Notification Service 定义的资源](https://docs.aws.amazon.com/IAM/latest/UserGuide/list_amazonsns.html)。





要查看 Amazon SNS 基于身份的策略的示例，请参阅[适用于 Amazon Simple Notification Service 的基于身份的策略示例](security_iam_id-based-policy-examples.md)。

## Amazon SNS 的策略条件键
<a name="security_iam_service-with-iam-id-based-policies-conditionkeys"></a>

**支持特定于服务的策略条件键：**是

管理员可以使用 AWS JSON 策略来指定谁有权访问什么。也就是说，哪个**主体**可以对什么**资源**执行**操作**，以及在什么**条件**下执行。

`Condition` 元素根据定义的条件指定语句何时执行。您可以创建使用[条件运算符](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html)（例如，等于或小于）的条件表达式，以使策略中的条件与请求中的值相匹配。要查看所有 AWS 全局条件键，请参阅 *IAM 用户指南*中的[AWS 全局条件上下文密钥](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html)。

要查看 Amazon SNS 条件键的列表，请参阅《服务授权参考》**中的 [Amazon Simple Notification Service 的条件键](https://docs.aws.amazon.com/IAM/latest/UserGuide/list_amazonsns.html)。要了解您可以对哪些操作和资源使用条件键，请参阅 [Amazon Simple Notification Service 定义的资源](https://docs.aws.amazon.com/IAM/latest/UserGuide/list_amazonsns.html)。

要查看 Amazon SNS 基于身份的策略的示例，请参阅[适用于 Amazon Simple Notification Service 的基于身份的策略示例](security_iam_id-based-policy-examples.md)。

## ACLs 在 Amazon SNS 中
<a name="security_iam_service-with-iam-acls"></a>

**支持 ACLs：**否 

访问控制列表 (ACLs) 控制哪些委托人（账户成员、用户或角色）有权访问资源。 ACLs 与基于资源的策略类似，尽管它们不使用 JSON 策略文档格式。

## ABAC 与 Amazon SNS
<a name="security_iam_service-with-iam-tags"></a>

**支持 ABAC（策略中的标签）：**部分支持

基于属性的访问权限控制（ABAC）是一种授权策略，该策略基于称为标签的属性来定义权限。您可以将标签附加到 IAM 实体和 AWS 资源，然后设计 ABAC 策略以允许在委托人的标签与资源上的标签匹配时进行操作。

要基于标签控制访问，您需要使用 `aws:ResourceTag/key-name``aws:RequestTag/key-name` 或 `aws:TagKeys` 条件键在策略的[条件元素](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html)中提供标签信息。

如果某个服务对于每种资源类型都支持所有这三个条件键，则对于该服务，该值为**是**。如果某个服务仅对于部分资源类型支持所有这三个条件键，则该值为**部分**。

有关 ABAC 的更多信息，请参阅《IAM 用户指南》**中的[使用 ABAC 授权定义权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction_attribute-based-access-control.html)。要查看设置 ABAC 步骤的教程，请参阅《IAM 用户指南》**中的[使用基于属性的访问权限控制（ABAC）](https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_attribute-based-access-control.html)。

## 将临时凭证用于 Amazon SNS
<a name="security_iam_service-with-iam-roles-tempcreds"></a>

**支持临时凭证：**是

临时证书提供对 AWS 资源的短期访问权限，并且是在您使用联合身份或切换角色时自动创建的。 AWS 建议您动态生成临时证书，而不是使用长期访问密钥。有关更多信息，请参阅《IAM 用户指南》**中的 [IAM 中的临时安全凭证](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp.html)和[使用 IAM 的。AWS 服务](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html)

## Amazon SNS 的跨服务主体权限
<a name="security_iam_service-with-iam-principal-permissions"></a>

**支持转发访问会话（FAS）：**是

 转发访问会话 (FAS) 使用调用主体的权限 AWS 服务，再加上 AWS 服务 向下游服务发出请求的请求。有关发出 FAS 请求时的策略详情，请参阅[转发访问会话](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_forward_access_sessions.html)。

## Amazon SNS 的服务角色
<a name="security_iam_service-with-iam-roles-service"></a>

**支持服务角色：**是

 服务角色是由一项服务担任、代表您执行操作的 [IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)。IAM 管理员可以在 IAM 中创建、修改和删除服务角色。有关更多信息，请参阅《IAM 用户指南》**中的[创建向 AWS 服务委派权限的角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)。

**警告**  
更改服务角色的权限可能会破坏 Amazon SNS 的功能。仅当 Amazon SNS 提供相关指导时才编辑服务角色。

## Amazon SNS 的服务相关角色
<a name="security_iam_service-with-iam-roles-service-linked"></a>

**支持服务相关角色：**否 

 服务相关角色是一种链接到的服务角色。 AWS 服务服务可以代入代表您执行操作的角色。服务相关角色出现在您的中 AWS 账户 ，并且归服务所有。IAM 管理员可以查看但不能编辑服务关联角色的权限。

有关创建或管理服务相关角色的详细信息，请参阅[能够与 IAM 搭配使用的AWS 服务](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html)。在表中查找**服务相关角色**列中包含 `Yes` 的表。选择**是**链接以查看该服务的服务相关角色文档。

# 适用于 Amazon Simple Notification Service 的基于身份的策略示例
<a name="security_iam_id-based-policy-examples"></a>

默认情况下，用户和角色没有创建或修改 Amazon SNS 资源的权限。要授予用户对所需资源执行操作的权限，IAM 管理员可以创建 IAM 策略。

要了解如何使用这些示例 JSON 策略文档创建基于 IAM 身份的策略，请参阅《IAM 用户指南》**中的[创建 IAM 策略（控制台）](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html)。

有关 Amazon SNS 定义的操作和资源类型（包括每种资源类型的格式）的详细信息，请参阅服务*授权*参考中的 [Amazon 简单通知服务的操作、资源和条件密钥](https://docs.aws.amazon.com/IAM/latest/UserGuide/list_amazonsns.html)。 ARNs 

## 策略最佳实践
<a name="security_iam_service-with-iam-policy-best-practices"></a>

基于身份的策略确定某个人是否可以创建、访问或删除您账户中的 Amazon SNS 资源。这些操作可能会使 AWS 账户产生成本。创建或编辑基于身份的策略时，请遵循以下指南和建议：
+ **开始使用 AWS 托管策略并转向最低权限权限** — 要开始向用户和工作负载授予权限，请使用为许多常见用例授予权限的*AWS 托管策略*。它们在你的版本中可用 AWS 账户。我们建议您通过定义针对您的用例的 AWS 客户托管策略来进一步减少权限。有关更多信息，请参阅《IAM 用户指南》**中的 [AWS 托管策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies)或[工作职能的AWS 托管策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_job-functions.html)。
+ **应用最低权限**：在使用 IAM 策略设置权限时，请仅授予执行任务所需的权限。为此，您可以定义在特定条件下可以对特定资源执行的操作，也称为*最低权限许可*。有关使用 IAM 应用权限的更多信息，请参阅《IAM 用户指南》**中的 [IAM 中的策略和权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html)。
+ **使用 IAM 策略中的条件进一步限制访问权限**：您可以向策略添加条件来限制对操作和资源的访问。例如，您可以编写策略条件来指定必须使用 SSL 发送所有请求。如果服务操作是通过特定的方式使用的，则也可以使用条件来授予对服务操作的访问权限 AWS 服务，例如 CloudFormation。有关更多信息，请参阅《IAM 用户指南》**中的 [IAM JSON 策略元素：条件](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html)。
+ **使用 IAM Access Analyzer 验证您的 IAM 策略，以确保权限的安全性和功能性**：IAM Access Analyzer 会验证新策略和现有策略，以确保策略符合 IAM 策略语言（JSON）和 IAM 最佳实践。IAM Access Analyzer 提供 100 多项策略检查和可操作的建议，以帮助您制定安全且功能性强的策略。有关更多信息，请参阅《IAM 用户指南》**中的[使用 IAM Access Analyzer 验证策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-policy-validation.html)。
+ **需要多重身份验证 (MFA**)-如果 AWS 账户您的场景需要 IAM 用户或根用户，请启用 MFA 以提高安全性。若要在调用 API 操作时需要 MFA，请将 MFA 条件添加到您的策略中。有关更多信息，请参阅《IAM 用户指南》**中的[使用 MFA 保护 API 访问](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_mfa_configure-api-require.html)。

有关 IAM 中的最佳实操的更多信息，请参阅《IAM 用户指南》**中的 [IAM 中的安全最佳实践](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)。

## 使用 Amazon SNS 控制台
<a name="security_iam_id-based-policy-examples-console"></a>

要访问 Amazon Simple Notification Service 控制台，您必须具有一组最低的权限。这些权限必须允许您列出和查看有关您的 Amazon SNS 资源的详细信息。 AWS 账户如果创建比必需的最低权限更为严格的基于身份的策略，对于附加了该策略的实体（用户或角色），控制台将无法按预期正常运行。

对于仅调用 AWS CLI 或 AWS API 的用户，您无需为其设置最低控制台权限。相反，只允许访问与其尝试执行的 API 操作相匹配的操作。

为确保用户和角色仍然可以使用 Amazon SNS 控制台，还要将 Amazon `ConsoleAccess` SNS `ReadOnly` AWS 或托管策略附加到实体。有关更多信息，请参阅《IAM 用户指南》**中的[为用户添加权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_change-permissions.html#users_change_permissions-add-console)。

## 其他策略类型
<a name="security_iam_access-manage-other-policies"></a>

AWS 支持其他策略类型，这些策略类型可以设置更常见的策略类型授予的最大权限：
+ **权限边界** – 设置基于身份的策略可以授予 IAM 实体的最大权限。有关更多信息，请参阅《 IAM 用户指南》**中的 [IAM 实体的权限边界](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html)。
+ **服务控制策略 (SCPs)**-在中指定组织或组织单位的最大权限 AWS Organizations。有关更多信息，请参阅《AWS Organizations 用户指南》**中的[服务控制策略](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html)。
+ **资源控制策略 (RCPs)**-设置账户中资源的最大可用权限。有关更多信息，请参阅《*AWS Organizations 用户指南》*中的[资源控制策略 (RCPs)](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_rcps.html)。
+ **会话策略** – 在为角色或联合用户创建临时会话时，作为参数传递的高级策略。有关更多信息，请参阅《IAM 用户指南》**中的[会话策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session)。

## 多个策略类型
<a name="security_iam_access-manage-multiple-policies"></a>

当多个类型的策略应用于一个请求时，生成的权限更加复杂和难以理解。要了解在涉及多种策略类型时如何 AWS 确定是否允许请求，请参阅 *IAM 用户指南*中的[策略评估逻辑](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html)。

## 允许用户查看他们自己的权限
<a name="security_iam_id-based-policy-examples-view-own-permissions"></a>

该示例说明了您如何创建策略，以允许 IAM 用户查看附加到其用户身份的内联和托管式策略。此策略包括在控制台上或使用 AWS CLI 或 AWS API 以编程方式完成此操作的权限。

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "ViewOwnUserInfo",
            "Effect": "Allow",
            "Action": [
                "iam:GetUserPolicy",
                "iam:ListGroupsForUser",
                "iam:ListAttachedUserPolicies",
                "iam:ListUserPolicies",
                "iam:GetUser"
            ],
            "Resource": ["arn:aws:iam::*:user/${aws:username}"]
        },
        {
            "Sid": "NavigateInConsole",
            "Effect": "Allow",
            "Action": [
                "iam:GetGroupPolicy",
                "iam:GetPolicyVersion",
                "iam:GetPolicy",
                "iam:ListAttachedGroupPolicies",
                "iam:ListGroupPolicies",
                "iam:ListPolicyVersions",
                "iam:ListPolicies",
                "iam:ListUsers"
            ],
            "Resource": "*"
        }
    ]
}
```

## Amazon SNS 基于身份的策略
<a name="security_iam_service-with-iam-id-based-policies"></a>

**支持基于身份的策略：**是

基于身份的策略是可附加到身份（如 IAM 用户、用户组或角色）的 JSON 权限策略文档。这些策略控制用户和角色可在何种条件下对哪些资源执行哪些操作。要了解如何创建基于身份的策略，请参阅《IAM 用户指南》**中的[使用客户管理型策略定义自定义 IAM 权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)。

通过使用 IAM 基于身份的策略，您可以指定允许或拒绝的操作和资源以及允许或拒绝操作的条件。要了解可在 JSON 策略中使用的所有元素，请参阅《IAM 用户指南》**中的 [IAM JSON 策略元素引用](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html)。

### 适用于 Amazon SNS 的基于身份的策略示例
<a name="security_iam_service-with-iam-id-based-policies-examples"></a>



要查看 Amazon SNS 基于身份的策略的示例，请参阅[适用于 Amazon Simple Notification Service 的基于身份的策略示例](security_iam_id-based-policy-examples.md)。

## Amazon SNS 内基于资源的策略
<a name="security_iam_service-with-iam-resource-based-policies"></a>


|  |  | 
| --- |--- |
|  支持基于资源的策略  |  是  | 

基于资源的策略是附加到资源的 JSON 策略文档。基于资源的策略的示例包括 IAM *角色信任策略*和 Amazon S3 *存储桶策略*。在支持基于资源的策略的服务中，服务管理员可以使用它们来控制对特定资源的访问。对于在其中附加策略的资源，策略定义指定主体可以对该资源执行哪些操作以及在什么条件下执行。您必须在基于资源的策略中[指定主体](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html)。委托人可以包括账户、用户、角色、联合用户或 AWS 服务。

要启用跨账户访问，您可以将整个账户或其他账户中的 IAM 实体指定为基于资源的策略中的主体。有关更多信息，请参阅《IAM 用户指南》**中的 [IAM 中的跨账户资源访问](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies-cross-account-resource-access.html)。

# 将基于身份的策略用于 Amazon SNS
<a name="sns-using-identity-based-policies"></a>

亚马逊简单通知服务与 AWS Identity and Access Management (IAM) 集成，因此您可以指定您的用户 AWS 账户 可以使用亚马逊 SNS 资源执行哪些 Amazon SNS 操作。您可以指定策略中的特定主题。例如，您可以使用变量创建一项 IAM 策略，此策略向您组织中的特定用户授予权限，允许其通过您的 AWS 账户中的特定主题执行 `Publish` 操作。有关更多信息，请参阅 [Using IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/PolicyVariables.html) 指南中的 *Policy Variables*。

**重要**  
结合使用 Amazon SNS 和 IAM 并不会改变您使用 Amazon SNS 的方式。Amazon SNS 操作没有发生变化，且没有关于用户和访问控制的新 Amazon SNS 操作。

有关涉及 Amazon SNS 操作和资源的策略示例，请参阅 [Amazon SNS 的策略示例](#sns-example-policies)。

## IAM 和 Amazon SNS 策略一起使用
<a name="iam-and-sns-policies"></a>

您可以利用 IAM 策略限制您的用户对 Amazon SNS 操作和主题的访问权限。IAM 策略只能限制您 AWS 账户内的用户访问权限，而不能限制其他用户的访问权限 AWS 账户。

您可对特定主题使用 Amazon SNS 策略，以限制谁能使用该主题（例如，谁能向主题发布消息，谁能订阅该主题等）。Amazon SNS 策略可以向其他 AWS 账户人或您自己的用户授予访问权限。 AWS 账户

您可以使用 IAM 策略、Amazon SNS 策略或此两者向您的用户授予访问 Amazon SNS 主题的权限。在绝大部分情况下，无论采用上述哪种方式，都可以得到同样的结果。例如，下图显示了等效的 IAM 策略和 Amazon SNS 策略。IAM 策略允许对您的 AWS 账户 名为 topic\$1xyz 的主题进行 Amazon SNS `Subscribe` 操作。IAM 策略已附加到用户 Bob 和 Susan（这意味着 Bob 和 Susan 拥有策略中规定的权限）。 策略Amazon SNS同样也会向 Bob 和 Susan 授予对 topic\$1xyz 访问 `Subscribe` 的权限。

![\[比较 IAM 策略和 Amazon SNS 策略，显示这两个策略均向两个用户 Bob 和 Susan 授予同等权限，允许他们订阅 AWS 账户中的特定 Amazon SNS 主题。强调的主要区别在于，Amazon SNS 策略可以向不同用户授予权限 AWS 账户，而 IAM 策略则不能。\]](http://docs.aws.amazon.com/zh_cn/sns/latest/dg/images/SNS_EquivalentPolicies.png)


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

 AWS IAM 和 Amazon SNS 策略之间有一个区别：亚马逊 SNS 策略系统允许您向 AWS 账户其他策略授予权限，而 IAM 策略不允许。

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

**Example 1**  
在本示例中，IAM 策略和 Amazon SNS 策略均会应用于 Bob。IAM 政策授予他处理任何主题 AWS 账户的`Subscribe`权限，而 Amazon SNS 政策则授予他使用特定主题的权限 (top `Publish` ic\$1xyz)。下图阐明了这一概念。  

![\[显示 IAM 策略和 Amazon SNS 策略如何适用于用户 Bob，IAM 策略允许他订阅中的任何主题 AWS 账户，Amazon SNS 策略允许他向名为 “topic_xyz” 的特定主题发布消息。该图强调了 IAM 策略授予的一般权限与 Amazon SNS 策略针对特定主题授予的特定权限之间的区别。\]](http://docs.aws.amazon.com/zh_cn/sns/latest/dg/images/SNS_UnionOfPolicies.png)

如果 Bob 发送订阅 AWS 账户中任何主题的请求，IAM 策略将允许该操作。如果 Bob 要发送向 topic\$1xyz 发布消息的请求，那么 Amazon SNS 策略将允许此操作。  
 

**Example 2**  
在本示例中，我们基于示例 1（其中，Bob 拥有两个适用于他的策略）来进行描述。让我们看看 Bob 无法向 topic\$1xyz 发布消息的情况，因此您要将其发布主题的功能全部删除。完成上述操作最简单的方法就是在所有主题中添加拒绝他访问 `Publish` 操作的 IAM 策略。第三项策略将覆盖 Amazon SNS 策略，该策略最初为其授予向 topic\$1xyz 发布的权限，覆盖的原因是显式拒绝始终覆盖允许策略（有关策略评估逻辑的更多信息，请参阅 [评估逻辑](sns-access-policy-language-evaluation-logic.md)）。下图阐明了这一概念。  

![\[说明添加拒绝所有主题的“发布”操作的 IAM 策略如何覆盖允许用户 Bob 向特定主题“topic_xyz”发布内容的现有 Amazon SNS 策略。IAM 拒绝策略优先于 Amazon SNS 策略，从而有效地阻止 Bob 发布任何主题，包括“topic_xyz”。\]](http://docs.aws.amazon.com/zh_cn/sns/latest/dg/images/SNS_DenyOverride.png)


有关涉及 Amazon SNS 操作和资源的策略示例，请参阅 [Amazon SNS 的策略示例](#sns-example-policies)。

## Amazon SNS 资源 ARN 格式
<a name="sns-arn-format"></a>

对于 Amazon SNS，主题是您可以在策略中指定的唯一资源类型。以下是主题的 Amazon Resource Name (ARN) 格式。

```
arn:aws:sns:region:account_ID:topic_name
```

有关的更多信息 ARNs，请转至 *IAM 用户指南[ARNs](https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html#Identifiers_ARNs)*中的。

**Example**  
以下是在 us-east-2 区域命名的 MyTopic 主题的 ARN，属于 123456789012。 AWS 账户   

```
arn:aws:sns:us-east-2:123456789012:MyTopic
```

**Example**  
如果您 MyTopic 在 Amazon SNS 支持的每个不同区域中都有一个名为的主题，则可以使用以下 ARN 来指定主题。  

```
arn:aws:sns:*:123456789012:MyTopic
```

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

```
arn:aws:sns:*:123456789012:bob_*
```

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

## Amazon SNS API 操作
<a name="sns-api-actions"></a>

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

您在策略中指定的所有操作必须加上小写的字符串 `sns:` 为前缀。例如，您可以使用 `sns:*` 指定所有 Amazon SNS 操作。欲了解操作列表，请前往 [Amazon Simple Notification Service API 参考](https://docs.aws.amazon.com/sns/latest/api/)。

## Amazon SNS 策略密钥
<a name="sns-policy-keys"></a>

Amazon SNS 实施了以下 AWS 广泛的策略密钥，以及一些特定于服务的密钥。

有关每种支持的条件键的列表 AWS 服务，请参阅 *IAM 用户指南 AWS 服务*中的[操作、资源和条件键](https://docs.aws.amazon.com/service-authorization/latest/reference/reference_policies_actions-resources-contextkeys.html)。有关可以用于多个条件键的列表 AWS 服务，请参阅 *IAM 用户指南*中的[AWS 全局条件上下文密钥](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html)。

Amazon SNS 使用下列服务特定密钥。使用策略中限制访问 `Subscribe` 请求的这些密钥。
+ **sns:endpoint—**来自 `Subscribe` 请求或之前已确认的订阅的 URL、电子邮件地址或 ARN。通过字符串条件（请参阅 [Amazon SNS 的策略示例](#sns-example-policies)）限制访问特定终端节点（例如 \$1@yourcompany.com）。
+ **sns:protocol—**来自 `Subscribe` 请求或之前已确认的订阅的 `protocol` 值。与字符串条件一起使用（请参阅 [Amazon SNS 的策略示例](#sns-example-policies)），以限制向特定传输协议发布消息（例如，https）。

## Amazon SNS 的策略示例
<a name="sns-example-policies"></a>

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

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

**Example 1：允许群组创建和管理主题**  
在本示例中，我们创建授权访问 `CreateTopic`、`ListTopics`、`SetTopicAttributes` 和 `DeleteTopic` 的策略。  

```
{
  "Statement": [{
    "Effect": "Allow",
    "Action": ["sns:CreateTopic", "sns:ListTopics", "sns:SetTopicAttributes", "sns:DeleteTopic"],
    "Resource": "*"
  }]
}
```

**Example 2：允许 IT 群组向特定主题发布消息**  
在本示例中，我们为 IT 创建群组，并将授权访问 `Publish` 的策略分配至相关特定主题上。  

```
{
  "Statement": [{
    "Effect": "Allow",
    "Action": "sns:Publish",
    "Resource": "arn:aws:sns:*:123456789012:MyTopic"
  }]
}
```

**Example 3：让用户 AWS 账户 能够订阅主题**  
在示例中，我们创建授予访问 `Subscribe` 操作的权限的策略，以及针对 `sns:Protocol` 和 `sns:Endpoint` 策略密钥的字符串匹配条件。  

```
{
  "Statement": [{
    "Effect": "Allow",
    "Action": ["sns:Subscribe"],
    "Resource": "*",
    "Condition": {
      "StringLike": {
        "sns:Endpoint": "*@example.com"
      },
      "StringEquals": {
        "sns:Protocol": "email"
      }
    }
  }]
}
```

**Example 4：允许合作伙伴向特定主题发布消息**  
您可以利用 Amazon SNS 策略或 IAM 策略允许一位合作伙伴发布到特定主题。如果您的合作伙伴有 AWS 账户，那么使用 Amazon SNS 政策可能会更方便。但是，合作伙伴公司中任何拥有 AWS 安全凭证的人都可以发布有关该主题的消息。本示例假设您想要对特定人员进行访问限制（或应用程序限制）。要实现上述目的，您需要像对待您公司内的用户一样对待合作伙伴，并使用 IAM 策略而非 Amazon SNS 策略。  
在此示例中，我们创建了一个名 WidgetCo 为代表合作伙伴公司的群组；我们为合作伙伴公司中需要访问权限的特定人员（或应用程序）创建一个用户；然后将该用户放入该群组。  
然后，我们附加一个策略，授予该群组对名为的特定主题的`Publish`访问权限*WidgetPartnerTopic*。  
我们还想阻止该 WidgetCo 小组对主题做任何其他事情，因此我们添加了一份声明，拒绝允许除此之外的任何主题以外的`Publish`任何 Amazon SNS 操作。 WidgetPartnerTopic只有在系统中的其他地方存在广泛策略（该策略向用户授予广泛访问 Amazon SNS 的权限）时，才需要执行此操作。  

```
{
  "Statement": [{
      "Effect": "Allow",
      "Action": "sns:Publish",
      "Resource": "arn:aws:sns:*:123456789012:WidgetPartnerTopic"
    },
    {
      "Effect": "Deny",
      "NotAction": "sns:Publish",
      "NotResource": "arn:aws:sns:*:123456789012:WidgetPartnerTopic"
    }
  ]
}
```

## 适用于电子邮件端点的 Amazon SNS 策略
<a name="sns-email-endpoints"></a>

Amazon SNS 在端点访问策略中对电子邮件地址进行标准化处理，具体包括：删除首尾空格、将所有字符转换为小写、规范特殊字符及转义序列。因此，您必须在策略定义中使用小写电子邮件地址，以确保订阅请求能正确匹配。

示例策略：

```
{
    "Condition": {
        "StringEquals": {
            "sns:Endpoint": "user.name@example.com"
        }
    }
}
```

以下电子邮件地址符合上述条件：
+ `user.name@example.com`
+ `USER.NAME@EXAMPLE.COM`
+ `User.N\ame@Example.com`

## 适用于终端节点的 Amazon SNS 政策 HTTP/HTTPs
<a name="sns-http-https-endpoints"></a>

Amazon SNS 通过将方案和主机名转换为小写字母，同时精确保留端口、路径、查询参数和片段，对终端节点访问策略中的终端节点进行标准化 HTTP/HTTPs 。因此，您必须在策略定义中使用小写模式和主机名，以确保订阅请求能正确匹配。

```
{
    "Condition": {
        "StringEquals": {
            "sns:Endpoint": "https://example.com:443/path?A=B"
        }
    }
}
```

以下内容 HTTP/HTTPs 符合上述条件：
+ `HTTPS://EXAMPLE.COM:443/path?A=B`
+ `HTTPS://example.com:443/path?A=B`
+ `HTTPS://ExAmPlE.cOm:443/path?A=B`

# 管理自定义 Amazon SNS IAM 策略
<a name="sns-sms-custom-policies"></a>

自定义 IAM 策略允许您为单个 IAM 用户、群组或角色指定权限，授予或限制对特定 AWS 资源和操作的访问权限。在管理 Amazon SNS 资源时，自定义 IAM 策略允许您根据组织的安全和运营要求定制访问权限。

按照以下步骤管理 Amazon SNS 的自定义 IAM 策略：

1. 登录 AWS 管理控制台 并打开 IAM 控制台，网址为[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在导航窗格中，选择**策略**。

1. 要创建新的 IAM 策略，请选择**创建策略**，然后选择 **SNS**。要编辑现有策略，请从列表中选择该策略，然后选择**编辑策略**。

1. 在策略编辑器中，定义访问 Amazon SNS 资源的**权限**。您可以根据自己的特定要求指定**操作**、**资源**和**条件**。

1. 要授予 Amazon SNS 操作的权限，请在您的 IAM 策略中加入相关的 Amazon SNS 操作，例如 `sns:Publish`、`sns:Subscribe` 和 `sns:DeleteTopic`。定义权限适用的 Amazon SNS 主题的 ARN（Amazon 资源名称）。

1. 指定应将策略附加到的 IAM **用户**、**群组**或**角色**。您可以将策略直接附加到 IAM 用户或群组，也可以将其与 AWS 服务 或应用程序使用的 IAM 角色相关联。

1. 查看 IAM 策略配置，确保其符合您的访问控制要求。验证后，**保存**策略更改。

1. 将**自定义 IAM 策略**附加到您 AWS 账户中的相关 IAM 用户、群组或角色。这会向他们授予策略中定义的用于管理 Amazon SNS 资源的权限。

# 将临时安全凭证用于 Amazon SNS
<a name="sns-using-temporary-credentials"></a>

AWS Identity and Access Management (IAM) 允许您向需要访问您的 AWS 资源的用户和应用程序授予临时安全证书。这些临时安全凭证主要用于 IAM 角色和通过 SAML 和 OpenID Connect（OIDC）等行业标准协议进行联合访问。

要有效地管理对 AWS 资源的访问权限，必须了解以下关键概念：
+ **IAM 角色** — 角色用于委派对 AWS 资源的访问权限。角色可以由 Amazon EC2 实例、Lambda 函数等实体或其他 AWS 账户的用户担任。
+ **联合用户**-这些用户是通过外部身份提供商 (IdPs) 使用 SAML 或 OIDC 进行身份验证的用户。建议人类用户使用联合访问权限，而软件应用程序应使用 IAM 角色。
+ 无@@ **处不在的角色** — 对于需要 AWS 访问权限的外部应用程序，您可以使用 IAM Roles Anywhere 来安全地管理访问权限，而无需创建长期证书。

您可以使用临时安全凭证对 Amazon SNS 发出请求。 SDKs 和 API 库使用这些凭据计算必要的签名来对您的请求进行身份验证。凭证过期的请求将被 Amazon SNS 拒绝。

有关临时安全凭证的更多信息，请参阅《IAM 用户指南》**中的[使用 IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html)和[向经过外部身份验证的用户提供访问权限（身份联合验证）](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_common-scenarios_federated-users.html)。

**Example HTTPS 请求示例**  
以下示例演示如何使用从 AWS Security Token Service (STS) 获得的临时安全证书对 Amazon SNS 请求进行身份验证。  

```
https://sns.us-east-2.amazonaws.com/
?Action=CreateTopic
&Name=My-Topic
&SignatureVersion=4
&SignatureMethod=AWS4-HMAC-SHA256
&Timestamp=2023-07-05T12:00:00Z
&X-Amz-Security-Token=SecurityTokenValue
&X-Amz-Date=20230705T120000Z
&X-Amz-Credential=<your-access-key-id>/20230705/us-east-2/sns/aws4_request
&X-Amz-SignedHeaders=host
&X-Amz-Signature=<signature-value>
```

**对请求进行身份验证的步骤**

1. **获取临时安全凭证** - 使用 AWS STS 担任角色或获取联合用户凭证。这将为您提供访问密钥 ID、秘密访问密钥和安全令牌。

1. **构造请求** — 包括您的 Amazon SNS 操作所需的参数（例如 CreateTopic），并确保使用 HTTPS 进行安全通信。

1. **签署请求** - 使用 AWS 签名版本 4 流程签署您的请求。这包括创建规范请求 string-to-sign，然后计算签名。有关 AWS 签名版本 4 的更多信息，请参阅 *Amazon EBS 用户指南*中的[使用签名版本 4 签](https://docs.aws.amazon.com/ebs/latest/userguide/ebsapis-using-sigv4.html)名。

1. **发送请求** - 在请求标头中包含 X-Amz-Security-Token，以便将临时安全凭证传递给 Amazon SNS。

# Amazon SNS API 权限：操作和资源参考
<a name="sns-access-policy-language-api-permissions-reference"></a>

以下列表提供了特定于访问控制的 Amazon SNS 实施的信息：
+ 每个策略都必须仅覆盖单一主题（在编写一个策略时，请勿包括覆盖不同主题的语句）
+ 每个策略必须有一个独立的策略`Id`
+ 策略中的每个语句必须是一个独立的语句`sid`

## 策略配额
<a name="sns-policy-quotas"></a>

以下表格列举了策略语句的最大配额。


| Name | 最大配额 | 
| --- | --- | 
|  字节  |  30 kb  | 
|  语句  |  100  | 
|  委托人  |  1 到 200（0 无效。）  | 
|  资源  |  1（0 无效。它的值应与策略主题的 ARN 相匹配。）  | 

## 有效的 Amazon SNS 策略操作
<a name="sns-valid-policy-actions"></a>

Amazon SNS 支持以下表格所示的操作。


| Action | 说明 | 
| --- | --- | 
| sns: AddPermission | 授予向主题策略添加权限的权限。 | 
| sns: DeleteTopic | 授予删除一个主题的权限。 | 
| sns: GetDataProtectionPolicy | 授予权限以检索主题的数据保护策略。 | 
| sns: GetTopicAttributes  | 授予获取所有主题属性的权限。 | 
| sns: ListSubscriptionsByTopic | 授予检索对特定主题的所有订阅的权限。 | 
| sns: ListTagsForResource | 授予列出添加到特定主题的所有标签的权限。 | 
| sns:Publish  | 授予向主题或终端节点发布和批量发布内容的权限。有关更多信息，请参阅[发布](https://docs.aws.amazon.com/sns/latest/api/API_Publish.html)和[PublishBatch](https://docs.aws.amazon.com/sns/latest/api/API_BatchPublish.html)《亚马逊简单通知服务 API 参考》。 | 
| sns: PutDataProtectionPolicy | 授予权限以设置主题的数据保护策略。 | 
| sns: RemovePermission  | 授予在主题策略中取消任何权限的权限。 | 
| sns: SetTopicAttributes  | 授予设置一个主题的属性的权限。 | 
| sns:Subscribe  | 授予订阅一个主题的权限。 | 

## 特定于服务的密钥
<a name="sns-service-specific-keys"></a>

Amazon SNS 使用下列服务特定密钥。您可以在限制访问 `Subscribe` 请求的策略中使用它们。
+ **sns:endpoint—**来自 `Subscribe` 请求或之前已确认的订阅的 URL、电子邮件地址或 ARN。与字符串条件一起使用（请参阅 [Amazon SNS 的策略示例](sns-using-identity-based-policies.md#sns-example-policies)），以限制对某个特定终端节点的访问（例如，\$1@example.com）。
+ **sns:protocol—**来自 `Subscribe` 请求或之前已确认的订阅的 `protocol` 值。与字符串条件一起使用（请参阅 [Amazon SNS 的策略示例](sns-using-identity-based-policies.md#sns-example-policies)），以限制向特定传输协议发布消息（例如，https）。

**重要**  
当您通过 sns:Endpoint 使用一个策略控制访问时，注意 DNS 问题可能将来会影响终端节点的域名解析。

# Amazon Simple Notification Service 身份和访问故障排查
<a name="security_iam_troubleshoot"></a>

您可以使用以下信息，帮助诊断和修复在使用 Amazon SNS 和 IAM 时可能遇到的常见问题。

## 我无权在 Amazon SNS 中执行操作
<a name="security_iam_troubleshoot-no-permissions"></a>

如果您收到一个错误，指明您无权执行某个操作，则必须更新策略以允许您执行该操作。

当 `mateojackson` 用户尝试使用控制台查看有关虚构 `my-example-widget` 资源的详细信息，但不拥有虚构 `sns:GetWidget` 权限时，会发生以下示例错误。

```
User: arn:aws:iam::123456789012:user/mateojackson is not authorized to perform: sns:GetWidget on resource: my-example-widget
```

在此情况下，Mateo 的策略必须更新以允许其使用 `sns:GetWidget` 操作访问 `my-example-widget` 资源。

如果您需要帮助，请联系您的 AWS 管理员。您的管理员是提供登录凭证的人。

## 我无权执行 iam：PassRole
<a name="security_iam_troubleshoot-passrole"></a>

如果您收到一个错误，指明您无权执行 `iam:PassRole` 操作，则必须更新策略以允许您将角色传递给 Amazon SNS。

有些 AWS 服务 允许您将现有角色传递给该服务，而不是创建新的服务角色或服务相关角色。为此，您必须具有将角色传递到服务的权限。

当名为 `marymajor` 的 IAM 用户尝试使用控制台在 Amazon SNS 中执行操作时，会发生以下示例错误。但是，服务必须具有服务角色所授予的权限才可执行此操作。Mary 不具有将角色传递到服务的权限。

```
User: arn:aws:iam::123456789012:user/marymajor is not authorized to perform: iam:PassRole
```

在这种情况下，必须更新 Mary 的策略以允许她执行 `iam:PassRole` 操作。

如果您需要帮助，请联系您的 AWS 管理员。您的管理员是提供登录凭证的人。

## 我想允许我以外的人访问我 AWS 账户 的 Amazon SNS 资源
<a name="security_iam_troubleshoot-cross-account-access"></a>

您可以创建一个角色，以便其他账户中的用户或您组织外的人员可以使用该角色来访问您的资源。您可以指定谁值得信赖，可以代入角色。对于支持基于资源的策略或访问控制列表 (ACLs) 的服务，您可以使用这些策略向人们授予访问您的资源的权限。

要了解更多信息，请参阅以下内容：
+ 要了解 Amazon SNS 是否支持这些功能，请参阅[Amazon SNS 如何与 IAM 配合使用](security_iam_service-with-iam.md)。
+ 要了解如何提供对您拥有的资源的访问权限 AWS 账户 ，请参阅 [IAM 用户*指南中的向您拥有 AWS 账户 的另一个 IAM 用户*提供访问](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_common-scenarios_aws-accounts.html)权限。
+ 要了解如何向第三方提供对您的资源的访问[权限 AWS 账户，请参阅 *IAM 用户指南*中的向第三方提供](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_common-scenarios_third-party.html)访问权限。 AWS 账户 
+ 要了解如何通过身份联合验证提供访问权限，请参阅《IAM 用户指南》**中的[为经过外部身份验证的用户（身份联合验证）提供访问权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_common-scenarios_federated-users.html)。
+ 要了解使用角色和基于资源的策略进行跨账户访问之间的差别，请参阅《IAM 用户指南》**中的 [IAM 中的跨账户资源访问](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies-cross-account-resource-access.html)。