

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

# 使用身份验证策略控制对VPC莱迪思服务的访问
<a name="auth-policies"></a>

VPC Lattice 验证策略是 IAM policy 文档，您可以将其附加到服务网络或服务，以控制指定主体是否可以访问一组服务或特定服务。您可以将一个验证策略附加到您要控制访问的每个服务网络或服务。

**注意**  
服务网络上的身份验证策略不适用于服务网络中的资源配置。

验证策略不同于 IAM 基于身份的策略。IAM 基于身份的策略附加到 IAM 用户、组或角色，并定义这些身份可以对哪些资源执行哪些操作。验证策略附加到服务和服务网络。要使授权成功，验证策略和基于身份的策略都需要具有显式允许语句。有关更多信息，请参阅 [授权的工作原理](#auth-policies-evaluation-logic)。

您可以使用 AWS CLI 和控制台查看、添加、更新或删除服务和服务网络上的身份验证策略。添加、更新或删除身份验证策略时，可能需要几分钟才能准备就绪。使用时 AWS CLI，请确保您位于正确的区域。您可以更改个人资料的默认区域，也可以将`--region`参数与命令一起使用。

**Topics**
+ [验证策略中的常用元素](#auth-policies-common-elements)
+ [验证策略的资源格式](#auth-policies-resource-format)
+ [可在验证策略中使用的条件键](#auth-policies-condition-keys)
+ [资源标签](#resource-tags)
+ [校长标签](#principal-tags)
+ [匿名（未经验证）主体](#anonymous-unauthenticated-principals)
+ [示例验证策略](#example-auth-policies)
+ [授权的工作原理](#auth-policies-evaluation-logic)

要开始使用验证策略，请按照以下过程创建适用于服务网络的验证策略。对于您不想应用于其他服务的更具限制性的权限，您可以选择在单个服务上设置验证策略。

## 使用验证策略管理对服务网络的访问
<a name="manage-access-to-service-networks"></a>

以下 AWS CLI 任务向您展示如何使用身份验证策略管理对服务网络的访问权限。有关使用控制台的说明，请参阅 [VPC Lattice 中的服务网络](service-networks.md)。

**Topics**
+ [向服务网络添加验证策略](#add-service-network-auth-policy)
+ [更改服务网络的验证类型](#change-service-network-auth-type)
+ [从服务网络中删除验证策略](#remove-service-network-auth-policy)

### 向服务网络添加验证策略
<a name="add-service-network-auth-policy"></a>

按照本节中的步骤 AWS CLI 使用：
+ 使用 IAM 在服务网络上启用访问控制。
+ 向服务网络添加验证策略。如果不添加验证策略，则所有流量都将收到拒绝访问错误。

**要启用访问控制并向新服务网络添加验证策略**

1. 要在服务网络上启用访问控制，使服务网络能够使用验证策略，请使用具有 `--auth-type` 选项和值为 `AWS_IAM` 的 **create-service-network** 命令。

   ```
   aws vpc-lattice create-service-network --name Name --auth-type AWS_IAM [--tags TagSpecification]
   ```

   如果成功，该命令将返回类似于以下内容的输出。

   ```
   {
      "arn": "arn",
      "authType": "AWS_IAM",
      "id": "sn-0123456789abcdef0",
      "name": "Name"
   }
   ```

1. 使用 **put-auth-policy** 命令，指定要在其中添加验证策略的服务网络 ID，以及要添加的验证策略。

   例如，使用以下命令为 ID 为 *`sn-0123456789abcdef0`* 的服务网络创建验证策略。

   ```
   aws vpc-lattice put-auth-policy --resource-identifier sn-0123456789abcdef0 --policy file://policy.json
   ```

   使用 JSON 创建策略定义。有关更多信息，请参阅 [验证策略中的常用元素](#auth-policies-common-elements)。

   如果成功，该命令将返回类似于以下内容的输出。

   ```
   {
      "policy": "policy",
      "state": "Active"
   }
   ```

**要启用访问控制并向现有服务网络添加验证策略**

1. 要在服务网络上启用访问控制，使服务网络能够使用验证策略，请使用具有 `--auth-type` 选项和值为 `AWS_IAM` 的 **update-service-network** 命令。

   ```
   aws vpc-lattice update-service-network --service-network-identifier sn-0123456789abcdef0 --auth-type AWS_IAM
   ```

   如果成功，该命令将返回类似于以下内容的输出。

   ```
   {
      "arn": "arn",
      "authType": "AWS_IAM",
      "id": "sn-0123456789abcdef0",
      "name": "Name"
   }
   ```

1. 使用 **put-auth-policy** 命令，指定要在其中添加验证策略的服务网络 ID，以及要添加的验证策略。

   ```
   aws vpc-lattice put-auth-policy --resource-identifier sn-0123456789abcdef0 --policy file://policy.json
   ```

   使用 JSON 创建策略定义。有关更多信息，请参阅 [验证策略中的常用元素](#auth-policies-common-elements)。

   如果成功，该命令将返回类似于以下内容的输出。

   ```
   {
      "policy": "policy",
      "state": "Active"
   }
   ```

### 更改服务网络的验证类型
<a name="change-service-network-auth-type"></a>

**要禁用服务网络的验证策略**  
使用具有 `--auth-type` 选项和值为 `NONE` 的 **update-service-network** 命令。

```
aws vpc-lattice update-service-network --service-network-identifier sn-0123456789abcdef0 --auth-type NONE
```

如果之后需要再次启用验证策略，请使用为 `--auth-type` 选项指定的 `AWS_IAM` 运行此命令。

### 从服务网络中删除验证策略
<a name="remove-service-network-auth-policy"></a>

**要从服务网络中删除验证策略**  
使用 **delete-auth-policy** 命令。

```
aws vpc-lattice delete-auth-policy --resource-identifier sn-0123456789abcdef0
```

如果在将服务网络的验证类型更改为 `NONE` 之前删除验证策略，则请求会失败。

## 使用验证策略管理对服务的访问
<a name="manage-access-to-services"></a>

以下 AWS CLI 任务向您展示如何使用身份验证策略管理对服务的访问权限。有关使用控制台的说明，请参阅 [VPC Lattice 中的服务](services.md)。

**Topics**
+ [向服务添加验证策略](#add-service-auth-policy)
+ [更改服务的验证类型](#change-service-auth-type)
+ [从服务中删除验证策略](#remove-service-auth-policy)

### 向服务添加验证策略
<a name="add-service-auth-policy"></a>

请按照以下步骤 AWS CLI 使用：
+ 使用 IAM 在服务上启用访问控制。
+ 向服务添加验证策略。如果不添加验证策略，则所有流量都将收到拒绝访问错误。

**要启用访问控制并向新服务添加验证策略**

1. 要在服务上启用访问控制，使服务能够使用验证策略，请使用具有 `--auth-type` 选项和值为 `AWS_IAM` 的 **create-service** 命令。

   ```
   aws vpc-lattice create-service --name Name --auth-type AWS_IAM [--tags TagSpecification]
   ```

   如果成功，该命令将返回类似于以下内容的输出。

   ```
   {
      "arn": "arn",
      "authType": "AWS_IAM",
      "dnsEntry": { 
         ...
      },
      "id": "svc-0123456789abcdef0",
      "name": "Name",
      "status": "CREATE_IN_PROGRESS"
   }
   ```

1. 使用 **put-auth-policy** 命令，指定要在其中添加验证策略的服务 ID，以及要添加的验证策略。

   例如，使用以下命令为具有 ID *svc-0123456789abcdef0* 的服务创建身份验证策略。

   ```
   aws vpc-lattice put-auth-policy --resource-identifier svc-0123456789abcdef0 --policy file://policy.json
   ```

   使用 JSON 创建策略定义。有关更多信息，请参阅 [验证策略中的常用元素](#auth-policies-common-elements)。

   如果成功，该命令将返回类似于以下内容的输出。

   ```
   {
      "policy": "policy",
      "state": "Active"
   }
   ```

**要启用访问控制并向现有服务添加验证策略**

1. 要在服务上启用访问控制，使服务能够使用验证策略，请使用具有 `--auth-type` 选项和值为 `AWS_IAM` 的 **update-service** 命令。

   ```
   aws vpc-lattice update-service --service-identifier svc-0123456789abcdef0 --auth-type AWS_IAM
   ```

   如果成功，该命令将返回类似于以下内容的输出。

   ```
   {
      "arn": "arn",
      "authType": "AWS_IAM",
      "id": "svc-0123456789abcdef0",
      "name": "Name"
   }
   ```

1. 使用 **put-auth-policy** 命令，指定要在其中添加验证策略的服务 ID，以及要添加的验证策略。

   ```
   aws vpc-lattice put-auth-policy --resource-identifier svc-0123456789abcdef0 --policy file://policy.json
   ```

   使用 JSON 创建策略定义。有关更多信息，请参阅 [验证策略中的常用元素](#auth-policies-common-elements)。

   如果成功，该命令将返回类似于以下内容的输出。

   ```
   {
      "policy": "policy",
      "state": "Active"
   }
   ```

### 更改服务的验证类型
<a name="change-service-auth-type"></a>

**要禁用服务的验证策略**  
使用具有 `--auth-type` 选项和值为 `NONE` 的 **update-service** 命令。

```
aws vpc-lattice update-service --service-identifier svc-0123456789abcdef0 --auth-type NONE
```

如果之后需要再次启用验证策略，请使用为 `--auth-type` 选项指定的 `AWS_IAM` 运行此命令。

### 从服务中删除验证策略
<a name="remove-service-auth-policy"></a>

**要从服务中删除验证策略**  
使用 **delete-auth-policy** 命令。

```
aws vpc-lattice delete-auth-policy --resource-identifier svc-0123456789abcdef0
```

如果在将服务的验证类型更改为 `NONE` 之前删除验证策略，则请求会失败。

如果启用验证策略，该验证策略需要对服务发出经过验证的请求，则对服务的任何请求都必须包含使用签名版本 4（SigV4）计算的有效请求签名。有关更多信息，请参阅 [SIGv4 经身份验证的 Amazon VPC Lattice 请求](sigv4-authenticated-requests.md)。

## 验证策略中的常用元素
<a name="auth-policies-common-elements"></a>

指定 VPC Lattice 验证策略所用的语法与 IAM 策略相同。有关更多信息，请参见《IAM 用户指南》**中的[基于身份的策略和基于资源的策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_identity-vs-resource.html)。

验证策略包含以下元素：
+ **主体**：允许访问语句中的操作和资源的人员或应用程序。在验证策略中，主体是接收此权限的 IAM 实体。主体作为 IAM 实体经过验证，以向特定资源或资源组（如服务网络中的服务）发出请求。

  您必须在基于资源的策略中指定主体。委托人可以包括账户、用户、角色、联合用户或 AWS 服务。有关更多信息，请参阅《IAM 用户指南》**中的 [AWS JSON 策略元素：主体](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html)。
+ **效果**：指定主体请求特定操作时的效果。此值可以是 `Allow` 或 `Deny`。默认情况下，当您使用 IAM 在服务或服务网络上启用访问控制时，主体无权向服务或服务网络发出请求。
+ **操作**-您授予或拒绝权限的特定 API 操作。VPC Lattice 支持使用`vpc-lattice-svcs`前缀的操作。有关更多信息，请参阅[《服务*授权参考》中的 Amazon VPC Lattice 服务*定义的操作](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonvpclatticeservices.html#amazonvpclatticeservices-actions-as-permissions)。
+ **资源**：受操作影响的服务。
+ **条件**：条件是可选的。您可以使用它们来控制您的策略何时生效。有关更多信息，请参阅《服务授权参考》**中的 [Amazon VPC Lattice 服务的条件键](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonvpclatticeservices.html#amazonvpclatticeservices-policy-keys)。

在创建和管理验证策略时，您可能希望使用 [IAM Policy Generator](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html#access_policies_create-generator)。

**要求**  
JSON 中的策略不得包含换行符或空行。

## 验证策略的资源格式
<a name="auth-policies-resource-format"></a>

您可以通过创建一个验证策略来限制对特定资源的访问，该策略使用具有 `<serviceARN>/<path>` 模式的匹配架构，并对 `Resource` 元素进行编码，如以下示例所示。


| 协议 | 示例 | 
| --- | --- | 
| HTTP |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/vpc-lattice/latest/ug/auth-policies.html)  | 
| gRPC |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/vpc-lattice/latest/ug/auth-policies.html)  | 

对 `<serviceARN>` 使用以下 Amazon 资源名称（ARN）资源格式：

```
arn:aws:vpc-lattice:region:account-id:service/service-id
```

例如：

```
"Resource": "arn:aws:vpc-lattice:us-west-2:123456789012:service/svc-0123456789abcdef0"
```

## 可在验证策略中使用的条件键
<a name="auth-policies-condition-keys"></a>

通过验证策略的 **Condition** 元素中的条件键，可进一步控制访问。这些条件键是否可用于评估，具体取决于协议以及请求使用的是[签名版本 4（SigV4）](sigv4-authenticated-requests.md)签名还是匿名签名。条件键区分大小写。

AWS 提供了可用于控制访问权限的全局条件键，例如`aws:PrincipalOrgID`和`aws:SourceIp`。要查看全 AWS 局条件键列表，请参阅 *IAM 用户指南*中的[AWS 全局条件上下文密钥](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html)。

下表列出了 VPC Lattice 条件键。有关更多信息，请参阅《服务授权参考》**中的 [Amazon VPC Lattice 服务的条件键](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonvpclatticeservices.html#amazonvpclatticeservices-policy-keys)。


| 条件键 | 说明 | 示例 | 适用于匿名（未经验证）调用方？ | 适用于 gRPC？ | 
| --- | --- | --- | --- | --- | 
| vpc-lattice-svcs:Port | 按发出请求的服务端口筛选访问 | 80 | 支持 | 是 | 
| vpc-lattice-svcs:RequestMethod | 按请求的方式筛选访问权限 | GET | 是 | 始终 POST | 
| vpc-lattice-svcs:RequestPath | 按请求 URL 的路径部分筛选访问权限 | /path | 支持 | 是 | 
| vpc-lattice-svcs:RequestHeader/header-name: value | 按请求标头中的标头名称-值对筛选访问权限 | content-type: application/json | 支持 | 是 | 
| vpc-lattice-svcs:RequestQueryString/key-name: value | 按请求 URL 中的查询字符串键值筛选访问权限 | quux: [corge, grault] | 是 | 否 | 
| vpc-lattice-svcs:ServiceNetworkArn | 通过接收请求的服务，其服务网络的 ARN 筛选访问 | arn:aws:vpc-lattice:us-west-2:123456789012:servicenetwork/sn-0123456789abcdef0 | 支持 | 是 | 
| vpc-lattice-svcs:ServiceArn | 通过接收请求的服务的 ARN 筛选访问 | arn:aws:vpc-lattice:us-west-2:123456789012:service/svc-0123456789abcdef0 | 支持 | 是 | 
| vpc-lattice-svcs:SourceVpc | 按发出请求的 VPC 筛选访问权限 | vpc-1a2b3c4d | 支持 | 是 | 
| vpc-lattice-svcs:SourceVpcOwnerAccount | 按发出请求的 VPC 的拥有账户筛选访问权限 | 123456789012 | 支持 | 是 | 

## 资源标签
<a name="resource-tags"></a>

*标签*是您分配或分配给 AWS 资源的元数据标签。 AWS 每个 标签具有两个部分：
+ *标签键*（例如，`CostCenter`、`Environment` 或 `Project`）。标签键区分大小写。
+ 一个称为*标签值* 的可选字段（例如，`111122223333` 或 `Production`）。省略标签值与使用空字符串相同。与标签键一样，标签值区分大小写。

有关标记的更多信息，请参阅[使用标签控制对 AWS 资源的访问权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_tags.html)

您可以使用`aws:ResourceTag/key` AWS 全局条件上下文密钥在身份验证策略中使用标签。

以下示例策略授予对带有标签的服务的访问权限`Environment=Gamma`。此政策允许您引用没有硬编码服务的服务 ARNs 或. IDs 

```
{
  "Version": "2012-10-17", 		 	 	 		 	 	 
  "Statement": [
    {
      "Sid": "AllowGammaAccess",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "vpc-lattice-svcs:Invoke",
      "Resource": "arn:aws:vpc-lattice:us-west-2:123456789012:service/svc-0124446789abcdef0/*",
      "Condition": {
        "StringEquals": {
          "aws:ResourceTag/Environment": "Gamma",
        }
      }
    }
  ]
}
```

## 校长标签
<a name="principal-tags"></a>

您可以根据呼叫者身份所附的标签来控制对服务和资源的访问权限。VPC Lattice 支持使用`aws:PrincipalTag/context`变量根据用户、角色或会话标签上的任何主体标签进行访问控制。有关更多信息，请参阅[控制 IAM 主体进行的访问](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_iam-tags.html#access_iam-tags_control-principals)。

以下示例策略仅向带有标签的身份授予访问权限`Team=Payments`。此策略允许您控制访问权限，而无需对帐户 IDs 或角色进行硬编码。 ARNs

```
{
  "Version": "2012-10-17", 		 	 	 		 	 	 
  "Statement": [
    {
      "Sid": "AllowPaymentsTeam",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "vpc-lattice-svcs:Invoke",
      "Resource": "arn:aws:vpc-lattice:us-west-2:123456789012:service/svc-0123456789abcdef0/*",
      "Condition": {
        "StringEquals": {
          "aws:PrincipalTag/Team": "Payments",
        }
      }
    }
  ]
}
```

## 匿名（未经验证）主体
<a name="anonymous-unauthenticated-principals"></a>

匿名委托人是指不使用[签名版本 4 (Sigv4)](sigv4-authenticated-requests.md) 签署 AWS 请求且位于与服务网络相连的 VPC 内的来电者。如果验证策略允许，匿名主体可以向服务网络中的服务发出未经验证的请求。

## 示例验证策略
<a name="example-auth-policies"></a>

以下是要求由经过验证的主体发出请求的验证策略示例。

所有示例都使用该`us-west-2`地区并包含虚构账户。 IDs

**示例 1：限制特定 AWS 组织访问服务**  
以下验证策略示例向任何经过验证的请求授予权限，以访问该策略适用的服务网络中的任何服务。但是，请求必须来自属于条件中指定的 AWS 组织的委托人。

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

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
      {
         "Effect": "Allow",
         "Principal": "*",
         "Action": "vpc-lattice-svcs:Invoke",
         "Resource": "*",
         "Condition": {
            "StringEquals": {
               "aws:PrincipalOrgID": [ 
                  "o-123456example"
               ]
            }
         }
      }
   ]
}
```

------

**示例 2：限制特定 IAM 角色对服务的访问**  
以下验证策略示例向任何经过验证的请求授予权限，该请求使用 IAM 角色 `rates-client` 对 `Resource` 元素中指定的服务发出 HTTP GET 请求。`Resource` 元素中的资源与策略附加到的服务相同。

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

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect": "Allow",
         "Principal": {
            "AWS": [
               "arn:aws:iam::123456789012:role/rates-client"
            ]
         },
         "Action": "vpc-lattice-svcs:Invoke",
         "Resource": [
            "arn:aws:vpc-lattice:us-west-2:123456789012:service/svc-0123456789abcdef0/*"
         ],
         "Condition": {
            "StringEquals": {
               "vpc-lattice-svcs:RequestMethod": "GET"
            }
         }
      }
   ]
}
```

------

**示例 3：限制特定 VPC 中经过验证的主体访问服务**  
以下验证策略示例仅允许来自 VPC 中主体（VPC ID 为 `vpc-1a2b3c4d`）的经过验证的请求。

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

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
      {
         "Effect": "Allow",
         "Principal": "*",
         "Action": "vpc-lattice-svcs:Invoke",
         "Resource": "*",
         "Condition": {
            "StringNotEquals": {
               "aws:PrincipalType": "Anonymous"
            },
            "StringEquals": {
               "vpc-lattice-svcs:SourceVpc": "vpc-1a2b3c4d"
            }
         }
      }
   ]
}
```

------

## 授权的工作原理
<a name="auth-policies-evaluation-logic"></a>

当VPC Lattice服务收到请求时， AWS 执行代码会一起评估所有相关的权限策略，以确定是授权还是拒绝该请求。在授权过程中，服务会评估请求上下文中适用的所有 IAM 基于身份的策略和验证策略。默认情况下，当验证类型为 `AWS_IAM` 时，会隐式拒绝所有请求。所有相关策略的显式允许将覆盖默认值。

授权包括：
+ 收集所有相关的 IAM 基于身份的策略和验证策略。
+ 评估生成的策略集：
  + 验证请求方（如 IAM 用户或角色）是否有权从请求方所属的账户执行操作。如果没有明确的 allow 语句，则 AWS 不对请求进行授权。
  + 验证服务网络的验证策略是否允许请求。如果启用了身份验证策略，但没有明确的 allow 声明， AWS 则不授权该请求。如果有显式允许语句，或者验证类型为 `NONE`，则代码将继续。
  + 验证服务的验证策略是否允许请求。如果启用了身份验证策略，但没有明确的 allow 声明， AWS 则不授权该请求。如果有显式允许语句，或者验证类型为 `NONE`，则执行代码将返回最终决定 **Allow**。
  + 任何策略中的显式拒绝将覆盖任何允许。

下图显示授权工作流。发出请求时，相关策略允许或拒绝请求访问给定服务。

![\[授权工作流\]](http://docs.aws.amazon.com/zh_cn/vpc-lattice/latest/ug/images/authpolicy.png)
