Amazon EKS 安全最佳实践 - Amazon EKS

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

Amazon EKS 安全最佳实践

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

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

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

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

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

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

重要

如果您在集群中使用 AWS Load Balancer 控制器,则可能需要更改负载均衡器配置。有关更多信息,请参阅 将 AWS Load 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列,然后更新节点组使用新的启动模板版本。
    自托管
    • 如果使用 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
        • 窗户 — 中国(北京)和中国(宁夏)

          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 节点。有关指定 AWS CloudFormation 模板的说明,而不是选择Amazon S3 URL中,选择上传模板文件,然后选择选择文件,选择已编辑的文件,然后继续执行说明。将值设置为禁用数据库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
        • 窗户 — 中国(北京)和中国(宁夏)

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

      3. 使用更新现有自行管理的节点组。有关指定 AWS 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

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