

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

# Amazon EKS 的加密最佳实践
<a name="eks"></a>

[亚马逊 Elastic Kubernetes Service（亚马逊](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html) EKS）可帮助你在上面运行 AWS Kubernetes，而无需安装或维护自己的 Kubernetes 控制平面或节点。在 Kubernetes 中，*密钥*可帮助您管理敏感信息，比如用户证书、密码或 API 密钥。默认情况下，这些密钥以未加密方式存储在 API 服务器的底层数据存储中（称为 [etcd](https://etcd.io/docs/v3.5/faq/)）。[在亚马逊 EKS 上，节点的亚马逊弹性区块存储 (Amazon EBS) 卷`etcd`使用亚马逊 EBS 加密进行加密。](https://docs.aws.amazon.com/ebs/latest/userguide/ebs-encryption.html)任何具有 API 访问权限或 `etcd` 访问权限的用户都可以检索或修改密钥。此外，任何有权在命名空间中创建 pod 的人都可以使用该访问权限读取该命名空间中的任何密钥。您可以使用托管密钥或客户 AWS 托管密钥在 Amazon EKS 中对这些秘密进行 AWS KMS keys静态加密。另一种使用方法`etcd`是使用 S [AWS ecrets and Config Provider (ASCP)](https://github.com/aws/secrets-store-csi-driver-provider-aws)（GitHub 存储库）。ASCP 与 IAM 和基于资源的策略集成，可限制对密钥的访问，且仅限于集群内特定 Kubernetes pod。

你可以在 Kubernetes 中使用以下 AWS 存储服务：
+ 对于 Amazon EBS，您可以使用树内存储驱动程序或 A [mazon EBS](https://docs.aws.amazon.com/eks/latest/userguide/ebs-csi.html) CSI 驱动程序。两者都包含用于加密卷和提供客户管理密钥的参数。
+ 对于 Amazon Elastic File System（Amazon EFS），您可以使用支持动态和静态预置的 [Amazon EFS CSI 驱动程序](https://docs.aws.amazon.com/eks/latest/userguide/efs-csi.html)。

考虑下面针对该服务的加密最佳实践：
+ 如果使用 `etcd` 来存储默认未加密的密钥对象，请执行以下操作以帮助保护密钥：
  + [加密静态密钥数据](https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/)（Kubernetes 文档）。
  +  AWS KMS 用于对 Kubernetes 机密进行信封加密。这允许您使用唯一的数据密钥加密您的机密。您可以使用 AWS KMS 密钥加密密钥来加密数据密钥。您可以定期自动轮换密钥加密密钥。使用适用于 Kubernetes 的 AWS KMS 插件，所有 Kubernetes 机密都存储在密文中。`etcd`它们只能由 Kubernetes API 服务器解密。有关更多信息，请参阅[使用 Amazon EKS 加密提供商支持进行深度防御](https://aws.amazon.com/blogs/containers/using-eks-encryption-provider-support-for-defense-in-depth/)和使用现有集[群加密 Kubernetes 密钥](https://docs.aws.amazon.com/eks/latest/userguide/enable-kms.html)。 AWS KMS 
  + 通过基于角色的访问控制（RBAC）规则启用或配置授权，来限制读写密钥。限制创建新密钥或替换现有密钥的权限。有关更多信息，请参阅 [Authorization overview](https://kubernetes.io/docs/reference/access-authn-authz/authorization/)（Kubernetes 文档）。
  + 如果您要在一个 Pod 中定义多个容器，并且其中只有一个容器需要访问密钥，请定义卷挂载，使其他容器无法访问该密钥。作为卷挂载的密钥将实例化为 `tmpfs` 卷，并在删除 pod 时自动从节点中删除。您也可以使用环境变量，但我们不建议使用这种方法，因为环境变量的值可能会出现在日志中。有关更多信息，请参阅 [Secrets](https://kubernetes.io/docs/concepts/configuration/secret/)（Kubernetes 文档）。
  + 如果可能，避免授予对命名空间中密钥的 `watch` 和 `list` 请求的访问权限。在 Kubernetes API 中，这些请求非常强大，因为它们允许客户端检查该命名空间中每个密钥的值。
  + 仅允许集群管理员访问 `etcd`，包括只读访问权限。
  + 如果有多个 `etcd` 实例，确保 `etcd` 使用 TLS 在 `etcd` 对等机之间进行通信。
+ 如果您使用的是 ASCP，请执行以下操作来帮助保护密钥：
  + 使用[服务账户的 IAM 角色](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html)，限制只有经过授权的 pod 才能访问密钥。
  + 使用加密[提供商（GitHub 存储库）使用客户托管的 KMS 密钥实现信封AWS 加密](https://github.com/kubernetes-sigs/aws-encryption-provider)，从而启用 Kubernetes 密钥的加密。
+ 为了帮助降低环境变量造成数据泄露的风险，我们建议您使用[AWS Secrets Manager 和 Config Provider for Secret Store CSI 驱动程序](https://github.com/aws/secrets-store-csi-driver-provider-aws) (GitHub)。该驱动程序允许您使存储在 Secrets Manager 中的密钥和存储在 Parameter Store 中的参数显示为挂载在 Kubernetes Pod 中的文件。
**注意**  
AWS Fargate 不支持。
+ 创建 Amazon CloudWatch 指标筛选器和警报，以针对管理员指定的操作发送警报，例如删除密钥或在等待删除期间使用密钥版本。有关更多信息，请参阅 [Creating an alarm based on anomaly detection](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Create_Anomaly_Detection_Alarm.html)。