使用 IAM 策略控制 API 访问
如果使用 IAM 策略根据 IP 地址控制 AWS 服务 的访问权限,则可能需要更新策略以包括 IPv6 地址范围。本指南解释 IPv4 与 IPv6 之间的差异,并描述如何更新您的 IAM 策略以同时支持这两种协议。实施这些更改有助于您在支持 IPv6 的同时保持对 AWS 资源的安全访问。
什么是 IPv6?
IPv6 是下一代 IP 标准,旨在最终取代 IPv4。之前的版本 IPv4 使用 32 位寻址方案来支持 43 亿台设备。而 IPv6 可使用 128 位寻址来支持大约 340 万亿万亿(或 2 的 128 次方)台设备。
有关更多信息,请参阅 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)策略
您可使用 IAM 策略来控制对 Secrets Manager API 的访问,并阻止配置范围之外的 IP 地址访问 Secrets Manager API。
适用于 Secrets Manager API 的 secretsmanager.{region}.amazonaws.com 双堆栈端点同时支持 IPv6 和 IPv4。
如果需要同时支持 IPv4 和 IPv6,请更新您的 IP 地址筛选策略以处理 IPv6 地址。否则,您可能无法通过 IPv6 连接到 Secrets Manager。
谁应该执行此更改?
如果您将双寻址与包含 aws:sourceIp 的策略结合使用,则此更改会影响您。双寻址意味着网络支持 IPv4 和 IPv6。
如果您使用双寻址,请更新当前使用 IPv4 格式地址的 IAM 策略,使其包含 IPv6 格式的地址。
谁不应该执行此更改?
如果您只使用 IPv4 网络,则此更改不会影响您。
将 IPv6 添加到 IAM 策略
IAM 策略使用 aws:SourceIp 条件键控制从特定 IP 地址的访问。如果您的网络使用双寻址(IPv4 和 IPv6),请更新您的 IAM 策略以包括 IPv6 地址范围。
在策略的 Condition 元素中,将 IpAddress 和 NotIpAddress 运算符用于 IP 地址条件。不要使用字符串运算符,因为它们无法处理各种有效的 IPv6 地址格式。
这些示例使用 aws:SourceIp。对于 VPC,请改为使用 aws:VpcSourceIp。
以下是来自 IAM 用户指南的基于源 IP 拒绝访问 AWS 参考策略。Condition 元素中的 NotIpAddress 列出两个 IPv4 地址范围:192.0.2.0/24 和 203.0.113.0/24,这两个地址范围将被拒绝访问 API。
要更新此策略,请更改 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
如果您使用 secretsmanager.{region}.amazonaws.com 端点,请验证您可以连接到该端点。下面的步骤介绍了如何执行验证。
此示例使用 Linux 和 curl 版本 8.6.0,并使用位于 amazonaws.com 端点、已启用 IPv6 的端点的 AWS Secrets Manager 服务。
注意
secretsmanager.{region}.amazonaws.com 不同于典型的双堆栈命名约定。有关 Secrets Manager 端点的完整列表,请参阅 AWS Secrets Manager 端点。
将您的 AWS 区域 更改到服务所在的区域。在此示例中,我们使用的是美国东部(弗吉尼亚州北部)- us-east-1 端点。
-
使用以下
dig命令确定端点是否使用 IPv6 地址进行解析。$dig +short AAAA secretsmanager.us-east-1.amazonaws.com > 2600:1f18:e2f:4e05:1a8a:948e:7c08:c1c3 -
使用以下
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。您可以使用以下 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