Amazon EKS 安全最佳实践 - Amazon EKS
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

Amazon EKS 安全最佳实践

本主题提供了针对您的集群的安全最佳实践。

限制对 IMDS 和 Amazon EC2 实例配置文件凭证的访问

默认情况下,Amazon EC2 实例元数据服务 (IMDS) 向实例提供分配给节点 IAM 角色的凭证以及在该实例上运行的任何容器。当您为服务账户使用 IAM 角色时,它会更新 Pod 的凭证链以将 IAM 角色用于服务账户令牌。但是,Pod 仍然可以继承分配给节点的实例配置文件的权。我们建议您在以下情况下阻止 Pod 对 IMDS 的访问,以最大程度地减少您的容器可用的权限:

  • 您已为服务账户实施了 IAM 角色,并将必要的权限直接分配给了需要访问 AWS 服务的所有 Pod。

  • 集群中的任何 Pod 都不需要出于其他原因访问 IMDS,如检索当前区域。

有关更多信息,请参阅从实例元数据检索安全凭证。您可以使用以下选项之一禁止从您的实例和容器访问 IMDS。

重要

如果您在集群中使用 AWS 负载均衡器控制器,则可能需要更改负载均衡器配置。有关更多信息,请参阅将 AWS 负载均衡器控制器部署到 Amazon EKS 集群

  • 阻止从节点和所有容器访问 IMDSv1 并为不使用主机联网的所有容器阻止访问 IMDSv2 您的实例和 Pod 在 Pod 规范中有 – 的 Pod 使用主机联网。hostNetwork: true要实施此选项,请完成行和列中适用于您的情况的步骤。

    部署方法 新节点组 现有节点组
    不带自定义启动模板的托管节点 无法使用 eksctl 以外的任何部署方法。 如果与 eksctl 一起部署,请将 --disable-pod-imds 选项与 eksctl create nodegroup 结合使用。eksctl 可用于根据您指定的选项创建启动模板,并使用该启动模板部署节点组。 我们建议使用自定义启动模板创建新节点组,该模板包含此表下一行的 New node group 列中的设置。
    具有自定义启动模板的托管节点 启动模板的 Advanced details (高级详细信息) 中设置以下设置:
    • 元数据可访问Enabled

    • 元数据版本V2 only (token required)

    • 元数据响应跃点数限制1

    使用 New 列中的设置更新您的启动模板,然后使用新的启动模板版本更新您的节点组
    自行管理
    • 如果使用 AWS 管理控制台 创建节点组

      1. 下载适用于您的区域和操作系统的自管理节点组 AWS CloudFormation 模板。

        • Linux – 和 中国(北京) 之外的所有区域中国 (宁夏)

          https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2020-10-29/amazon-eks-nodegroup.yaml
        • Linux – 中国(北京) 和中国 (宁夏)

          https://s3.cn-north-1.amazonaws.com.cn/amazon-eks//cloudformation/2020-10-29/amazon-eks-nodegroup.yaml
        • Windows – 和 中国(北京) 之外的所有区域中国 (宁夏)

          https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2020-10-29/amazon-eks-windows-nodegroup.yaml
        • Windows – 中国(北京) 和中国 (宁夏)

          https://s3.cn-north-1.amazonaws.com.cn/amazon-eks//cloudformation/2020-10-29/amazon-eks-windows-nodegroup.yaml
      2. 编辑 文件。将显示 HttpPutResponseHopLimit : 2 的行更改为 HttpPutResponseHopLimit : 1 并保存文件。

      3. 按照启动自管理 Amazon Linux 节点启动自管理 Windows 节点中的说明部署节点组。有关指定 AWS CloudFormation 模板的说明,请选择 Upload a template file (上传模板文件),选择 Choose file (选择文件),选择编辑后的文件,然后继续按照说明操作。也将 DisableIMDSv1 的值也设置为 true

    • 如果使用 eksctl 创建节点组,请将 --disable-pod-imds 选项与 eksctl create nodegroup 结合使用。

    • 使用 AWS 管理控制台 更新或迁移节点组

      1. 下载适用于您的区域和操作系统的自管理节点组 AWS CloudFormation 模板。

        • Linux – 和 中国(北京) 之外的所有区域中国 (宁夏)

          https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2020-10-29/amazon-eks-nodegroup.yaml
        • Linux – 中国(北京) 和中国 (宁夏)

          https://s3.cn-north-1.amazonaws.com.cn/amazon-eks//cloudformation/2020-10-29/amazon-eks-nodegroup.yaml
        • Windows – 和 中国(北京) 之外的所有区域中国 (宁夏)

          https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2020-10-29/amazon-eks-windows-nodegroup.yaml
        • Windows – 中国(北京) 和中国 (宁夏)

          https://s3.cn-north-1.amazonaws.com.cn/amazon-eks//cloudformation/2020-10-29/amazon-eks-windows-nodegroup.yaml
      2. 编辑 文件。将显示 HttpPutResponseHopLimit : 2 的行更改为 HttpPutResponseHopLimit : 1 并保存文件。

      3. 按照更新现有的自行管理节点组中的说明更新自行管理的节点组。有关指定 AWS CloudFormation 模板的说明,不要选择 Amazon S3 URL,而是选择 Upload a template file (上传模板文件),然后选择 Choose file (选择文件),选择编辑后的文件,然后继续按照说明操作。将 DisableIMDSv1 的值也设置为 true

      重要

      每次您出于任何原因更新节点组(例如,新的 AMI 或 Kubernetes 版本)时,您都需要再次更改模板中的先前设置。

    • 如果使用 eksctl 迁移节点组,则在创建新节点组时,请将 --disable-pod-imds 选项与 eksctl create nodegroup 结合使用。

      重要

      每次您出于任何原因更新节点组(例如,新的 AMI 或 Kubernetes 版本)时,请确保在创建新节点组时使用此选项。

  • 为不使用主机联网的所有容器阻止对 IMDSv1 和 IMDSv2 的访问 – 您的实例和 Pod(在 Pod 规范中有 hostNetwork: true)使用主机联网,但由于早期原因,仍需要访问 IMDSv1。 在每个 iptables 节点(以根用户身份)上运行以下 Amazon Linux 命令或将其包含在实例引导用户数据脚本中。

    yum install -y iptables-services iptables --insert FORWARD 1 --in-interface eni+ --destination 169.254.169.254/32 --jump DROP iptables-save | tee /etc/sysconfig/iptables systemctl enable --now iptables
    重要
    • 上一个规则仅适用于节点中名称以 eni 开头的网络接口,这是 CNI 插件为不使用主机联网的 Pod 创建的所有网络接口。节点或使用主机网络的 Pod(如 kube-proxy 和 CNI 插件)不会丢弃到 IMDS 的流量。

    • 如果您使用 Calico 等工具实施网络策略,则先前的规则可能会被覆盖。实施网络策略时,请确保它不会覆盖此规则,或者您的策略包含此规则。

    • 如果您已将安全组应用于 Pod,则除了上一个命令之外,还具有分支网络接口,请运行以下命令。

      iptables -t mangle -A POSTROUTING -o vlan+ --destination 169.254.169.254/32 --jump DROP

      有关分支网络接口的更多信息,请参阅Pod 的安全组