

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

# 使用 IAM 策略控制 API 访问
<a name="ip-access"></a>

如果您使用 IAM 策略 AWS 服务 根据 IP 地址控制访问权限，则可能需要更新策略以包含 IPv6 地址范围。本指南解释 IPv4 与 IPv6 之间的差异，并描述如何更新您的 IAM 策略以同时支持这两种协议。实施这些更改有助于您在支持 IPv6 的同时保持对 AWS 资源的安全访问。

## 什么是 IPv6？
<a name="what-is-ipv6"></a>

IPv6 是下一代 IP 标准，旨在最终取代 IPv4。之前的版本 IPv4 使用 32 位寻址方案来支持 43 亿台设备。而 IPv6 可使用 128 位寻址来支持大约 340 万亿万亿（或 2 的 128 次方）台设备。

有关更多信息，请参阅 [VPC IPv6 网页](https://aws.amazon.com/vpc/ipv6/)。

以下是 IPv6 地址的示例：

```
2001:cdba:0000:0000:0000:0000:3257:9652 # This is a full, unabbreviated IPv6 address.
2001:cdba:0:0:0:0:3257:9652             # The same address with leading zeros in each group omitted
2001:cdba::3257:965                     # A compressed version of the same address.
```

## IAM 双堆栈（IPv4 和 IPv6）策略
<a name="ipv6-access"></a>

您可使用 IAM 策略来控制对 Secrets Manager API 的访问,并阻止配置范围之外的 IP 地址访问 Secrets Manager API。

适用于 Secrets Manager API 的 *secretsmanager.{region}.amazonaws.com* 双堆栈端点同时支持 IPv6 和 IPv4。

如果需要同时支持 IPv4 和 IPv6，请更新您的 IP 地址筛选策略以处理 IPv6 地址。否则，您可能无法通过 IPv6 连接到 Secrets Manager。

### 谁应该执行此更改？
<a name="customers-impacted"></a>

如果您将双寻址与包含 `aws:sourceIp` 的策略结合使用，则此更改会影响您。*双寻址*意味着网络支持 IPv4 和 IPv6。

如果您使用双寻址，请更新当前使用 IPv4 格式地址的 IAM 策略，使其包含 IPv6 格式的地址。

### 谁不应该执行此更改？
<a name="customers-not-impacted"></a>

如果您*只*使用 IPv4 网络，则此更改不会影响您。

## 将 IPv6 添加到 IAM 策略
<a name="updating-for-ipv6"></a>

IAM 策略使用 `aws:SourceIp` 条件键控制从特定 IP 地址的访问。如果您的网络使用双寻址（IPv4 和 IPv6），请更新您的 IAM 策略以包括 IPv6 地址范围。

在策略的 `Condition` 元素中，将 `IpAddress` 和 `NotIpAddress` 运算符用于 IP 地址条件。不要使用字符串运算符，因为它们无法处理各种有效的 IPv6 地址格式。

这些示例使用 `aws:SourceIp`。对于 VPC，请改为使用 `aws:VpcSourceIp`。

以下是 *IAM 用户指南*[中 AWS 基于源 IP 参考策略拒绝访问](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_aws_deny-ip.html)的内容。`Condition` 元素中的 `NotIpAddress` 列出两个 IPv4 地址范围：`192.0.2.0/24` 和 `203.0.113.0/24`，这两个地址范围将被拒绝访问 API。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": {
        "Effect": "Deny",
        "Action": "*",
        "Resource": "*",
        "Condition": {
            "NotIpAddress": {
                "aws:SourceIp": [
                    "{{192.0.2.0/24}}",
                    "{{203.0.113.0/24}}"
                ]
            },
            "Bool": {
                "aws:ViaAWSService": "false"
            }
        }
    }
}
```

------

要更新此策略，请更改 `Condition` 元素以包括 IPv6 地址范围 `2001:DB8:1234:5678::/64` 和 `2001:cdba:3257:8593::/64`。

**注意**  
请勿移除现有的 IPv4 地址。向后兼容性将需要这些地址。

```
"Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": [
                        "192.0.2.0/24", <<DO NOT REMOVE existing IPv4 address>>
                        "203.0.113.0/24", <<DO NOT REMOVE existing IPv4 address>>
                        "2001:DB8:1234:5678::/64", <<New IPv6 IP address>>
                        "2001:cdba:3257:8593::/64" <<New IPv6 IP address>>
                    ]
                },
                "Bool": {
                    "aws:ViaAWSService": "false"
                }
            }
```

要针对 VPC 更新此策略，请使用 `aws:VpcSourceIp` 而非 `aws:SourceIp`：

```
"Condition": {
                "NotIpAddress": {
                    "aws:VpcSourceIp": [
                        "10.0.2.0/24", <<DO NOT REMOVE existing IPv4 address>>
                        "10.0.113.0/24", <<DO NOT REMOVE existing IPv4 address>>
                        "fc00:DB8:1234:5678::/64", <<New IPv6 IP address>>
                        "fc00:cdba:3257:8593::/64" <<New IPv6 IP address>>
                    ]
                },
                "Bool": {
                    "aws:ViaAWSService": "false"
                }
            }
```

## 验证您的客户端是否支持 IPv6
<a name="testing-connection"></a>

如果您使用 *secretsmanager.{region}.amazonaws.com* 端点，请验证您可以连接到该端点。下面的步骤介绍了如何执行验证。

此示例使用 Linux 和 curl 版本 8.6.0，并使用位于 **amazonaws.com** 端点、已启用 IPv6 的端点的 [AWS Secrets Manager 服务](https://docs.aws.amazon.com/general/latest/gr/secretsmanager.html)。

**注意**  
**secretsmanager.{region}.amazonaws.com** 不同于[典型的双堆栈命名约定](https://docs.aws.amazon.com/general/latest/gr/rande.html#dual-stack-endpoints)。有关 Secrets Manager 端点的完整列表，请参阅 [AWS Secrets Manager 端点](asm_access.md#endpoints)。  
将更改 AWS 区域 为您的服务所在的相同区域。在此示例中，我们使用的是美国东部（弗吉尼亚州北部）- `us-east-1` 端点。

1. 使用以下 `dig` 命令确定端点是否使用 IPv6 地址进行解析。

   ```
   $ dig +short AAAA secretsmanager.us-east-1.amazonaws.com 
   
   > 2600:1f18:e2f:4e05:1a8a:948e:7c08:c1c3
   ```

1. 使用以下 `curl` 命令确定客户端网络是否可以建立 IPv6 连接。404 响应代码表示连接成功，而 0 响应代码表示连接失败。

   ```
   $ curl --ipv6 -o /dev/null --silent -w "\nremote ip: %{remote_ip}\nresponse code: %{response_code}\n" https://secretsmanager.us-east-1.amazonaws.com 
   
   > remote ip: 2600:1f18:e2f:4e05:1a8a:948e:7c08:c1c3
   > response code: 404
   ```

如果已识别远程 IP **并且**响应代码不是 `0`，则表示已使用 IPv6 成功与端点建立网络连接。远程 IP 应该是 IPv6 地址，因为操作系统应该选择对客户端有效的协议。

如果远程 IP 为空或响应码为`0`，则客户端网络或终端的网络路径为 IPv4-only。您可以使用以下 `curl` 命令验证此配置。

```
$ curl -o /dev/null --silent -w "\nremote ip: %{remote_ip}\nresponse code: %{response_code}\n" https://secretsmanager.us-east-1.amazonaws.com 

> remote ip: 3.123.154.250
> response code: 404
```