

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

# Amazon VPC Lattice 中的安全性
<a name="security"></a>

云安全 AWS 是重中之重。作为 AWS 客户，您可以受益于专为满足大多数安全敏感型组织的要求而构建的数据中心和网络架构。

您负责维护对托管在此基础结构上的内容的控制。[责任共担模式](https://aws.amazon.com/compliance/shared-responsibility-model/)将其描述为云*的*安全性和云*中*的安全性：
+ **云安全** — AWS 负责保护在云中运行 AWS 服务的基础架构 AWS 云。 AWS 还为您提供可以安全使用的服务。作为[AWS 合规计划合规计划合规计划合](https://aws.amazon.com/compliance/programs/)的一部分，第三方审计师定期测试和验证我们安全的有效性。要了解适用于 Amazon VPC Lattice 的合规计划，请参阅AWS 按合规计划划分的[范围内AWS 服务按合规计划](https://aws.amazon.com/compliance/services-in-scope/)。
+ **云中的安全性**：您负责维护对托管在此基础设施上的内容进行控制。您还需要对其他因素负责，包括您的数据的敏感性、您公司的要求以及适用的法律法规。

本文档可帮助您了解在使用 VPC Lattice 时如何应用分担责任模式。以下主题展示了如何配置 VPC Lattice，以满足您的安全性和合规性目标。您还将学习如何使用其他 AWS 服务，这些服务可帮助您监控和保护您的VPC Lattice服务、服务网络和资源配置。

**Topics**
+ [管理对VPC莱迪思服务的访问权限](access-management-overview.md)
+ [Amazon VPC Lattice 中的数据保护](data-protection.md)
+ [适用于 Amazon VPC Lattice 的身份和访问管理](security-iam.md)
+ [Amazon VPC Lattice 的合规性验证](compliance-validation.md)
+ [使用接口终端节点访问 Amazon VPC Lattice ()AWS PrivateLink](vpc-interface-endpoints.md)
+ [Amazon VPC Lattice 的弹性](disaster-recovery-resiliency.md)
+ [Amazon VPC 莱迪思的基础设施安全](infrastructure-security.md)

# 管理对VPC莱迪思服务的访问权限
<a name="access-management-overview"></a>

默认情况下，VPC Lattice是安全的，因为您必须明确提供访问哪些服务和资源配置以及使用哪些 VPCs服务和资源配置。您可以通过 VPC 关联或服务网络类型的 VPC 终端节点访问服务。对于多账户方案，您可以使用[AWS Resource Access Manager](sharing.md)跨账户边界共享服务、资源配置和服务网络。

 VPC Lattice 提供了一个框架，让您可以在网络的多个层实施 defense-in-depth 策略。
+ **第一层** — 服务、资源、VPC 和 VPC 终端节点与服务网络的关联。VPC 可以通过关联或通过 VPC 终端节点连接到服务网络。如果 VPC 未连接到服务网络，则 VPC 中的客户端将无法访问与服务网络关联的服务和资源配置。
+ **第二层** — 服务网络的可选网络级安全保护，例如安全组和网络 ACLs。通过使用这些，您可以允许访问 VPC 中的特定客户端组，而不是 VPC 中的所有客户端。
+ **第三层**：可选的 VPC Lattice 验证策略。您可以将验证策略应用于服务网络和单个服务。通常，服务网络上的验证策略由网络或云管理员操作，以实现粗粒度授权。例如，仅允许来自 AWS Organizations中特定组织的经过验证的请求。对于服务级别的验证策略，服务所有者通常会设置细粒度控制，此类控制可能比在服务网络级别应用的粗粒度授权更具限制性。
**注意**  
服务网络上的身份验证策略不适用于服务网络中的资源配置。

**访问控制方法**
+ [验证策略](auth-policies.md)
+ [安全组](security-groups.md)
+ [网络 ACLs](network-acls.md)

# 使用身份验证策略控制对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)


# 使用安全组控制 VPC Lattice 中的流量
<a name="security-groups"></a>

AWS 安全组充当虚拟防火墙，控制与其关联的实体的进出网络流量。借助 VPC Lattice，您可以创建安全组并将其分配给将 VPC 连接到服务网络的 VPC 关联，从而为您的服务网络实施额外的网络级安全保护。如果您使用 VPC 终端节点将 VPC 连接到服务网络，则也可以为 VPC 终端节点分配安全组。同样，您可以将安全组分配给您创建的资源网关，以允许访问您的 VPC 中的资源。

**Topics**
+ [托管前缀列表](#managed-prefix-list)
+ [安全组规则](#security-groups-rules)
+ [管理 VPC 关联的安全组](#service-network-security-group)

## 托管前缀列表
<a name="managed-prefix-list"></a>

VPC Lattice 提供托管前缀列表，其中包括当您使用服务网络关联通过 VPC 关联将您的 VPC 连接到服务网络时，用于通过 VPC 莱迪思网络路由流量的 IP 地址。它们要么 IPs 是本地私有链路，要么是不可路由的 IPs 公共链路。 IPs

 您可以在安全组规则中引用 VPC Lattice 托管前缀列表。此操作允许流量从客户端流出，经过 VPC Lattice 服务网络，流向 VPC Lattice 服务目标。

例如，假设您有一个 EC2 实例注册为美国西部（俄勒冈州）区域（`us-west-2`）中的目标。您可以向实例安全组添加一条规则，允许来自 VPC Lattice 托管前缀列表的入站 HTTPS 访问，以便该区域中的 VPC Lattice 流量可以到达该实例。如果您从安全组中删除所有其他入站规则，则可以阻止 VPC Lattice 流量以外的任何流量到达实例。

VPC Lattice 的托管前缀列表名称如下：
+ com.amazonaws。 *region*.vpc-lattice
+ com.amazonaws。 *region*.ipv6.vpc-lattice

有关更多信息，请参阅《*Amazon VPC 用户指南*》中的 [AWS托管的前缀列表](https://docs.aws.amazon.com/vpc/latest/userguide/working-with-aws-managed-prefix-lists.html#available-aws-managed-prefix-lists)。

**Windows 和 macOS 客户端**  
VPC Lattice 前缀列表中的地址是链路本地地址和不可路由的公有地址。如果您从这些客户端连接到 VPC Lattice，则必须更新其配置，以便将托管前缀列表中的 IP 地址转发到客户端的主要 IP 地址。以下是更新 Windows 客户端配置的命令示例，其中169.254.171.0是托管前缀列表中的地址之一。

```
C:\> route add 169.254.171.0 mask 255.255.255.0 primary-ip-address
```

以下是更新 macOS 客户端配置的命令示例，其中 macOS 客户端169.254.171.0是托管前缀列表中的地址之一。

```
sudo route -n add -net 169.254.171.0 primary-ip-address 255.255.255.0
```

为避免创建静态路由，我们建议您使用 VPC 中的服务网络终端节点来建立连接。有关更多信息，请参阅 [管理服务网络 VPC 终端节点关联](service-network-associations.md#service-network-vpc-endpoint-associations)。

## 安全组规则
<a name="security-groups-rules"></a>

无论有没有安全组，使用 VPC Lattice 都不会影响现有的 VPC 安全组配置。但您可以随时添加自己的安全组。

**重要注意事项**
+ 客户端的安全组规则控制VPC Lattice的出站流量。
+ 目标的安全组规则控制从 VPC Lattice 到目标的入站流量，包括运行状况检查流量。
+ 服务网络和 VPC 之间关联的安全组规则，控制哪些客户端可以访问 VPC Lattice 服务网络。
+ 资源网关的安全组规则控制从资源网关到资源的出站流量。

**从资源网关流向数据库资源的流量推荐的出站规则**  
要使流量从资源网关流向资源，必须为开放端口创建出站规则，为资源创建接受的侦听器协议。


| 目标位置 | 协议 | 端口范围 | Comment | 
| --- | --- | --- | --- | 
| CIDR range for resource | TCP | 3306 | 允许从资源网关到数据库的流量 | 

**针对服务网络和 VPC 关联的推荐入站规则**  
要使流量从客户端流 VPCs 向与服务网络关联的服务，必须为侦听器端口创建入站规则，为服务创建侦听器协议。


| 来源 | 协议 | 端口范围 | Comment | 
| --- | --- | --- | --- | 
| VPC CIDR | listener | listener | 允许来自客户端的流量到莱迪思VPC | 

**推荐出站规则，针对从客户端实例流向 VPC Lattice 的流量**  
默认情况下，安全组允许所有出站流量。但是，如果您有自定义出站规则，则必须允许出站流量到VPC Lattice前缀作为监听器端口和协议，以便客户端实例可以连接到与VPC Lattice服务网络关联的所有服务。您可以通过引用 VPC Lattice 的前缀列表的 ID 来允许此流量。


| 目标位置 | 协议 | 端口范围 | Comment | 
| --- | --- | --- | --- | 
| ID of the VPC Lattice prefix list | listener | listener | 允许来自客户端的流量到莱迪思VPC | 

**推荐入站规则，针对从 VPC Lattice 流向目标实例的流量**  
由于流量来自 VPC Lattice，因此您不能将客户端安全组用作目标安全组的源。您可以引用 VPC 莱迪思的前缀列表的 ID。


| 来源 | 协议 | 端口范围 | Comment | 
| --- | --- | --- | --- | 
| ID of the VPC Lattice prefix list | target | target | 允许从 VPC 莱迪思到目标的流量 | 
| ID of the VPC Lattice prefix list | health check | health check | 允许从 VPC 莱迪思到目标的运行状况检查流量 | 

## 管理 VPC 关联的安全组
<a name="service-network-security-group"></a>

您可以使用查看、添加或更新 VPC 上的安全组与服务网络关联。 AWS CLI 使用时 AWS CLI，请记住您的命令在 AWS 区域 配置文件中运行。如果您想要在不同的区域中运行命令，可以为配置文件更改默认区域，或者与命令一起使用 `--region` 参数。

开始之前，确认您已在与要添加到服务网络的 VPC 相同的 VPC 中创建安全组。有关更多信息，请参阅 *Amazon VPC 用户指南*中的[使用安全组控制资源流量](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-security-groups.html)

**要使用控制台在创建 VPC 关联时添加安全组**

1. 打开位于 [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/) 的 Amazon VPC 控制台。

1. 在导航窗格中的 **VPC Lattice** 下，选择**服务网络**。

1. 选择服务网络名称以打开其详细信息页面。

1. 在 **VPC 关联**选项卡上，选择**创建 VPC 关联**，然后选择**添加 VPC 关联**。

1. 选择一个 VPC 和最多 5 个安全组。

1. 选择**保存更改**。

**要使用控制台为现有 VPC 关联添加或更新安全组**

1. 打开位于 [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/) 的 Amazon VPC 控制台。

1. 在导航窗格中的 **VPC Lattice** 下，选择**服务网络**。

1. 选择服务网络名称以打开其详细信息页面。

1. 在 **VPC 关联**选项卡上，选中关联的复选框，然后依次选择**操作**和**编辑安全组**。

1. 根据需要添加和删除安全组。

1. 选择**保存更改**。

**在创建 VPC 关联时使用添加安全组 AWS CLI**  
使用 [create-service-network-vpc-assoc](https://docs.aws.amazon.com/cli/latest/reference/vpc-lattice/create-service-network-vpc-association.html) iation 命令，指定 VPC 关联的 VPC 的 ID 和要添加的安全组的 ID。

```
aws vpc-lattice create-service-network-vpc-association \
    --service-network-identifier sn-0123456789abcdef0 \
    --vpc-identifier vpc-1a2b3c4d \
    --security-group-ids sg-7c2270198example
```

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

```
{
  "arn": "arn",
  "createdBy": "464296918874",
  "id": "snva-0123456789abcdef0",
  "status": "CREATE_IN_PROGRESS",
  "securityGroupIds": ["sg-7c2270198example"]
}
```

**要为现有 VPC 关联添加或更新安全组，请使用 AWS CLI**  
使用 [update-service-network-vpc-assoc](https://docs.aws.amazon.com/cli/latest/reference/vpc-lattice/update-service-network-vpc-association.html) iation命令，指定服务网络和安全 IDs 组的 ID。这些安全组会覆盖先前关联的任何安全组。更新列表时，至少定义一个安全组。

```
aws vpc-lattice update-service-network-vpc-association 
    --service-network-vpc-association-identifier sn-903004f88example \
    --security-group-ids sg-7c2270198example sg-903004f88example
```

**警告**  
您无法删除所有安全组。您必须先删除 VPC 关联，然后在没有任何安全组的情况下重新创建 VPC 关联。删除 VPC 关联时要小心。此操作将阻止流量到达该服务网络中的服务。

# 使用网络控制通往莱迪思的VPC流量 ACLs
<a name="network-acls"></a>

网络访问控制列表 (ACL) 在子网级别允许或拒绝特定的入站或出站流量。默认网络 ACL 允许所有入站和出站流量。您可以 ACLs 为子网创建自定义网络，以提供额外的安全层。有关更多信息，请参阅 *Amazon VPC 用户指南 ACLs*中的[网络](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-network-acls.html)。

**Topics**
+ [您的客户端 ACLs 子网的网络](#network-acl-client-subnets)
+ [目标 ACLs 子网的网络](#network-acl-target-subnets)

## 您的客户端 ACLs 子网的网络
<a name="network-acl-client-subnets"></a>

客户端子网 ACLs 的网络必须允许客户端和VPC Lattice之间的流量。您可以从 VPC Lattice 的[托管前缀列表](security-groups.md#managed-prefix-list)中获取允许的 IP 地址范围。

以下是入站规则示例。


| 来源 | 协议 | 端口范围 | Comment | 
| --- | --- | --- | --- | 
| vpc\$1lattice\$1cidr\$1block | TCP | 1025-65535 | 允许从 VPC Lattice 到客户端的流量 | 

以下是出站规则的示例。


| 目标位置 | 协议 | 端口范围 | Comment | 
| --- | --- | --- | --- | 
| vpc\$1lattice\$1cidr\$1block | listener | listener | 允许来自客户端的流量到莱迪思VPC | 

## 目标 ACLs 子网的网络
<a name="network-acl-target-subnets"></a>

目标子网 ACLs 的网络必须允许目标端口和运行状况检查端口上的目标与 VPC Lattice 之间的流量。您可以从 VPC Lattice 的[托管前缀列表](security-groups.md#managed-prefix-list)中获取允许的 IP 地址范围。

以下是入站规则示例。


| 来源 | 协议 | 端口范围 | Comment | 
| --- | --- | --- | --- | 
| vpc\$1lattice\$1cidr\$1block | target | target | 允许从 VPC 莱迪思到目标的流量 | 
| vpc\$1lattice\$1cidr\$1block | health check | health check | 允许从 VPC 莱迪思到目标的运行状况检查流量 | 

以下是出站规则的示例。


| 目标位置 | 协议 | 端口范围 | Comment | 
| --- | --- | --- | --- | 
| vpc\$1lattice\$1cidr\$1block | target | 1024-65535 | 允许从目标到 VPC Lattice 的流量 | 
| vpc\$1lattice\$1cidr\$1block | health check | 1024-65535 | 允许从目标到 VPC Lattice 的运行状况检查流量 | 

# SIGv4 经身份验证的 Amazon VPC Lattice 请求
<a name="sigv4-authenticated-requests"></a>

VPC Lattice 使用签名版本 4 (SIGv4) 或签名版本 4A (SIGv4A) 进行客户端身份验证。有关更多信息，请参阅*《IAM 用户指南》*中的[适用于 API 请求的AWS 签名版本 4](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_sigv.html)。

**注意事项**
+ VPC Lattice 会尝试对任何使用 SIGv4 或 SIGv4 A 签名的请求进行身份验证。未经验证，请求失败。
+ VPC Lattice 不支持有效负载签名。必须发送 `x-amz-content-sha256` 标头，其值设置为 `"UNSIGNED-PAYLOAD"`。

**Topics**
+ [Python](#sigv4-authenticated-requests-python)
+ [Java](#sigv4-authenticated-requests-java-custom-interceptor)
+ [Node.js](#sigv4-authenticated-requests-nodejs)
+ [Golang](#sigv4-authenticated-requests-golang)
+ [Golang-GRPC](#sigv4-authenticated-requests-golang-grpc)

## Python
<a name="sigv4-authenticated-requests-python"></a>

此示例通过安全连接将签名的请求发送到在网络中注册的服务。如果您希望使用[请求](https://requests.readthedocs.io/en/latest/)，[botocore](https://github.com/boto/botocore) 包可以简化验证过程，但并非严格要求。有关更多信息，请参阅 Boto3 文档中的[凭证](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/credentials.html)。

要安装`botocore`和`awscrt`软件包，请使用以下命令。有关更多信息，请参阅 [AWS CRT Python](https://pypi.org/project/awscrt/)。

```
pip install botocore awscrt
```

如果您在 Lambda 上运行客户端应用程序，请使用 Lambda [层](https://docs.aws.amazon.com/lambda/latest/dg/python-layers.html)安装所需的模块，或者将其包含在您的部署包中。

在以下示例中，使用您自己的值替换占位符值。

------
#### [ SIGv4 ]

```
from botocore import crt
import requests 
from botocore.awsrequest import AWSRequest
import botocore.session

if __name__ == '__main__':
    session = botocore.session.Session()
    signer = crt.auth.CrtSigV4Auth(session.get_credentials(), 'vpc-lattice-svcs', 'us-west-2')
    endpoint = 'https://data-svc-022f67d3a42.1234abc.vpc-lattice-svcs.us-west-2.on.aws'
    data = "some-data-here"
    headers = {'Content-Type': 'application/json', 'x-amz-content-sha256': 'UNSIGNED-PAYLOAD'}
    request = AWSRequest(method='POST', url=endpoint, data=data, headers=headers)
    request.context["payload_signing_enabled"] = False
    signer.add_auth(request)
    
    prepped = request.prepare()
    
    response = requests.post(prepped.url, headers=prepped.headers, data=data)
    print(response.text)
```

------
#### [ SIGv4A ]

```
from botocore import crt
import requests 
from botocore.awsrequest import AWSRequest
import botocore.session

if __name__ == '__main__':
    session = botocore.session.Session()
    signer = crt.auth.CrtSigV4AsymAuth(session.get_credentials(), 'vpc-lattice-svcs', '*')
    endpoint = 'https://data-svc-022f67d3a42.1234abc.vpc-lattice-svcs.us-west-2.on.aws'
    data = "some-data-here"
    headers = {'Content-Type': 'application/json', 'x-amz-content-sha256': 'UNSIGNED-PAYLOAD'}
    request = AWSRequest(method='POST', url=endpoint, data=data, headers=headers)
    request.context["payload_signing_enabled"] = False 
    signer.add_auth(request)
    
    prepped = request.prepare()
    
    response = requests.post(prepped.url, headers=prepped.headers, data=data)
    print(response.text)
```

------

## Java
<a name="sigv4-authenticated-requests-java-custom-interceptor"></a>

本示例展示了如何使用自定义拦截器执行请求签名。本示例使用来自 [AWS SDK for Java 2.x](https://github.com/aws/aws-sdk-java-v2) 的默认凭证提供商类，为您获取正确的凭证。如果您希望使用特定的凭证提供商，可以从 [AWS SDK for Java 2.x](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/credentials.html) 中选择一个。仅 适用于 Java 的 AWS SDK 允许通过 HTTPS 进行未签名的有效负载。但您可以扩展签名程序，以支持通过 HTTP 的未签名有效负载。

------
#### [ SIGv4 ]

```
package com.example;

import software.amazon.awssdk.http.auth.aws.signer.AwsV4HttpSigner;
import software.amazon.awssdk.http.auth.spi.signer.SignedRequest;

import software.amazon.awssdk.http.SdkHttpMethod;
import software.amazon.awssdk.http.SdkHttpClient;
import software.amazon.awssdk.identity.spi.AwsCredentialsIdentity;
import software.amazon.awssdk.http.SdkHttpRequest;
import software.amazon.awssdk.http.apache.ApacheHttpClient;
import software.amazon.awssdk.http.HttpExecuteRequest;
import software.amazon.awssdk.http.HttpExecuteResponse;
import java.io.IOException;
import java.net.URI;

import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider;

public class sigv4 {

    public static void main(String[] args) {
        AwsV4HttpSigner signer = AwsV4HttpSigner.create();

        AwsCredentialsIdentity credentials = DefaultCredentialsProvider.create().resolveCredentials();

        if (args.length < 2) {
            System.out.println("Usage: sample <url> <region>");
            System.exit(1);
        }
        // Create the HTTP request to be signed
        var url = args[0];
        SdkHttpRequest httpRequest = SdkHttpRequest.builder()
                .uri(URI.create(url))
                .method(SdkHttpMethod.GET)
                .build();

        SignedRequest signedRequest = signer.sign(r -> r.identity(credentials)
                .request(httpRequest)
                .putProperty(AwsV4HttpSigner.SERVICE_SIGNING_NAME, "vpc-lattice-svcs")
                .putProperty(AwsV4HttpSigner.PAYLOAD_SIGNING_ENABLED, false)
                .putProperty(AwsV4HttpSigner.REGION_NAME, args[1]));

        System.out.println("[*] Raw request headers:");
        signedRequest.request().headers().forEach((key, values) -> {
            values.forEach(value -> System.out.println("  " + key + ": " + value));
        });

        try (SdkHttpClient httpClient = ApacheHttpClient.create()) {
            HttpExecuteRequest httpExecuteRequest = HttpExecuteRequest.builder()
                    .request(signedRequest.request())
                    .contentStreamProvider(signedRequest.payload().orElse(null))
                    .build();

            System.out.println("[*] Sending request to: " + url);

            HttpExecuteResponse httpResponse = httpClient.prepareRequest(httpExecuteRequest).call();

            System.out.println("[*] Request sent");

            System.out.println("[*] Response status code: " + httpResponse.httpResponse().statusCode());
            // Read and print the response body
            httpResponse.responseBody().ifPresent(inputStream -> {
                try {
                    String responseBody = new String(inputStream.readAllBytes());
                    System.out.println("[*] Response body: " + responseBody);
                } catch (IOException e) {
                    System.err.println("[*] Failed to read response body");
                    e.printStackTrace();
                } finally {
                    try {
                        inputStream.close();
                    } catch (IOException e) {
                        System.err.println("[*] Failed to close input stream");
                        e.printStackTrace();
                    }
                }
            });
        } catch (IOException e) {
            System.err.println("[*] HTTP Request Failed.");
            e.printStackTrace();
        }

    }
}
```

------
#### [ SIGv4A ]

此示例需要对的额外依赖`software.amazon.awssdk:http-auth-aws-crt`。

```
package com.example;


import software.amazon.awssdk.http.auth.aws.signer.AwsV4aHttpSigner;
import software.amazon.awssdk.http.auth.aws.signer.RegionSet;
import software.amazon.awssdk.http.auth.spi.signer.SignedRequest;

import software.amazon.awssdk.http.SdkHttpMethod;
import software.amazon.awssdk.http.SdkHttpClient;
import software.amazon.awssdk.identity.spi.AwsCredentialsIdentity;
import software.amazon.awssdk.http.SdkHttpRequest;
import software.amazon.awssdk.http.apache.ApacheHttpClient;
import software.amazon.awssdk.http.HttpExecuteRequest;
import software.amazon.awssdk.http.HttpExecuteResponse;
import java.io.IOException;
import java.net.URI;
import java.util.Arrays;

import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider;

public class sigv4a {
    
    public static void main(String[] args) {
        AwsV4aHttpSigner signer = AwsV4aHttpSigner.create();

        AwsCredentialsIdentity credentials = DefaultCredentialsProvider.create().resolveCredentials();

        if (args.length < 2) {
            System.out.println("Usage: sample <url> <regionset>");
            System.exit(1);
        }
        // Create the HTTP request to be signed
        var url = args[0];
        SdkHttpRequest httpRequest = SdkHttpRequest.builder()
                .uri(URI.create(url))
                .method(SdkHttpMethod.GET)
                .build();

        SignedRequest signedRequest = signer.sign(r -> r.identity(credentials)
                .request(httpRequest)
                .putProperty(AwsV4aHttpSigner.SERVICE_SIGNING_NAME, "vpc-lattice-svcs")
                .putProperty(AwsV4aHttpSigner.PAYLOAD_SIGNING_ENABLED, false)
                .putProperty(AwsV4aHttpSigner.REGION_SET, RegionSet.create(String.join(" ",Arrays.copyOfRange(args, 1, args.length)))));

        System.out.println("[*] Raw request headers:");
        signedRequest.request().headers().forEach((key, values) -> {
            values.forEach(value -> System.out.println("  " + key + ": " + value));
        });

        try (SdkHttpClient httpClient = ApacheHttpClient.create()) {
            HttpExecuteRequest httpExecuteRequest = HttpExecuteRequest.builder()
                    .request(signedRequest.request())
                    .contentStreamProvider(signedRequest.payload().orElse(null))
                    .build();

            System.out.println("[*] Sending request to: " + url);

            HttpExecuteResponse httpResponse = httpClient.prepareRequest(httpExecuteRequest).call();

            System.out.println("[*] Request sent");

            System.out.println("[*] Response status code: " + httpResponse.httpResponse().statusCode());
            // Read and print the response body
            httpResponse.responseBody().ifPresent(inputStream -> {
                try {
                    String responseBody = new String(inputStream.readAllBytes());
                    System.out.println("[*] Response body: " + responseBody);
                } catch (IOException e) {
                    System.err.println("[*] Failed to read response body");
                    e.printStackTrace();
                } finally {
                    try {
                        inputStream.close();
                    } catch (IOException e) {
                        System.err.println("[*] Failed to close input stream");
                        e.printStackTrace();
                    }
                }
            });
        } catch (IOException e) {
            System.err.println("[*] HTTP Request Failed.");
            e.printStackTrace();
        }
    }
}
```

------

## Node.js
<a name="sigv4-authenticated-requests-nodejs"></a>

本例使用 [aws-crt NodeJS 绑定](https://github.com/awslabs/aws-crt-nodejs)来发送使用 HTTPS 的签名请求。

要安装 `aws-crt` 包，请使用以下命令。

```
npm -i aws-crt
```

如果存在 `AWS_REGION` 环境变量，本例将使用 `AWS_REGION` 指定的区域。默认区域为 `us-east-1`。

------
#### [ SIGv4 ]

```
const https = require('https')
const crt = require('aws-crt')
const { HttpRequest } = require('aws-crt/dist/native/http')

function sigV4Sign(method, endpoint, service, algorithm) {
    const host = new URL(endpoint).host
    const request = new HttpRequest(method, endpoint)
    request.headers.add('host', host)
    // crt.io.enable_logging(crt.io.LogLevel.INFO)
    const config = {
        service: service,
        region: process.env.AWS_REGION ? process.env.AWS_REGION : 'us-east-1',
        algorithm: algorithm,
        signature_type: crt.auth.AwsSignatureType.HttpRequestViaHeaders,
        signed_body_header: crt.auth.AwsSignedBodyHeaderType.XAmzContentSha256,
        signed_body_value: crt.auth.AwsSignedBodyValue.UnsignedPayload,
        provider: crt.auth.AwsCredentialsProvider.newDefault()
    }

    return crt.auth.aws_sign_request(request, config)
}

if (process.argv.length === 2) {
  console.error(process.argv[1] + ' <url>')
  process.exit(1)
}

const algorithm = crt.auth.AwsSigningAlgorithm.SigV4;

sigV4Sign('GET', process.argv[2], 'vpc-lattice-svcs', algorithm).then(
  httpResponse => {
    var headers = {}

    for (const sigv4header of httpResponse.headers) {
      headers[sigv4header[0]] = sigv4header[1]
    }

    const options = {
      hostname: new URL(process.argv[2]).host,
      path: new URL(process.argv[2]).pathname,
      method: 'GET',
      headers: headers
    }

    req = https.request(options, res => {
      console.log('statusCode:', res.statusCode)
      console.log('headers:', res.headers)
      res.on('data', d => {
        process.stdout.write(d)
      })
    })
    req.on('error', err => {
      console.log('Error: ' + err)
    })
    req.end()
  }
)
```

------
#### [ SIGv4A ]

```
const https = require('https')
const crt = require('aws-crt')
const { HttpRequest } = require('aws-crt/dist/native/http')

function sigV4Sign(method, endpoint, service, algorithm) {
    const host = new URL(endpoint).host
    const request = new HttpRequest(method, endpoint)
    request.headers.add('host', host)
    // crt.io.enable_logging(crt.io.LogLevel.INFO)
    const config = {
        service: service,
        region: process.env.AWS_REGION ? process.env.AWS_REGION : 'us-east-1',
        algorithm: algorithm,
        signature_type: crt.auth.AwsSignatureType.HttpRequestViaHeaders,
        signed_body_header: crt.auth.AwsSignedBodyHeaderType.XAmzContentSha256,
        signed_body_value: crt.auth.AwsSignedBodyValue.UnsignedPayload,
        provider: crt.auth.AwsCredentialsProvider.newDefault()
    }

    return crt.auth.aws_sign_request(request, config)
}

if (process.argv.length === 2) {
  console.error(process.argv[1] + ' <url>')
  process.exit(1)
}

const algorithm = crt.auth.AwsSigningAlgorithm.SigV4Asymmetric;

sigV4Sign('GET', process.argv[2], 'vpc-lattice-svcs', algorithm).then(
  httpResponse => {
    var headers = {}

    for (const sigv4header of httpResponse.headers) {
      headers[sigv4header[0]] = sigv4header[1]
    }

    const options = {
      hostname: new URL(process.argv[2]).host,
      path: new URL(process.argv[2]).pathname,
      method: 'GET',
      headers: headers
    }

    req = https.request(options, res => {
      console.log('statusCode:', res.statusCode)
      console.log('headers:', res.headers)
      res.on('data', d => {
        process.stdout.write(d)
      })
    })
    req.on('error', err => {
      console.log('Error: ' + err)
    })
    req.end()
  }
)
```

------

## Golang
<a name="sigv4-authenticated-requests-golang"></a>

此示例使用适用[于 Go 的 Smithy 代码生成器和 G](https://github.com/aws/smithy-go) [o 编程语言的AWS SDK](https://github.com/aws/aws-sdk-go) 来处理请求签名请求。该示例需要 Go 版本为 1.21 或更高版本。

------
#### [ SIGv4 ]

```
package main
 
import (
        "context"
        "flag"
        "fmt"
        "io"
        "log"
        "net/http"
        "net/http/httputil"
        "os"
        "strings"
 
        "github.com/aws/aws-sdk-go-v2/aws"
        "github.com/aws/aws-sdk-go-v2/config"
        "github.com/aws/smithy-go/aws-http-auth/credentials"
        "github.com/aws/smithy-go/aws-http-auth/sigv4"
        v4 "github.com/aws/smithy-go/aws-http-auth/v4"
)
 
type nopCloser struct {
        io.ReadSeeker
}
 
func (nopCloser) Close() error {
        return nil
}
 
type stringFlag struct {
        set   bool
        value string
}
 
 
        flag.PrintDefaults()
        os.Exit(1)
}
 
func main() {
        flag.Parse()
        if !url.set || !region.set {
                Usage()
        }
 
        cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithClientLogMode(aws.LogSigning))
        if err != nil {
                log.Fatalf("failed to load SDK configuration, %v", err)
        }
 
        if len(os.Args) < 2 {
                log.Fatalf("Usage: go run main.go  <url>")
        }
 
        // Retrieve credentials from an SDK source, such as the instance profile
        sdkCreds, err := cfg.Credentials.Retrieve(context.TODO())
        if err != nil {
                log.Fatalf("Unable to retrieve credentials from SDK, %v", err)
        }
 
        creds := credentials.Credentials{
                AccessKeyID:     sdkCreds.AccessKeyID,
                SecretAccessKey: sdkCreds.SecretAccessKey,
                SessionToken:    sdkCreds.SessionToken,
        }
 
        // Add a payload body, which will not be part of the signature calculation
        body := nopCloser{strings.NewReader(`Example payload body`)}
 
        req, _ := http.NewRequest(http.MethodPost, url.value, body)
 
        // Create a sigv4a signer with specific options
        signer := sigv4.New(func(o *v4.SignerOptions) {
                o.DisableDoublePathEscape = true
                // This will add the UNSIGNED-PAYLOAD sha256 header
                o.AddPayloadHashHeader = true
                o.DisableImplicitPayloadHashing = true
        })
 
        // Perform the signing on req, using the credentials we retrieved from the SDK
        err = signer.SignRequest(&sigv4.SignRequestInput{
                Request:     req,
                Credentials: creds,
                Service:     "vpc-lattice-svcs",
                Region: region.String(),
        })
 
        if err != nil {
                log.Fatalf("%s", err)
        }
 
        res, err := httputil.DumpRequest(req, true)
 
        if err != nil {
                log.Fatalf("%s", err)
        }
 
        log.Printf("[*] Raw request\n%s\n", string(res))
 
        log.Printf("[*] Sending request to %s\n", url.value)
 
        resp, err := http.DefaultClient.Do(req)
        if err != nil {
                log.Fatalf("%s", err)
        }
 
        log.Printf("[*] Request sent\n")
 
        log.Printf("[*] Response status code: %d\n", resp.StatusCode)
 
        respBody, err := io.ReadAll(resp.Body)
        if err != nil {
                log.Fatalf("%s", err)
        }
 
        log.Printf("[*] Response body: \n%s\n", respBody)
}
```

------
#### [ SIGv4A ]

```
package main
 
import (
        "context"
        "flag"
        "fmt"
        "io"
        "log"
        "net/http"
        "net/http/httputil"
        "os"
        "strings"
 
        "github.com/aws/aws-sdk-go-v2/aws"
        "github.com/aws/aws-sdk-go-v2/config"
        "github.com/aws/smithy-go/aws-http-auth/credentials"
        "github.com/aws/smithy-go/aws-http-auth/sigv4a"
        v4 "github.com/aws/smithy-go/aws-http-auth/v4"
)
 
type nopCloser struct {
        io.ReadSeeker
}
 
func (nopCloser) Close() error {
        return nil
}
 
type stringFlag struct {
 
func main() {
        flag.Parse()
        if !url.set || !regionSet.set {
                Usage()
        }
 
        cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithClientLogMode(aws.LogSigning))
        if err != nil {
                log.Fatalf("failed to load SDK configuration, %v", err)
        }
 
        if len(os.Args) < 2 {
                log.Fatalf("Usage: go run main.go <url>")
        }
 
        // Retrieve credentials from an SDK source, such as the instance profile
        sdkCreds, err := cfg.Credentials.Retrieve(context.TODO())
        if err != nil {
                log.Fatalf("Unable to retrieve credentials from SDK, %v", err)
        }
 
        creds := credentials.Credentials{
                AccessKeyID:     sdkCreds.AccessKeyID,
                SecretAccessKey: sdkCreds.SecretAccessKey,
                SessionToken:    sdkCreds.SessionToken,
        }
 
        // Add a payload body, which will not be part of the signature calculation
        body := nopCloser{strings.NewReader(`Example payload body`)}
 
        req, _ := http.NewRequest(http.MethodPost, url.value, body)
 
        // Create a sigv4a signer with specific options
        signer := sigv4a.New(func(o *v4.SignerOptions) {
                o.DisableDoublePathEscape = true
                // This will add the UNSIGNED-PAYLOAD sha256 header
                o.AddPayloadHashHeader = true
                o.DisableImplicitPayloadHashing = true
        })
 
        // Create a slice out of the provided regionset
        rs := strings.Split(regionSet.value, ",")
 
        // Perform the signing on req, using the credentials we retrieved from the SDK
        err = signer.SignRequest(&sigv4a.SignRequestInput{
                Request:     req,
                Credentials: creds,
                Service:     "vpc-lattice-svcs",
                RegionSet: rs,
        })
 
        if err != nil {
                log.Fatalf("%s", err)
        }
 
        res, err := httputil.DumpRequest(req, true)
 
        if err != nil {
                log.Fatalf("%s", err)
        }
 
        log.Printf("[*] Raw request\n%s\n", string(res))
 
        log.Printf("[*] Sending request to %s\n", url.value)
 
        resp, err := http.DefaultClient.Do(req)
        if err != nil {
                log.Fatalf("%s", err)
        }
 
        log.Printf("[*] Request sent\n")
 
        log.Printf("[*] Response status code: %d\n", resp.StatusCode)
 
        respBody, err := io.ReadAll(resp.Body)
        if err != nil {
                log.Fatalf("%s", err)
        }
 
        log.Printf("[*] Response body: \n%s\n", respBody)
}
```

------

## Golang-GRPC
<a name="sigv4-authenticated-requests-golang-grpc"></a>

此示例使用适用[于 Go 编程语言的AWS SDK](https://github.com/aws/aws-sdk-go-v2/) 来处理 GRPC 请求的请求签名。这可以与 GRPC 示例代码存储库中的 [echo 服务器](https://github.com/grpc/grpc-go/tree/master/examples/features/proto/echo)一起使用。

```
package main

import (
    "context"
    "crypto/tls"
    "crypto/x509"

    "flag"
    "fmt"
    "log"
    "net/http"
    "net/url"
    "strings"
    "time"

    "google.golang.org/grpc"
    "google.golang.org/grpc/credentials"

    "github.com/aws/aws-sdk-go-v2/aws"
    v4 "github.com/aws/aws-sdk-go-v2/aws/signer/v4"
    "github.com/aws/aws-sdk-go-v2/config"

    ecpb "google.golang.org/grpc/examples/features/proto/echo"
)

const (
    headerContentSha    = "x-amz-content-sha256"
    headerSecurityToken = "x-amz-security-token"
    headerDate          = "x-amz-date"
    headerAuthorization = "authorization"
    unsignedPayload     = "UNSIGNED-PAYLOAD"
)

type SigV4GrpcSigner struct {
    service      string
    region       string
    credProvider aws.CredentialsProvider
    signer       *v4.Signer
}

func NewSigV4GrpcSigner(service string, region string, credProvider aws.CredentialsProvider) *SigV4GrpcSigner {
    signer := v4.NewSigner()
    return &SigV4GrpcSigner{
        service:      service,
        region:       region,
        credProvider: credProvider,
        signer:       signer,
    }
}

func (s *SigV4GrpcSigner) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) {
    ri, _ := credentials.RequestInfoFromContext(ctx)
    creds, err := s.credProvider.Retrieve(ctx)
    if err != nil {
        return nil, fmt.Errorf("failed to load credentials: %w", err)
    }

    // The URI we get here is scheme://authority/service/ - for siging we want to include the RPC name
    // But RequestInfoFromContext only has the combined /service/rpc-name - so read the URI, and
    // replace the Path with what we get from RequestInfo.
    parsed, err := url.Parse(uri[0])
    if err != nil {
        return nil, err
    }
    parsed.Path = ri.Method

    // Build a request for the signer.
    bodyReader := strings.NewReader("")
    req, err := http.NewRequest("POST", uri[0], bodyReader)
    if err != nil {
        return nil, err
    }
    date := time.Now()
    req.Header.Set(headerContentSha, unsignedPayload)
    req.Header.Set(headerDate, date.String())
    if creds.SessionToken != "" {
        req.Header.Set(headerSecurityToken, creds.SessionToken)
    }
    // The signer wants this as //authority/path
    // So get this by triming off the scheme and the colon before the first slash.
    req.URL.Opaque = strings.TrimPrefix(parsed.String(), parsed.Scheme+":")

    err = s.signer.SignHTTP(context.Background(), creds, req, unsignedPayload, s.service, s.region, date)
    if err != nil {
        return nil, fmt.Errorf("failed to sign request: %w", err)
    }

    // Pull the relevant headers out of the signer, and return them to get
    // included in the request we make.
    reqHeaders := map[string]string{
        headerContentSha:    req.Header.Get(headerContentSha),
        headerDate:          req.Header.Get(headerDate),
        headerAuthorization: req.Header.Get(headerAuthorization),
    }
    if req.Header.Get(headerSecurityToken) != "" {
        reqHeaders[headerSecurityToken] = req.Header.Get(headerSecurityToken)
    }

    return reqHeaders, nil
}

func (c *SigV4GrpcSigner) RequireTransportSecurity() bool {
    return true
}

var addr = flag.String("addr", "some-lattice-service:443", "the address to connect to")
var region = flag.String("region", "us-west-2", "region")

func callUnaryEcho(client ecpb.EchoClient, message string) {
    ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
    defer cancel()
    resp, err := client.UnaryEcho(ctx, &ecpb.EchoRequest{Message: message})
    if err != nil {
        log.Fatalf("client.UnaryEcho(_) = _, %v: ", err)
    }
    fmt.Println("UnaryEcho: ", resp.Message)
}

func main() {
    flag.Parse()
    cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithClientLogMode(aws.LogSigning))
    if err != nil {
        log.Fatalf("failed to load SDK configuration, %v", err)
    }

    pool, _ := x509.SystemCertPool()
    tlsConfig := &tls.Config{
        RootCAs: pool,
    }

    authority, _, _ := strings.Cut(*addr, ":") // Remove the port from the addr
    opts := []grpc.DialOption{
        grpc.WithTransportCredentials(credentials.NewTLS(tlsConfig)),

        // Lattice needs both the Authority to be set (without a port), and the SigV4 signer
        grpc.WithAuthority(authority),
        grpc.WithPerRPCCredentials(NewSigV4GrpcSigner("vpc-lattice-svcs", *region, cfg.Credentials)),
    }

    conn, err := grpc.Dial(*addr, opts...)

    if err != nil {
        log.Fatalf("did not connect: %v", err)
    }
    defer conn.Close()
    rgc := ecpb.NewEchoClient(conn)

    callUnaryEcho(rgc, "hello world")
}
```

# Amazon VPC Lattice 中的数据保护
<a name="data-protection"></a>

责任共担模式 AWS [分担责任模型](https://aws.amazon.com/compliance/shared-responsibility-model/)适用于 Amazon VPC Lattice 中的数据保护。如本模型所述 AWS ，负责保护运行所有内容的全球基础架构 AWS 云。您负责维护对托管在此基础架构上的内容的控制。此内容包括您所使用的 AWS 服务 的安全配置和管理任务。有关数据隐私的更多信息，请参阅[数据隐私常见问题](https://aws.amazon.com/compliance/data-privacy-faq/)。有关欧洲数据保护的信息，请参阅 *AWS Security Blog* 上的 [AWS Shared Responsibility Model and GDPR](https://aws.amazon.com/blogs/security/the-aws-shared-responsibility-model-and-gdpr/) 博客文章。

## 传输中加密
<a name="encryption-transit"></a>

VPC Lattice 是一项完全托管的服务，由控制面板和数据面板组成。每个面板在服务中都有不同的用途。控制平面提供 APIs 用于创建、读取/描述、更新、删除和列出 (CRUDL) 资源（例如和）的管理权限。`CreateService` `UpdateService`与 VPC 莱迪思控制平面的通信在传输途中受到 TLS 的保护。数据平面是 VPC Lattice Invoke API，它提供服务之间的互连。当您使用 HTTPS 或 TLS 时，TLS 会加密与 VPC 莱迪思数据平面的通信。密码套件和协议版本使用 VPC Lattice 提供的默认值，并且不可配置。有关更多信息，请参阅 [VPC Lattice 服务的 HTTPS 侦听器](https-listeners.md)。

## 静态加密
<a name="encryption-rest"></a>

默认情况下，静态数据加密有助于降低保护敏感数据的操作开销和复杂性。同时，还支持构建符合严格加密合规性和监管要求的安全应用程序。

**Topics**
+ [具有 Amazon S3 托管密钥的服务器端加密（SSE-S3）](#s3-managed-keys)
+ [使用存储在 AWS KMS (SSE- AWS KMS KMS) 中的密钥进行服务器端加密](#kms-managed-keys)

### 具有 Amazon S3 托管密钥的服务器端加密（SSE-S3）
<a name="s3-managed-keys"></a>

当您使用具有 Amazon S3 托管式密钥的服务器端加密（SSE-S3）时，每个对象均使用唯一密钥加密。作为额外的保护措施，我们使用定期轮换的根密钥对密钥本身进行加密。Simple Storage Service (Amazon S3) 服务器端加密使用可用的最强数据块密码之一 [即 256 位高级加密标准 (AES-256) GCM] 来加密您的数据。对于在使用 AES-GCM 之前加密的对象，仍支持使用 AES-CBC 来解密这些对象。有关更多信息，请参阅[使用 Amazon S3 管理的加密密钥（SSE-S3）进行服务器端加密](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingServerSideEncryption.html)。

如果您使用 Amazon S3 托管的加密密钥 (SSE-S3) 为 VPC Lattice 访问日志启用服务器端加密，我们会自动加密每个访问日志文件，然后再将其存储在您的 S3 存储桶中。有关更多信息，请参阅亚马逊* CloudWatch 用户指南中的发送到 Amazon* [S3 的日志](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AWS-logs-and-resource-policy.html#AWS-logs-infrastructure-S3)。

### 使用存储在 AWS KMS (SSE- AWS KMS KMS) 中的密钥进行服务器端加密
<a name="kms-managed-keys"></a>

使用 AWS KMS 密钥进行服务器端加密 (SSE-KMS) 与 SSE-S3 类似，但使用此服务还有其他好处和费用。该 AWS KMS 密钥有单独的权限，可提供额外的保护，防止未经授权访问您的 Amazon S3 中的对象。SSE-KMS 还为您提供审计跟踪，显示您的 AWS KMS 密钥何时使用以及由谁使用。有关更多信息，请参阅[使用 AWS Key Management Service （SSE-KMS）进行服务器端加密](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html)。

**Topics**
+ [证书私有密钥的加密和解密](#private-key)
+ [VPC Lattice 的加密上下文](#encryption-context)
+ [监控 VPC Lattice 的加密密钥](#monitoring-encryption-keys)

#### 证书私有密钥的加密和解密
<a name="private-key"></a>

您的 ACM 证书和私钥使用别名为 **aw** s/acm 的 AWS 托管 KMS 密钥进行加密。您可以在 AWS KMS 控制台的**AWS 托管密钥下查看带有此别名的密钥** ID。

VPC Lattice 不会直接访问您的 ACM 资源。它使用 AWS TLS 连接管理器来保护和访问您的证书的私钥。当您使用 ACM 证书创建 VPC Lattice 服务时，VPC Lattice 会将您的证书与 AWS TLS Connection Manager 关联。这是通过使用前缀为 **aws/** ac AWS KMS m 的 AWS 托管密钥创建授权来完成的。授权是一种策略工具，允许 TLS Connection Manager 在加密操作中使用 KMS 密钥。授权允许被授权主体（TLS Connection Manager）对 KMS 密钥调用指定授权操作，以解密证书的私有密钥。TLS Connection Manager 使用证书和解密（明文）私有密钥，与 VPC Lattice 服务的客户端建立安全连接（SSL/TLS 会话）。当证书与 VPC Lattice 服务取消关联时，该授权就会失效。

如果您想删除对 KMS 密钥的访问权限，我们建议您使用中的或`update-service`命令从服务中替换 AWS 管理控制台 或删除证书 AWS CLI。

#### VPC Lattice 的加密上下文
<a name="encryption-context"></a>

[加密上下文](https://docs.aws.amazon.com/kms/latest/developerguide/encrypt_context.html)是一组可选的键值对，其中包含有关您的私钥可能用于什么的上下文信息。 AWS KMS 将加密上下文绑定到加密数据，并将其用作其他经过身份验证的数据以支持经过身份验证的加密。

当您的 TLS 密钥与 VPC Lattice 和 TLS Connection manager 一起使用时，VPC Latrice 服务的名称将包含在用于静态加密密钥的加密上下文中。您可以通过查看 CloudTrail 日志中的加密上下文（如下一节所示）或查看 ACM 控制台中的 “**关联资源**” 选项卡，来验证您的证书和私钥用于哪个 VPC Lattice 服务。

要解密数据，在请求中包含相同的加密上下文。VPC Lattice 在所有 AWS KMS 加密操作中使用相同的加密环境，其中密钥为`aws:vpc-lattice:arn`，值为 VPC 莱迪思服务的亚马逊资源名称 (ARN)。

下面的示例显示操作输出中的加密上下文，例如 `CreateGrant`：

```
"encryptionContextEquals": {
    "aws:acm:arn": "arn:aws:acm:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
    "aws:vpc-lattice:arn": "arn:aws:vpc-lattice:us-west-2:111122223333:service/svc-0b23c1234567890ab"
}
```

#### 监控 VPC Lattice 的加密密钥
<a name="monitoring-encryption-keys"></a>

当您在VPC莱迪思服务中使用 AWS 托管密钥时，您可以使用[AWS CloudTrail](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/)来跟踪VPC Lattice发送到的请求。 AWS KMS

**CreateGrant**  
当您将 ACM 证书添加到 VPC Lattice 服务时，系统会代表您发送 `CreateGrant` 请求，使 TLS Connection Manager 能够解密与 ACM 证书关联的私有密钥

您可以在 “事件**历史记录” 中**CloudTrail**将该`CreateGrant`操作作为事件**查看**CreateGrant**。

以下是该`CreateGrant`操作事件历史记录中的示例 CloudTrail 事件记录。

```
{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "IAMUser",
        "principalId": "EX_PRINCIPAL_ID",
        "arn": "arn:aws:iam::111122223333:user/Alice",
        "accountId": "111122223333",
        "accessKeyId": "EXAMPLE_KEY_ID",
        "sessionContext": {
            "sessionIssuer": {
                "type": "IAMUser",
                "principalId": "EX_PRINCIPAL_ID",
                "arn": "arn:aws:iam::111122223333:user/Alice",
                "accountId": "111122223333",
                "userName": "Alice"
            },
            "webIdFederationData": {},
            "attributes": {
                "creationDate": "2023-02-06T23:30:50Z",
                "mfaAuthenticated": "false"
            }
        },
        "invokedBy": "acm.amazonaws.com"
    },
    "eventTime": "2023-02-07T00:07:18Z",
    "eventSource": "kms.amazonaws.com",
    "eventName": "CreateGrant",
    "awsRegion": "us-west-2",
    "sourceIPAddress": "acm.amazonaws.com",
    "userAgent": "acm.amazonaws.com",
    "requestParameters": {
        "granteePrincipal": "tlsconnectionmanager.amazonaws.com",
        "keyId": "1234abcd-12ab-34cd-56ef-1234567890ab",
        "operations": [
            "Decrypt"
        ],
        "constraints": {
            "encryptionContextEquals": {
                "aws:acm:arn": "arn:aws:acm:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
                "aws:vpc-lattice:arn": "arn:aws:vpc-lattice:us-west-2:111122223333:service/svc-0b23c1234567890ab"
            }
        },
        "retiringPrincipal": "acm.us-west-2.amazonaws.com"
    },
    "responseElements": {
        "grantId": "f020fe75197b93991dc8491d6f19dd3cebb24ee62277a05914386724f3d48758",
        "keyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
    },
    "requestID": "ba178361-8ab6-4bdd-9aa2-0d1a44b2974a",
    "eventID": "8d449963-1120-4d0c-9479-f76de11ce609",
    "readOnly": false,
    "resources": [
        {
            "accountId": "111122223333",
            "type": "AWS::KMS::Key",
            "ARN": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
        }
    ],
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "111122223333",
    "eventCategory": "Management"
}
```

在上面的`CreateGrant`示例中，被授权者主体是 TLS 连接管理器，加密上下文具有 VPC 莱迪思服务 ARN。

**ListGrants**  
您可以使用 KMS 密钥 ID 和账户 ID 来调用 `ListGrants` API。这将为您提供指定 KMS 密钥的所有授权列表。有关更多信息，请参阅 [ListGrants](https://docs.aws.amazon.com/kms/latest/APIReference/API_ListGrants.html)。

使用中的以下`ListGrants`命令 AWS CLI 查看所有授权的详细信息。

```
aws kms list-grants —key-id your-kms-key-id
```

下面是示例输出。

```
{
    "Grants": [
        {
            "Operations": [
                "Decrypt"
            ], 
            "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", 
            "Name": "IssuedThroughACM", 
            "RetiringPrincipal": "acm.us-west-2.amazonaws.com", 
            "GranteePrincipal": "tlsconnectionmanager.amazonaws.com", 
            "GrantId": "f020fe75197b93991dc8491d6f19dd3cebb24ee62277a05914386724f3d48758", 
            "IssuingAccount": "arn:aws:iam::111122223333:root", 
            "CreationDate": "2023-02-06T23:30:50Z", 
            "Constraints": {
                "encryptionContextEquals": {
                  "aws:acm:arn": "arn:aws:acm:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
                  "aws:vpc-lattice:arn": "arn:aws:vpc-lattice:us-west-2:111122223333:service/svc-0b23c1234567890ab"
                }
            }
        }
    ]
}
```

在上面的`ListGrants`示例中，被授权者主体是 TLS 连接管理器，加密环境具有 VPC 莱迪思服务 ARN。

**Decrypt**  
VPC Lattice 使用 TLS Connection Manager 调用 `Decrypt` 操作来解密您的私有密钥，以便在您的 VPC Lattice 服务中提供 TLS 连接。您可以在事件**历史记录 **Decryp** t 中将该`Decrypt`操作视为**CloudTrail**事件**。

以下是该`Decrypt`操作事件历史记录中的示例 CloudTrail 事件记录。

```
{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "AWSService",
        "invokedBy": "tlsconnectionmanager.amazonaws.com"
    },
    "eventTime": "2023-02-07T00:07:23Z",
    "eventSource": "kms.amazonaws.com",
    "eventName": "Decrypt",
    "awsRegion": "us-west-2",
    "sourceIPAddress": "tlsconnectionmanager.amazonaws.com",
    "userAgent": "tlsconnectionmanager.amazonaws.com",
    "requestParameters": {
        "encryptionContext": {
            "aws:acm:arn": "arn:aws:acm:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
            "aws:vpc-lattice:arn": "arn:aws:vpc-lattice:us-west-2:111122223333:service/svc-0b23c1234567890ab"
        },
        "encryptionAlgorithm": "SYMMETRIC_DEFAULT"
    },
    "responseElements": null,
    "requestID": "12345126-30d5-4b28-98b9-9153da559963",
    "eventID": "abcde202-ba1a-467c-b4ba-f729d45ae521",
    "readOnly": true,
    "resources": [
        {
            "accountId": "111122223333",
            "type": "AWS::KMS::Key",
            "ARN": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
        }
    ],
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "111122223333",
    "sharedEventID": "abcde202-ba1a-467c-b4ba-f729d45ae521",
    "eventCategory": "Management"
}
```

# 适用于 Amazon VPC Lattice 的身份和访问管理
<a name="security-iam"></a>

以下各节介绍如何使用 AWS Identity and Access Management (IAM) 通过控制谁可以执行 VPC Lattice API 操作来帮助保护您的 VPC 莱迪思资源。

**Topics**
+ [Amazon VPC Lattice 如何与 IAM 配合使用](security_iam_service-with-iam.md)
+ [亚马逊 VPC 莱迪思 API 权限](additional-api-permissions.md)
+ [Amazon VPC Lattice 基于身份的策略](security_iam_id-based-policies.md)
+ [使用适用于 Amazon VPC 莱迪思的服务相关角色](using-service-linked-roles.md)
+ [AWS 适用于 Amazon VPC 莱迪思的托管策略](managed-policies.md)

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

在使用 IAM 管理对 VPC Lattice 的访问之前，了解哪些 IAM 功能可用于 VPC Lattice。




| IAM 功能 | VPC Lattice 支持 | 
| --- | --- | 
|  [基于身份的策略](#security_iam_service-with-iam-id-based-policies)  |   是  | 
|  [基于资源的策略](#security_iam_service-with-iam-resource-based-policies)  |   是  | 
|  [策略操作](#security_iam_service-with-iam-id-based-policies-actions)  |   是  | 
|  [策略资源](#security_iam_service-with-iam-id-based-policies-resources)  |   是  | 
|  [策略条件键](#security_iam_service-with-iam-id-based-policies-conditionkeys)  |   是  | 
|  [ACLs](#security_iam_service-with-iam-acls)  |   否   | 
|  [ABAC（策略中的标签）](#security_iam_service-with-iam-tags)  |   是  | 
|  [临时凭证](#security_iam_service-with-iam-roles-tempcreds)  |   是  | 
|  [服务角色](#security_iam_service-with-iam-roles-service)  |   否   | 
|  [服务关联角色](#security_iam_service-with-iam-roles-service-linked)  |   是  | 

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

## VPC Lattice 基于身份的策略
<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)。

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

**支持基于资源的策略：**是

基于资源的策略是您附加到中的 AWS资源的 JSON 策略文档。在支持基于资源的策略的 AWS 服务中，服务管理员可以使用它们来控制对该 AWS 服务的特定资源的访问权限。对于在其中附加策略的资源，策略定义指定主体可以对该资源执行哪些操作以及在什么条件下执行。您必须在基于资源的策略中指定主体。

VPC Lattice 支持*验证策略*，这是一种基于资源的策略，允许您控制对服务网络中服务的访问。有关更多信息，请参阅 [使用身份验证策略控制对VPC莱迪思服务的访问](auth-policies.md)。

VPC Lattice 还支持基于资源的权限策略，以便与 AWS Resource Access Manager集成。您可以使用这些基于资源的策略来授予管理与其他 AWS 账户或组织的服务、资源配置和服务网络连接的权限。有关更多信息，请参阅 [共享 VPC Lattice 实体](sharing.md)。

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

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

在 IAM 策略语句中，您可以从支持 IAM 的任何服务中指定任何 API 操作。对于 VPC Lattice，使用以下前缀为 API 操作命名：`vpc-lattice:`。例如：`vpc-lattice:CreateService`、`vpc-lattice:CreateTargetGroup` 和 `vpc-lattice:PutAuthPolicy`。

要在单个语句中指定多个操作，请使用逗号分隔，如下所示：

```
"Action": [ "vpc-lattice:action1", "vpc-lattice:action2" ]
```

您也可以使用通配符指定多项操作。例如，您可以指定名称以单词 `Get` 开头的所有操作，如下所示：

```
"Action": "vpc-lattice:Get*"
```

有关 VPC Lattice API 操作的完整列表，请参阅《服务授权参考》**中的 [Amazon VPC Lattice 定义的操作](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonvpclattice.html#amazonvpclattice-actions-as-permissions)。

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

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

在 IAM policy 声明中，`Resource` 元素指定了该声明涵盖的一个或多个对象。对于 VPC Lattice，每个 IAM 政策声明都适用于您使用其 ARNs指定的资源。

具体的 Amazon 资源名称（ARN）格式取决于资源。当您提供 ARN 时，请用您的资源特定信息替换*italicized*文本。
+ **访问日志订阅：**

  ```
  "Resource": "arn:aws:vpc-lattice:region:account-id:accesslogsubscription/access-log-subscription-id"
  ```
+ **侦听器：**

  ```
  "Resource": "arn:aws:vpc-lattice:region:account-id:service/service-id/listener/listener-id"
  ```
+ **资源网关**

  ```
  "Resource": "arn:aws:vpc-lattice:region:account-id:resourcegateway/resource-gateway-id"
  ```
+ **资源配置**

  ```
  "Resource": "arn:aws:vpc-lattice:region:account-id:resourceconfiguration/resource-configuration-id"
  ```
+ **规则：**

  ```
  "Resource": "arn:aws:vpc-lattice:region:account-id:service/service-id/listener/listener-id/rule/rule-id"
  ```
+ **服务：**

  ```
  "Resource": "arn:aws:vpc-lattice:region:account-id:service/service-id"
  ```
+ **服务网络：**

  ```
  "Resource": "arn:aws:vpc-lattice:region:account-id:servicenetwork/service-network-id"
  ```
+ **服务网络服务关联：**

  ```
  "Resource": "arn:aws:vpc-lattice:region:account-id:servicenetworkserviceassociation/service-network-service-association-id"
  ```
+ **服务网络资源配置关联**

  ```
  "Resource": "arn:aws:vpc-lattice:region:account-id:servicenetworkresourceassociation/service-network-resource-association-id"
  ```
+ **服务网络 VPC 关联：**

  ```
  "Resource": "arn:aws:vpc-lattice:region:account-id:servicenetworkvpcassociation/service-network-vpc-association-id"
  ```
+ **目标组：**

  ```
  "Resource": "arn:aws:vpc-lattice:region:account-id:targetgroup/target-group-id"
  ```

## VPC Lattice 的策略条件键
<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)。

要查看 VPC Lattice 条件密钥列表，请参阅《*服务授权*参考》[中的 Amazon VPC Lattice 条件密钥](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonvpclattice.html#amazonvpclattice-policy-keys)。

AWS 支持全局条件密钥和特定于服务的条件密钥。有关 AWS 全局条件键的信息，请参阅 *IAM 用户指南*中的[AWS 全局条件上下文密钥](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html)。

## VPC 莱迪思中的访问控制列表 (ACLs)
<a name="security_iam_service-with-iam-acls"></a>

**支持 ACLs：**否 

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

## VPC Lattice 的基于属性的访问权限控制（ABAC）
<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)。

## 在 VPC Lattice 中使用临时凭证
<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)

## VPC Lattice 的服务角色
<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)。

**警告**  
更改服务角色的权限可能会破坏 VPC Lattice 的功能。只有在 VPC Lattice 提供指导的情况下，才能编辑服务角色。

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

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

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

有关创建或管理 VPC Lattice 服务相关角色的信息，请参阅 [使用适用于 Amazon VPC 莱迪思的服务相关角色](using-service-linked-roles.md)。

# 亚马逊 VPC 莱迪思 API 权限
<a name="additional-api-permissions"></a>

您必须授予 IAM 身份（如用户或角色）调用所需 VPC Lattice API 操作的权限，如 [VPC Lattice 的策略操作](security_iam_service-with-iam.md#security_iam_service-with-iam-id-based-policies-actions) 中所述。此外，对于某些 VPC Lattice 操作，您必须授予 IAM 身份从其他 AWS APIs身份调用特定操作的权限。

## API 所需的权限
<a name="required-API-permissions"></a>

从 API 调用以下操作时，必须授予 IAM 用户调用指定操作的权限。

`CreateResourceConfiguration`  
+ `vpc-lattice:CreateResourceConfiguration`
+ `ec2:DescribeSubnets`
+ `rds:DescribeDBInstances`
+ `rds:DescribeDBClusters`

`CreateResourceGateway`  
+ `vpc-lattice:CreateResourceGateway`
+ `ec2:AssignPrivateIpAddresses`
+ `ec2:AssignIpv6Addresses`
+ `ec2:CreateNetworkInterface`
+ `ec2:CreateNetworkInterfacePermission`
+ `ec2:DeleteNetworkInterface`
+ `ec2:DescribeNetworkInterfaces`
+ `ec2:DescribeSecurityGroups`
+ `ec2:DescribeSubnets`

`DeleteResourceGateway`  
+ `vpc-lattice:DeleteResourceGateway`
+ `ec2:DeleteNetworkInterface`

`UpdateResourceGateway`  
+ `vpc-lattice:UpdateResourceGateway`
+ `ec2:AssignPrivateIpAddresses`
+ `ec2:AssignIpv6Addresses`
+ `ec2:UnassignPrivateIpAddresses`
+ `ec2:CreateNetworkInterface`
+ `ec2:CreateNetworkInterfacePermission`
+ `ec2:DeleteNetworkInterface`
+ `ec2:DescribeNetworkInterfaces`
+ `ec2:DescribeSecurityGroups`
+ `ec2:DescribeSubnets`
+ `ec2:ModifyNetworkInterfaceAttribute`

`CreateServiceNetworkResourceAssociation`  
+ `vpc-lattice:CreateServiceNetworkResourceAssociation`
+ `ec2:AssignIpv6Addresses`
+ `ec2:CreateNetworkInterface`
+ `ec2:CreateNetworkInterfacePermission`
+ `ec2:DescribeNetworkInterfaces`

`CreateServiceNetworkVpcAssociation`  
+ `vpc-lattice:CreateServiceNetworkVpcAssociation`
+ `ec2:DescribeVpcs`
+ `ec2:DescribeSecurityGroups`（仅在提供安全组时才需要）

`UpdateServiceNetworkVpcAssociation`  
+ `vpc-lattice:UpdateServiceNetworkVpcAssociation`
+ `ec2:DescribeSecurityGroups`（仅在提供安全组时才需要）

`CreateTargetGroup`  
+ `vpc-lattice:CreateTargetGroup`
+ `ec2:DescribeVpcs`

`RegisterTargets`  
+ `vpc-lattice:RegisterTargets`
+ `ec2:DescribeInstances`（仅当目标组类型为 `INSTANCE` 时才需要）
+ `ec2:DescribeVpcs`（仅当目标组类型为 `INSTANCE` 或 `IP` 时才需要）
+ `ec2:DescribeSubnets`（仅当目标组类型为 `INSTANCE` 或 `IP` 时才需要）
+ `lambda:GetFunction`（仅当目标组类型为 `LAMBDA` 时才需要）
+ `lambda:AddPermission`（仅当目标组还没有调用指定 Lambda 函数的权限时才需要）

`DeregisterTargets`  
+ `vpc-lattice:DeregisterTargets`

`CreateAccessLogSubscription`  
+ `vpc-lattice:CreateAccessLogSubscription`
+ `logs:GetLogDelivery`
+ `logs:CreateLogDelivery`

`DeleteAccessLogSubscription`  
+ `vpc-lattice:DeleteAccessLogSubscription`
+ `logs:DeleteLogDelivery`

`UpdateAccessLogSubscription`  
+ `vpc-lattice:UpdateAccessLogSubscription`
+ `logs:UpdateLogDelivery`

# Amazon VPC Lattice 基于身份的策略
<a name="security_iam_id-based-policies"></a>

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

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

有关 VPC Lattice 定义的操作和资源类型（包括每种资源类型的格式）的详细信息，请参阅《*服务授权*参考》[中的 Amazon VPC Lattice 的操作、资源和条件密钥](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonvpclattice.html)。 ARNs 

**Topics**
+ [策略最佳实践](#security_iam_service-with-iam-policy-best-practices)
+ [完全访问所需的额外权限](#security_iam_id-based-policy-additional-permissions)
+ [VPC Lattice 基于身份的策略示例](#security_iam_id-based-policy-examples)

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

基于身份的策略确定某个人是否可以创建、访问或删除您账户中的 VPC Lattice 资源。这些操作可能会使 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)。

## 完全访问所需的额外权限
<a name="security_iam_id-based-policy-additional-permissions"></a>

要使用与VPC Lattice集成的其他 AWS 服务以及整套VPC Lattice功能，您必须拥有特定的额外权限。这些权限不包括在 `VPCLatticeFullAccess` 托管策略中，因为存在[混淆代理](https://docs.aws.amazon.com//IAM/latest/UserGuide/confused-deputy.html)权限升级风险。

您必须将以下策略附加到您的角色，并与 `VPCLatticeFullAccess` 托管策略一起使用。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "firehose:TagDeliveryStream",
                "lambda:AddPermission",
                "s3:PutBucketPolicy"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:PutResourcePolicy"
            ],
            "Resource": "*",
            "Condition": {
                "ForAnyValue:StringEquals": {
                    "aws:CalledVia": [
                        "vpc-lattice.amazonaws.com"
                    ]
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "iam:AttachRolePolicy",
                "iam:PutRolePolicy"
            ],
            "Resource": "arn:aws:iam::*:role/aws-service-role/vpc-lattice.amazonaws.com/AWSServiceRoleForVpcLattice"
        },
        {
            "Effect": "Allow",
            "Action": [
                "iam:AttachRolePolicy",
                "iam:PutRolePolicy"
            ],
            "Resource": "arn:aws:iam::*:role/aws-service-role/delivery.logs.amazonaws.com/AWSServiceRoleForLogDelivery*"
        }
    ]
}
```

------

本策略提供以下额外权限：
+ `iam:AttachRolePolicy`：允许您将指定的托管策略附加到指定的 IAM 角色。
+ `iam:PutRolePolicy`：允许您添加或更新嵌入在指定的 IAM 角色中的内联策略文档。
+ `s3:PutBucketPolicy`：允许您将存储桶策略应用于 Amazon S3 存储桶。
+ `firehose:TagDeliveryStream`：允许您为 Firehose 传输流添加或更新标签。

## VPC Lattice 基于身份的策略示例
<a name="security_iam_id-based-policy-examples"></a>

**Topics**
+ [策略示例：管理与服务网络的 VPC 关联](#security_iam_id-based-policy-examples-vpc-to-service-network-association)
+ [策略示例：创建与服务网络的服务关联](#security_iam_id-based-policy-examples-service-to-service-network-association)
+ [策略示例：为资源添加标签](#security_iam_id-based-policy-examples-tag-resources)
+ [策略示例：创建服务相关角色](#security_iam_id-based-policy-examples-service-linked-role)

### 策略示例：管理与服务网络的 VPC 关联
<a name="security_iam_id-based-policy-examples-vpc-to-service-network-association"></a>

以下示例演示了一个策略，该策略授予使用此策略的用户创建、更新和删除服务网络的 VPC 关联的权限，但仅限于条件中指定的 VPC 和服务网络。有关指定条件密钥的更多信息，请参阅 [VPC Lattice 的策略条件键](security_iam_service-with-iam.md#security_iam_service-with-iam-id-based-policies-conditionkeys)。

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

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
      {
         "Effect": "Allow",
         "Action": [
            "vpc-lattice:CreateServiceNetworkVpcAssociation",
            "vpc-lattice:UpdateServiceNetworkVpcAssociation",
            "vpc-lattice:DeleteServiceNetworkVpcAssociation"
         ],
         "Resource": [
            "*"
         ],
         "Condition": {
            "StringEquals": { 
               "vpc-lattice:ServiceNetworkArn": "arn:aws:vpc-lattice:us-west-2:123456789012:servicenetwork/sn-903004f88example",
               "vpc-lattice:VpcId": "vpc-1a2b3c4d"
            }
         }
      }
   ]
}
```

------

### 策略示例：创建与服务网络的服务关联
<a name="security_iam_id-based-policy-examples-service-to-service-network-association"></a>

如果您不使用条件键来控制对VPC Lattice资源的访问，则可以在`Resource`元素中指定资源来控制访问权限。 ARNs 

以下示例演示了一种策略，该策略将服务关联限制为服务网络，使用此策略 ARNs 的用户可以通过指定可用于 `CreateServiceNetworkServiceAssociation` API 操作的服务和服务网络来创建该服务网络。有关指定 ARN 值的详细信息，请参阅 [VPC Lattice 的策略资源](security_iam_service-with-iam.md#security_iam_service-with-iam-id-based-policies-resources)。

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

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
      {
         "Effect": "Allow",
         "Action": [
            "vpc-lattice:CreateServiceNetworkServiceAssociation"
         ],
         "Resource": [
            "arn:aws:vpc-lattice:us-west-2:123456789012:servicenetworkserviceassociation/*",
            "arn:aws:vpc-lattice:us-west-2:123456789012:service/svc-04d5cc9b88example",
            "arn:aws:vpc-lattice:us-west-2:123456789012:servicenetwork/sn-903004f88example"
         ]
      }
   ]
}
```

------

### 策略示例：为资源添加标签
<a name="security_iam_id-based-policy-examples-tag-resources"></a>

以下示例演示了一个策略，该策略授予使用此策略的用户在 VPC Lattice 资源上创建标签的权限。

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

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
      {
         "Effect": "Allow",
         "Action": [
            "vpc-lattice:TagResource"
         ],
         "Resource": "arn:aws:vpc-lattice:us-west-2:123456789012:*/*"
      }
   ]
}
```

------

### 策略示例：创建服务相关角色
<a name="security_iam_id-based-policy-examples-service-linked-role"></a>

VPC Lattice 需要权限才能在您中的任何用户首次创建 AWS 账户 VPC 莱迪思资源时创建服务相关角色。如果服务相关角色尚不存在，VPC Lattice 会在您的账户中创建此角色。服务相关角色向 VPC Lattice 授予权限，使其可以 AWS 服务 代表您呼叫其他人。有关更多信息，请参阅 [使用适用于 Amazon VPC 莱迪思的服务相关角色](using-service-linked-roles.md)。

为使自动角色创建操作成功，用户必须具有 `iam:CreateServiceLinkedRole` 操作的权限。

```
"Action": "iam:CreateServiceLinkedRole"
```

以下示例演示了一个策略，该策略授予使用此策略的用户为 VPC Lattice 创建服务相关角色的权限。

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

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
      {
         "Effect": "Allow",
         "Action": "iam:CreateServiceLinkedRole",
         "Resource": "arn:aws:iam::*:role/aws-service-role/vpc-lattice.amazonaws.com/AWSServiceRoleForVpcLattice",
         "Condition": {
            "StringLike": {
               "iam:AWSServiceName":"vpc-lattice.amazonaws.com"
            }
         }
      }
   ]
}
```

------

有关更多信息，请参阅*《IAM 用户指南》*中的[服务关联角色权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/using-service-linked-roles.html#service-linked-role-permissions)。

# 使用适用于 Amazon VPC 莱迪思的服务相关角色
<a name="using-service-linked-roles"></a>

Amazon VPC Lattice 使用服务相关角色来获得代表您呼叫他人所需的权限。 AWS 服务 有关更多信息，请参阅《IAM 用户指南》**中的[服务相关角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create-service-linked-role.html)。

VPC Lattice 使用名为的服务相关角色。AWSServiceRoleForVpcLattice

## VPC Lattice 的服务相关角色权限
<a name="slr-permissions"></a>

**AWSServiceRoleForVpcLattice** 服务相关角色仅信任以下服务来担任该角色：
+ `vpc-lattice.amazonaws.com`

名为的角色权限策略AWSVpcLatticeServiceRolePolicy允许 VPC Lattice 在`AWS/VpcLattice`命名空间中发布 CloudWatch 指标。有关更多信息，请参阅[https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSVpcLatticeServiceRolePolicy.html](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSVpcLatticeServiceRolePolicy.html)《*AWS 托管策略参考*》。

您必须配置权限，允许 IAM 实体（如用户、组或角色）创建、编辑或删除服务关联角色。有关更多信息，请参阅 [策略示例：创建服务相关角色](security_iam_id-based-policies.md#security_iam_id-based-policy-examples-service-linked-role)。

## 为VPC Lattice创建服务相关角色
<a name="create-slr"></a>

您无需手动创建服务关联角色。当您在 AWS 管理控制台、或 AWS API 中创建 VPC 莱迪思资源时 AWS CLI，VPC Lattice 会为您创建服务相关角色。

如果您删除该服务关联角色，然后需要再次创建，您可以使用相同流程在账户中重新创建此角色。当您创建 VPC Lattice 资源时，VPC Lattice 会再次为您创建服务相关角色。

## 编辑 VPC 莱迪思的服务相关角色
<a name="edit-slr"></a>

您可以使用 IAM 编辑 **AWSServiceRoleForVpcLattice** 的描述。有关更多信息，请参阅《IAM 用户指南》**中的[编辑服务相关角色描述](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_update-service-linked-role.html#edit-service-linked-role-iam-console)。

## 删除 VPC 莱迪思的服务相关角色
<a name="delete-slr"></a>

如果您不再需要使用 Amazon VPC Lattice，我们建议您将其删除**AWSServiceRoleForVpcLattice**。

只有在删除 AWS 账户中的所有 VPC Lattice 资源后，才能删除此服务相关角色。

使用 IAM 控制台 AWS CLI、或 AWS API 删除**AWSServiceRoleForVpcLattice**服务相关角色。有关更多信息，请参阅《IAM 用户指南》**中的[删除服务相关角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_manage_delete.html#id_roles_manage_delete_slr)。

删除服务相关角色后，当您在 AWS 账户中创建 VPC Lattice 资源时，VPC Lattice 会再次创建该角色。

## VPC Lattice 服务相关角色支持的区域
<a name="slr-regions"></a>

VPC Lattice 支持在服务可用的所有区域中使用服务相关角色。

# AWS 适用于 Amazon VPC 莱迪思的托管策略
<a name="managed-policies"></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 托管策略： VPCLatticeFullAccess
<a name="vpc-lattice-fullaccess-policy"></a>

本策略提供对 Amazon VPC Lattice 的完全访问权限，以及对其他相关服务的有限访问权限。其中包含执行以下操作的权限：
+ ACM — 检索自定义 SSL/TLS 域名的证书 ARN。
+ CloudWatch — 查看访问日志和监控数据。
+ CloudWatch 日志-设置访问日志并将其发送到 CloudWatch 日志。
+ Amazon EC2 — 配置网络接口并检索有关 EC2 实例的信息，以及 VPCs。这用于创建资源配置、资源网关和目标组、配置 VPC Lattice 实体关联以及注册目标。
+ 弹性负载均衡：检索有关应用程序负载均衡器的信息，将其注册为目标。
+ Firehose — 检索有关用于存储访问日志的传输流的信息。
+ Lambda：检索有关 Lambda 函数的信息，将其注册为目标。
+ Amazon RDS — 检索有关 RDS 集群和实例的信息。
+ Amazon S3：检索有关用于存储访问日志的 S3 存储桶的信息。

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

要使用与VPC Lattice集成的其他 AWS 服务以及整套VPC Lattice功能，您必须拥有特定的额外权限。这些权限不包括在 `VPCLatticeFullAccess` 托管策略中，因为存在[混淆代理](https://docs.aws.amazon.com//IAM/latest/UserGuide/confused-deputy.html)权限升级风险。有关更多信息，请参阅 [完全访问所需的额外权限](security_iam_id-based-policies.md#security_iam_id-based-policy-additional-permissions)。

## AWS 托管策略： VPCLatticeReadOnlyAccess
<a name="vpc-lattice-read-onlyaccess-policy"></a>

本策略提供对 Amazon VPC Lattice 的只读访问权限，以及对其他相关服务的有限访问权限。其中包含执行以下操作的权限：
+ ACM — 检索自定义 SSL/TLS 域名的证书 ARN。
+ CloudWatch — 查看访问日志和监控数据。
+ CloudWatch 日志-查看访问日志订阅的日志传送信息。
+ Amazon EC2 — 检索有关 EC2 实例的信息 VPCs ，创建目标组和注册目标。
+ 弹性负载均衡：检索有关应用程序负载均衡器的信息。
+ Firehose — 检索有关传输流的信息，以进行访问日志传输。
+ Lambda：查看有关 Lambda 函数的信息。
+ Amazon RDS — 检索有关 RDS 集群和实例的信息。
+ Amazon S3：检索有关 S3 存储桶的信息，以进行访问日志传输。

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

## AWS 托管策略： VPCLatticeServicesInvokeAccess
<a name="vpc-lattice-services-invoke-access-policy"></a>

本策略提供调用 Amazon VPC Lattice 服务的访问权限。

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

## AWS 托管策略： AWSVpcLatticeServiceRolePolicy
<a name="service-linked-role-policy"></a>

此策略附加到一个名为的服务相关角色，该角色**AWSServiceRoleForVpcLattice**允许VPC Lattice代表您执行操作。您不能将此策略附加到您的 IAM 实体。有关更多信息，请参阅 [使用适用于 Amazon VPC 莱迪思的服务相关角色](using-service-linked-roles.md)。

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

## VPC Lattice 更新了托 AWS 管策略
<a name="policy-updates"></a>

查看有关VPC Lattice AWS 托管策略自该服务开始跟踪这些变更以来更新的详细信息。要获得有关本页面更改的自动提醒，请订阅《VPC Lattice 用户指南》的 RSS 源。


| 更改 | 描述 | 日期 | 
| --- | --- | --- | 
| [VPCLatticeFullAccess](#vpc-lattice-fullaccess-policy) | VPC Lattice 增加了只读权限来描述 Amazon RDS 集群和实例。 | 2024 年 12 月 1 日 | 
| [VPCLatticeReadOnlyAccess](#vpc-lattice-read-onlyaccess-policy) | VPC Lattice 增加了只读权限来描述 Amazon RDS 集群和实例。 | 2024 年 12 月 1 日 | 
| [AWSVpcLatticeServiceRolePolicy](#service-linked-role-policy) | VPC Lattice 增加了权限，允许 VPC Lattice 创建请求者管理的网络接口。 | 2024 年 12 月 1 日 | 
| [VPCLatticeFullAccess](#vpc-lattice-fullaccess-policy) | VPC Lattice 添加了一个新策略，授予对 Amazon VPC Lattice 的完全访问权限，以及对其他依赖服务的有限访问权限。 | 2023 年 3 月 31 日 | 
| [VPCLatticeReadOnlyAccess](#vpc-lattice-read-onlyaccess-policy) | VPC Lattice 添加了一个新策略，授予对 Amazon VPC Lattice 的只读访问权限，以及对其他依赖服务的有限访问权限。 | 2023 年 3 月 31 日 | 
| [VPCLatticeServicesInvokeAccess](#vpc-lattice-services-invoke-access-policy) | VPC Lattice 添加了一个新策略，授予调用 Amazon VPC Lattice 服务的访问权限。 | 2023 年 3 月 31 日 | 
| [AWSVpcLatticeServiceRolePolicy](#service-linked-role-policy) | VPC Lattice 为其服务相关角色添加权限，允许 VPC Lattice 在命名空间中发布 CloudWatch 指标。AWS/VpcLattice该AWSVpcLatticeServiceRolePolicy策略包括调用 CloudWatch [PutMetricData](https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_PutMetricData.html)API 操作的权限。有关更多信息，请参阅 [使用适用于 Amazon VPC 莱迪思的服务相关角色](using-service-linked-roles.md)。 | 2022 年 12 月 5 日 | 
|  VPC Lattice 开始跟踪更改  |  VPC Lattice 开始跟踪其 AWS 托管策略的变更。  | 2022 年 12 月 5 日 | 

# Amazon VPC Lattice 的合规性验证
<a name="compliance-validation"></a>

作为多项合规计划的一部分，第三方审计师对Amazon VPC Lattice的安全与 AWS 合规性进行评估。

要了解是否属于特定合规计划的范围，请参阅AWS 服务 “[按合规计划划分的范围](https://aws.amazon.com/compliance/services-in-scope/)” ”，然后选择您感兴趣的合规计划。 AWS 服务 有关一般信息，请参阅[AWS 合规计划AWS](https://aws.amazon.com/compliance/programs/)。

您可以使用下载第三方审计报告 AWS Artifact。有关更多信息，请参阅中的 “[下载报告” 中的 “ AWS Artifact](https://docs.aws.amazon.com/artifact/latest/ug/downloading-documents.html)。

您在使用 AWS 服务 时的合规责任取决于您的数据的敏感性、贵公司的合规目标以及适用的法律和法规。有关您在使用时的合规责任的更多信息 AWS 服务，请参阅[AWS 安全文档](https://docs.aws.amazon.com/security/)。

# 使用接口终端节点访问 Amazon VPC Lattice ()AWS PrivateLink
<a name="vpc-interface-endpoints"></a>

您可以创建*接口 VPC 端点*，在您的 VPC 和 Amazon VPC Lattice 之间建立私有连接。接口终端节点由一项技术提供支持 [AWS PrivateLink](https://aws.amazon.com/privatelink/)，该技术使您 APIs 无需互联网网关、NAT设备、VPN连接或 Direct Connect 连接即可私密访问VPC Lattice。您的 VPC 中的实例不需要公有 IP 地址即可与 VPC 莱迪思 APIs通信。

每个接口端点由子网中的一个或多个[网络接口](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html)表示。

## 接口 VPC 端点的注意事项
<a name="vpc-endpoint-considerations"></a>

在为 VPC Lattice 设置接口 VPC 终端节点之前，请务[必查看*AWS PrivateLink 指南 AWS PrivateLink*中的访问权限 AWS 服务](https://docs.aws.amazon.com/vpc/latest/privatelink/privatelink-access-aws-services.html)。

VPC Lattice 支持从 VPC 调用其所有 API 操作。

## 为 VPC Lattice 创建接口 VPC 端点
<a name="vpc-endpoint-create"></a>

您可以使用 Amazon VPC 控制台或 AWS Command Line Interface (AWS CLI) 为 VPC 莱迪思服务创建 VPC 终端节点。有关更多信息，请参阅*AWS PrivateLink 指南*中的[创建接口 VPC 终端节点](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html)。

使用以下服务名称为 VPC Lattice 创建 VPC 端点：

`com.amazonaws.region.vpc-lattice`

如果为端点启用私有 DNS，您可以使用该区域的默认 DNS 名称（例如 `vpc-lattice.us-east-1.amazonaws.com`）向 VPC Lattice 发出 API 请求。

# Amazon VPC Lattice 的弹性
<a name="disaster-recovery-resiliency"></a>

 AWS 全球基础设施是围绕 AWS 区域 可用区构建的。

AWS 区域 提供多个物理分隔和隔离的可用区，这些可用区通过低延迟、高吞吐量和高度冗余的网络连接。

利用可用区，您可以设计和操作在可用区之间无中断地自动实现失效转移的应用程序和数据库。与传统的单个或多个数据中心基础设施相比，可用区具有更高的可用性、容错能力和可扩展性。

有关 AWS 区域 和可用区的更多信息，请参阅[AWS 全球基础设施](https://aws.amazon.com/about-aws/global-infrastructure/)。

# Amazon VPC 莱迪思的基础设施安全
<a name="infrastructure-security"></a>

作为一项托管服务，Amazon VPC Lattice 受到 AWS 全球网络安全的保护。有关 AWS 安全服务以及如何 AWS 保护基础设施的信息，请参阅[AWS 云安全](https://aws.amazon.com/security/)。要使用基础设施安全的最佳实践来设计您的 AWS 环境，请参阅 S * AWS ecurity Pillar Well-Architected Fram* ework 中的[基础设施保护](https://docs.aws.amazon.com/wellarchitected/latest/security-pillar/infrastructure-protection.html)。

您可以使用 AWS 已发布的 API 调用通过网络访问 VPC Lattice。客户端必须支持以下内容：
+ 传输层安全性协议（TLS）。我们要求使用 TLS 1.2，建议使用 TLS 1.3。
+ 具有完全向前保密（PFS）的密码套件，例如 DHE（临时 Diffie-Hellman）或 ECDHE（临时椭圆曲线 Diffie-Hellman）。大多数现代系统（如 Java 7 及更高版本）都支持这些模式。