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

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

Amazon EKS 安全最佳实践

本主题说明了您的集群的安全最佳实践。

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

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

  • 您已为服务账户实现 IAM 角色,并已直接为需要访问Amazon服务。

  • 由于其他原因(例如检索当前区域),集群中没有容器需要访问 IMDS。

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

重要

如果您使用Amazon集群中的 Load Balancer 控制器,您可能需要更改负载均衡器配置。有关更多信息,请参阅 部署AmazonLoad Balancer 控制器连接到 Amazon EKS 群集

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

    部署方法 新的节点组 现有的节点组
    没有自定义启动模板的托管节点 不可能使用除eksctl。如果使用eksctl,请使用--disable-pod-imds将选项为eksctl create nodegroupeksctl,因为它会根据您指定的选项创建启动模板,并使用该启动模板部署节点组。 我们建议使用自定义启动模板创建新的节点组,该模板包含New node group列中的下一行。
    带有自定义启动模板的托管节点 设置以下设置在启动模板的 高级详细信息
    • 可访问元数据Enabled

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

    • 元数据响应跃点限制1

    使用New列,然后更新节点组使用新的启动模板版本。
    自行管理
    • 如果使用Amazon Web Services Management Console

      1. 下载自行管理的节点组Amazon 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
        • 窗户 — 中国(北京)和中国(宁夏)

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

      3. 使用中的说明部署节点组启动自我管理的亚马逊 Linux 节点或者启动自行管理的 Windows 节点。有关指定Amazon CloudFormation模板,而不是选择Amazon S3 URL,选择上传模板文件,然后选择选择文件,选择已编辑的文件,然后继续执行说明。将值设置为禁用数据库true也。

    • 如果使用eksctl,请使用--disable-pod-imds将选项为eksctl create nodegroup

    • 如果使用Amazon Web Services Management Console

      1. 下载自行管理的节点组Amazon 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
        • 窗户 — 中国(北京)和中国(宁夏)

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

      3. 使用更新现有自行管理的节点组。有关指定Amazon CloudFormation模板,而不是选择Amazon S3 URL,选择上传模板文件,然后选择选择文件,选择已编辑的文件,然后继续执行说明。将值设置为禁用数据库true也。

      重要

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

    • 如果使用eksctl,然后在创建新节点组时,使用--disable-pod-imds将选项为eksctl create nodegroup

      重要

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

  • 阻止所有不使用主机网络的容器访问 IMDSv1 和 IMDSv2— 您的实例和具有hostNetwork: true使用主机网络,但由于传统原因,仍然需要访问 IMDSv1。运行以下命令iptables命令(作为 root 节点),或将它们包含在实例引导用户数据脚本中。

    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 插件为不使用主机网络的容器创建的所有网络接口。不会为节点或使用主机网络的容器丢弃到 IMDS 的流量,例如kube-proxy和 CNI 插件。

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

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

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

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