

 **帮助改进此页面** 

要帮助改进本用户指南，请选择位于每个页面右侧窗格中的**在 GitHub 上编辑此页面**链接。

# Amazon Elastic Kubernetes Service 的安全注意事项
<a name="security-eks"></a>

以下是关于云安全的注意事项，这些注意事项会对 Amazon EKS 造成影响。

**Topics**
+ [Amazon EKS 中的基础设施安全性](infrastructure-security.md)
+ [了解 Amazon EKS 集群中的弹性](disaster-recovery-resiliency.md)
+ [防止在 Amazon EKS 中出现跨服务混淆代理](cross-service-confused-deputy-prevention.md)

# Amazon EKS 中的基础设施安全性
<a name="infrastructure-security"></a>

作为一项托管式服务，Amazon Elastic Kubernetes Service 受 AWS 全球网络安全保护。有关 AWS 安全服务以及 AWS 如何保护基础设施的信息，请参阅 [AWS 云安全性](https://aws.amazon.com/security/)。要按照基础设施安全最佳实践设计您的 AWS 环境，请参阅《安全性支柱 AWS Well‐Architected Framework》**中的[基础设施保护](https://docs.aws.amazon.com/wellarchitected/latest/security-pillar/infrastructure-protection.html)。

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

此外，必须使用访问密钥 ID 和与 IAM 主体关联的秘密访问密钥来对请求进行签名。或者，您可以使用 [AWS Security Token Service](https://docs.aws.amazon.com/STS/latest/APIReference/welcome.html)（AWS STS）生成临时安全凭证，对请求进行签名。

在创建 Amazon EKS 集群时，为要使用的集群指定 VPC 子网。Amazon EKS 需要至少位于两个可用区中的子网。我们建议使用同时带有公有子网和私有子网的 VPC，以便 Kubernetes 可以在公有子网中创建公有负载均衡器，进而将流量负载均衡到在私有子网中的节点上运行的负载均衡器。

有关 VPC 注意事项的更多信息，请参阅[查看 Amazon EKS 对 VPC 和子网的联网要求](network-reqs.md)。

如果使用[开始使用 Amazon EKS](getting-started.md) 演练中提供的 AWS CloudFormation 模板创建 VPC 和节点组，则将使用推荐设置来配置控制面板和节点安全组。

有关安全组注意事项的更多信息，请参阅[查看集群的 Amazon EKS 安全组要求](sec-group-reqs.md)。

在创建新集群时，Amazon EKS 将为您用于与集群进行通信的托管 Kubernetes API 服务器（使用 Kubernetes 管理工具，如 `kubectl`）创建端点。默认情况下，此 API 服务器端点对于互联网是公有的，对 API 服务器的访问将使用 AWS Identity and Access Management（IAM）与本机 Kubernetes [基于角色的访问控制](https://kubernetes.io/docs/reference/access-authn-authz/rbac/)（RBAC）相结合的方式加以保护。

您可以启用对 Kubernetes API 服务器的私有访问，以便节点与 API 服务器之间的所有通信都在 VPC 内。您可以限制从 Internet 访问 API 服务器的 IP 地址，或完全禁用对 API 服务器的 Internet 访问。

有关修改集群终端节点访问的更多信息，请参阅[修改集群终端节点访问](cluster-endpoint.md#modify-endpoint-access)。

您可以使用 Amazon VPC CNI 或第三方工具（如 [Project Calico](https://docs.tigera.io/calico/latest/about/)）实施 Kubernetes *网络策略*。有关将 Amazon VPC CNI 用于网络策略的更多信息，请参阅 [通过 Kubernetes 网络策略限制容器组（pod）流量](cni-network-policy.md)。Project Calico 是一个第三方开源项目。有关更多信息，请参阅 [Project Calico 文档](https://docs.tigera.io/calico/latest/getting-started/kubernetes/managed-public-cloud/eks/)。

# 使用 AWS PrivateLink 访问 Amazon EKS
<a name="vpc-interface-endpoints"></a>

您可以使用 AWS PrivateLink 在您的 VPC 和 Amazon Elastic Kubernetes Service 之间创建私有连接。您可以像在 VPC 中一样访问 Amazon EKS，而无需使用互联网网关、NAT 设备、VPN 连接或 AWS Direct Connect 连接。VPC 中的实例不需要公有 IP 地址即可访问 Amazon EKS。

您可以通过创建由 AWS PrivateLink 提供支持的接口端点来建立此私有连接。我们将在您为接口端点启用的每个子网中创建一个端点网络接口。这些是请求者托管式网络接口，用作发往 Amazon EKS 的流量的入口点。

有关更多信息，请参阅《AWS PrivateLink 指南》**中的 [Access AWS services through AWS PrivateLink](https://docs.aws.amazon.com/vpc/latest/privatelink/privatelink-access-aws-services.html)。

## 开始前的准备工作
<a name="vpc-endpoint-prerequisites"></a>

开始之前，请确保您已执行以下任务：
+ 查看《AWS PrivateLink Guide》**中的 [Access an AWS service using an interface VPC endpoint](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html#considerations-interface-endpoints) 

## 注意事项
<a name="vpc-endpoint-considerations"></a>
+  **支持和限制**：Amazon EKS 接口端点允许从您的 VPC 安全访问所有 Amazon EKS API 操作，但有特定的限制：它们不支持访问 Kubernetes API，因为其有单独的私有端点，因此您无法将 Amazon EKS 配置为仅通过接口端点访问。
+  **定价**：使用 Amazon EKS 的接口端点会产生标准 AWS PrivateLink 费用：每个可用区中预置的每个端点的小时费用，以及通过端点的流量的数据处理费用。要了解更多信息，请参阅 [AWS PrivateLink 定价](https://aws.amazon.com/privatelink/pricing/)。
+  **安全和访问控制**：我们建议通过以下附加配置增强安全性和控制访问 – 使用 VPC 端点策略控制通过接口端点访问 Amazon EKS，将安全组与端点网络接口关联以管理流量，使用 VPC 流日志捕获和监控进出接口端点的 IP 流量，日志可发布到 Amazon CloudWatch 或 Amazon S3。要了解更多信息，请参阅 [Control access to VPC endpoints using endpoint policies](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints-access.html) 和[使用 VPC 流日志记录 IP 流量](https://docs.aws.amazon.com/vpc/latest/userguide/flow-logs.html)。
+  **连接选项**：接口端点提供灵活的连接选项，支持通过**本地访问**（使用 AWS Direct Connect 或 AWS Site-to-Site VPN 将本地数据中心连接到包含接口端点的 VPC）或通过 **VPC 间连接**（使用 AWS Transit Gateway 或 VPC 对等连接将其他 VPC 连接到包含接口端点的 VPC，从而将流量保持在 AWS 网络内）。
+  **IP 版本支持**：在 2024 年 8 月之前创建的端点仅支持使用 eks.region.amazonaws.com 的 IPv4。2024 年 8 月之后创建的新端点支持双堆栈 IPv4 和 IPv6（例如，eks.region.amazonaws.com、eks.region.api.aws）。
+  **区域可用性**：适用于 EKS API 的 AWS PrivateLink 在以下区域不可用：亚太地区（马来西亚）（ap-southeast-5）、亚太地区（泰国）（ap-southeast-7）、墨西哥（中部）（mx-central-1）和亚太地区（台北）（ap-east-2）区域。AWSPrivateLink 对 eks-auth（EKS 容器组身份）的支持已在亚太地区（马来西亚）(ap-southeast-5) 区域开放。

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

您可以使用 Amazon VPC 控制台或 AWS 命令行界面（AWS CLI）为 Amazon EKS 创建接口端点。有关更多信息，请参阅《AWS PrivateLink 指南》**中的[创建 VPC 端点](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html#create-interface-endpoint-aws)。

使用以下服务名称为 Amazon EKS 创建接口端点：

### EKS API
<a name="_eks_api"></a>
+ com.amazonaws.region-code.eks
+ com.amazonaws.region-code.eks-fips（适用于符合 FIPS 的端点）

### EKS Auth API（EKS 容器组身份）
<a name="_eks_auth_api_eks_pod_identity"></a>
+ com.amazonaws.region-code.eks-auth

## Amazon EKS 接口端点的私有 DNS 功能
<a name="vpc-endpoint-private-dns"></a>

Amazon EKS 和其他 AWS 服务的接口端点默认启用私有 DNS 功能，便于使用默认区域 DNS 名称进行安全和私有 API 请求。此功能可确保 API 调用通过接口端点经由私有 AWS 网络路由，从而增强安全性和性能。

当您为 Amazon EKS 或其他 AWS 服务创建接口端点时，将自动激活 DNS 功能。要启用该功能，您需要通过设置特定属性来正确配置您的 VPC：
+  **enableDnsHostnames**：允许 VPC 内的实例拥有 DNS 主机名。
+  **enableDnsSupport**：在整个 VPC 中启用 DNS 解析。

有关检查或修改这些设置的分步说明，请参阅[查看和更新 VPC 的 DNS 属性](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html#vpc-dns-updating)。

### DNS 名称和 IP 地址类型
<a name="_dns_names_and_ip_address_types"></a>

启用私有 DNS 功能后，您可以使用特定的 DNS 名称连接到 Amazon EKS，这些选项会随着时间的推移而不断演进：
+  **eks.region.amazonaws.com**：传统的 DNS 名称，在 2024 年 8 月之前仅解析为 IPv4 地址。对于更新为双堆栈的现有端点，此名称将同时解析为 IPv4 和 IPv6 地址。
+  **eks.region.api.aws**：适用于 2024 年 8 月之后创建的新端点，此双堆栈 DNS 名称可同时解析为 IPv4 和 IPv6 地址。

2024 年 8 月之后，新的接口端点将包含两个 DNS 名称，您可以选择双堆栈 IP 地址类型。对于现有端点，更新为双堆栈将修改 **eks.region.amazonaws.com** 以同时支持 IPv4 和 IPv6。

### 使用私有 DNS 功能
<a name="_using_the_private_dns_feature"></a>

配置完成后，可以将私有 DNS 功能集成到您的工作流程中，提供以下功能：
+  **API 请求**：根据端点的设置，使用默认区域 DNS 名称（`eks.region.amazonaws.com` 或 `eks.region.api.aws`）向 Amazon EKS 发出 API 请求。
+  **应用程序兼容性**：调用 EKS API 的现有应用程序无需进行任何更改即可利用此功能。
+  **具有双堆栈的 AWS CLI**：要将双堆栈端点与 AWS CLI 结合使用，请参阅《AWS SDKs and Tools Reference Guide》**中的 [Dual-stack and FIPS endpoints](https://docs.aws.amazon.com/sdkref/latest/guide/feature-endpoints.html) 配置。
+  **自动路由**：对 Amazon EKS 默认服务端点的任何调用都会通过接口端点自动定向，从而确保连接私有和安全。

# 了解 Amazon EKS 集群中的弹性
<a name="disaster-recovery-resiliency"></a>

AWS全球基础架构围绕AWS区域和可用区构建。AWS区域提供多个在物理上独立且隔离的可用区，这些可用区通过延迟低、吞吐量高且冗余性高的网络连接在一起。利用可用区，您可以设计和操作在可用区之间无中断地自动实现故障转移的应用程序和数据库。与传统的单个或多个数据中心基础架构相比，可用区具有更高的可用性、容错性和可扩展性。

Amazon EKS 跨多个AWS可用区运行和扩展 Kubernetes 控制层面以确保高可用性。Amazon EKS 可以根据负载自动缩放控制层面实例，检测并替换运行状况不佳的控制层面实例，并自动修补控制层面。启动版本更新后，Amazon EKS 会为您更新控制面板，从而在更新期间保持控制面板的高可用性。

此控制面板包含至少两个 API 服务器实例和三个 `etcd` 实例，这些实例在一个 AWS 区域内的三个可用区之间运行。Amazon EKS：
+ 主动监控控制面板实例上的负载，并自动扩展以确保高性能。
+ 自动检测和替换运行状况不佳的控制面板实例，并根据需要跨 AWS 区域内的可用区重新启动它们。
+ 利用AWS区域的架构以保持高可用性。因此，Amazon EKS 能够提供[确保 API 服务器端点可用性的 SLA](https://aws.amazon.com/eks/sla)。

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

# 防止在 Amazon EKS 中出现跨服务混淆代理
<a name="cross-service-confused-deputy-prevention"></a>

混淆代理问题是一个安全问题，即没有执行操作权限的实体可能会迫使更具权限的实体执行该操作。在 AWS 中，跨服务模拟可能会导致混淆代理问题。一个服务（*呼叫服务*）调用另一项服务（*所谓的服务*）时，可能会发生跨服务模拟。可以操纵调用服务以使用其权限对另一个客户的资源进行操作，否则该服务不应有访问权限。为防止这种情况，AWS 提供可帮助您保护所有服务的数据的工具，而这些服务中的服务主体有权限访问账户中的资源。

我们建议在资源策略中使用 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn) 和 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount) 全局条件上下文键，以限制 Amazon Elastic Kubernetes Service（Amazon EKS）为其他服务提供的资源访问权限。

 `aws:SourceArn`   
使用 `aws:SourceArn` 来仅将一个资源与跨服务访问相关联。

 `aws:SourceAccount`   
使用 `aws:SourceAccount` 来让该账户中的任何资源与跨服务使用相关联。

防范混淆代理问题最有效的方法是使用 `aws:SourceArn` 全局条件上下文键和资源的完整 ARN。如果不知道资源的完整 ARN，或者正在指定多个资源，请针对 ARN 未知部分使用带有通配符字符（\$1）的 `aws:SourceArn` 全局上下文条件键。例如 ` arn:aws:<servicename>:*:<123456789012>:*`。

如果 `aws:SourceArn` 值不包含账户 ID，例如 Amazon S3 桶 ARN，您必须使用 `aws:SourceAccount` 和 `aws:SourceArn` 来限制权限。

## 防止 Amazon EKS 集群角色出现跨服务混淆代理
<a name="cross-service-confused-deputy-cluster-role"></a>

每个集群都需要一个 Amazon EKS 集群 IAM 角色。由 Amazon EKS 管理的 Kubernetes 集群会使用此角色来管理节点，而[传统云提供商](https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/guide/service/annotations/#legacy-cloud-provider)会使用此角色为服务创建带有 Elastic Load Balancing 的负载均衡器。这些集群操作只能影响同一账户，因此建议您将每个集群角色限制为该集群和账户。这是 AWS 建议的具体应用，即在您的账户中遵循*最低权限原则*。

 **资源 ARN 格式** 

`aws:SourceArn` 的值必须是 EKS 集群的 ARN，格式为 ` arn:aws:eks:region:account:cluster/cluster-name `。例如，` arn:aws:eks:us-west-2:123456789012:cluster/my-cluster`。

 **EKS 集群角色的信任策略格式** 

以下示例演示如何使用 Amazon EKS 中的 `aws:SourceArn` 和 `aws:SourceAccount` 全局条件上下文键来防止混淆代理问题。

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "eks.amazonaws.com"
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "ArnLike": {
          "aws:SourceArn": "arn:aws:eks:us-west-2:123456789012:cluster/my-cluster"
          },
        "StringEquals": {
            "aws:SourceAccount": "123456789012"
        }
      }
    }
  ]
}
```