

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

# 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>

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