Internet 安全中心 (CIS) Kubernetes 基准

Azure Kubernetes 服务 (AKS) 是符合 SOC、ISO、PCI DSS 和 HIPAA 标准的安全服务。 本文介绍了基于 CIS Kubernetes 基准应用到 AKS 的安全强化。 有关 AKS 安全性的详细信息,请参阅 Azure Kubernetes 服务 (AKS) 中应用程序和群集的安全性概念。 有关 CIS 基准的更多信息,请参阅 Internet 安全中心 (CIS) 基准

Kubernetes CIS 基准

以下是关于 AKS 的 CIS Kubernetes V1.27 基准 v1.9.0 建议的结果。 结果适用于 AKS 1.27.x 到 AKS 1.29.x。

安全级别

CIS 基准提供两个级别的安全设置:

  • L1(即级别 1)建议可在任何系统上配置且应基本不会或不会导致服务中断或导致功能性降低的基本必需安全要求。
  • L2(即级别 2)建议适用于需高安全性的环境,但可能会导致某些功能性降低的安全设置。

评估状态

每个建议都包含评估状态。 评估状态指示给定的建议是可以自动执行的,还是需要手动步骤才能实现。 这两种状态都同样重要,并按以下定义确定和支持:

  • 自动化:表示可以完全自动化技术控制评估并将其验证为通过/失败状态的建议。 建议将包括实现自动化所需的信息。
  • 手动:表示无法完全自动化技术控制评估的建议,并要求执行所有或一些手动步骤来验证配置的状态是否按预期设置。 预期状态可能因环境而异。

自动化 建议(如果未应用)会影响基准分数,而 手册 建议(如果未应用)则不会。

证明状态

建议书可以有以下一种证明状态:

  • 通过 : 已应用建议。
  • 失败 : 未应用建议。
  • N/A : 建议涉及与 AKS 无关的清单文件权限要求。 默认情况下,Kubernetes 群集使用清单模型来部署控制平面 Pod,这些 Pod 依赖于节点 VM 中的文件。 CIS Kubernetes 基准建议这些文件必须具有一定的权限要求。 AKS 群集使用 Helm 图表来部署控制平面 Pod,并且不依赖于节点 VM 中的文件。
  • 取决于环境 : 建议在用户的特定环境中应用,且不受 AKS 控制。 自动化 :无论建议是否应用于用户的特定环境,建议都会影响基准分数。
  • 等效控制 : 建议以不同的等效方式实现。

基准详细信息

CIS ID 建议说明 评估状态 Level 状态
1 控制平面组件
1.1 控制平面节点配置文件
1.1.1 确保 API 服务器 pod 规范文件权限设为 600 或更严格 自动化 L1 空值
1.1.2 确保 API 服务器 pod 规范文件所有权设为 root:root 自动化 L1 空值
1.1.3 确保控制器管理器 pod 规范文件权限设为 600 或更严格 自动化 L1 空值
1.1.4 确保控制器管理器 pod 规范文件所有权设为 root:root 自动化 L1 空值
1.1.5 确保计划程序 pod 规范文件权限设为 600 或更严格 自动化 L1 空值
1.1.6 确保计划程序 pod 规范文件所有权设为 root:root 自动化 L1 空值
1.1.7 确保 etcd pod 规范文件权限设为 600 或更严格 自动化 L1 空值
1.1.8 确保 etcd pod 规范文件所有权设为 root:root 自动化 L1 空值
1.1.9 确保容器网络接口文件权限设为 600 或更严格 手动 L1 空值
1.1.10 确保容器网络接口文件所有权设为 root:root 手动 L1 空值
1.1.11 确保 etcd 数据目录权限设为 700 或更严格 自动化 L1 空值
1.1.12 确保 etcd 数据目录所有权设为 etcd:etcd 自动化 L1 空值
1.1.13 确保 admin.conf 文件权限设为 600 或更严格 自动化 L1 空值
1.1.14 确保 admin.conf 文件所有权设为 root:root 自动化 L1 空值
1.1.15 确保 scheduler.conf 文件权限设为 600 或更严格 自动化 L1 空值
1.1.16 确保 scheduler.conf 文件所有权设为 root:root 自动化 L1 空值
1.1.17 确保 controller-manager.conf 文件权限设为 600 或更严格 自动化 L1 空值
1.1.18 确保 controller-manager.conf 文件所有权设为 root:root 自动化 L1 空值
1.1.19 确保 Kubernetes PKI 目录和文件所有权设为 root:root 自动化 L1 空值
1.1.20 确保 Kubernetes PKI 证书文件权限设为 600 或更严格 手动 L1 空值
1.1.21 确保 Kubernetes PKI 密钥文件权限设为 600 手动 L1 空值
1.2 API 服务器
1.2.1 确保 --anonymous-auth 参数设为 false 手动 L1 通过
1.2.2 确保未设置 --token-auth-file 参数 自动化 L1 失败
1.2.3 确保未设置 --DenyServiceExternalIPs 手动 L1 失败
1.2.4 确保根据需要设置 --kubelet-client-certificate--kubelet-client-key 参数 自动化 L1 通过
1.2.5 确保根据需要设置 --kubelet-certificate-authority 参数 自动化 L1 失败
1.2.6 确保 --authorization-mode 参数未设为 AlwaysAllow 自动化 L1 通过
1.2.7 确保 --authorization-mode 参数包括 Node 自动化 L1 通过
1.2.8 确保 --authorization-mode 参数包括 RBAC 自动化 L1 通过
1.2.9 确保已设置准入控制插件 EventRateLimit 手动 L1 失败
1.2.10 确保未设置准入控制插件 AlwaysAdmit 自动化 L1 通过
1.2.11 确保已设置准入控制插件 AlwaysPullImages 手动 L1 失败
1.2.12 确保已设置准入控制插件 ServiceAccount 自动化 L2 未通过
1.2.13 确保已设置准入控制插件 NamespaceLifecycle 自动化 L2 通过
1.2.14 确保已设置准入控制插件 NodeRestriction 自动化 L2 通过
1.2.15 确保 --profiling 参数设为 false 自动化 L1 通过
1.2.16 确保已设置 --audit-log-path 参数 自动化 L1 通过
1.2.17 确保将 --audit-log-maxage 参数设为 30 或所需数值 自动化 L1 等效控制
1.2.18 确保将 --audit-log-maxbackup 参数设为 10 或所需数值 自动化 L1 等效控制
1.2.19 确保将 --audit-log-maxsize 参数设为 100 或所需数值 自动化 L1 通过
1.2.20 确保根据需要设置 --request-timeout 参数 手动 L1 通过
1.2.21 确保 --service-account-lookup 参数设为 true 自动化 L1 通过
1.2.22 确保根据需要设置 --service-account-key-file 参数 自动化 L1 通过
1.2.23 确保根据需要设置 --etcd-certfile--etcd-keyfile 参数 自动化 L1 通过
1.2.24 确保根据需要设置 --tls-cert-file--tls-private-key-file 参数 自动化 L1 通过
1.2.25 确保根据需要设置 --client-ca-file 参数 自动化 L1 通过
1.2.26 确保根据需要设置 --etcd-cafile 参数 自动化 L1 通过
1.2.27 确保根据需要设置 --encryption-provider-config 参数 手动 L1 取决于环境
1.2.28 确保正确配置加密提供程序 手动 L1 取决于环境
1.2.29 确保 API 服务器仅使用强加密密码 手动 L1 通过
1.3 控制器管理器
1.3.1 确保根据需要设置 --terminated-pod-gc-threshold 参数 手动 L1 通过
1.3.2 确保 --profiling 参数设为 false 自动化 L1 通过
1.3.3 确保 --use-service-account-credentials 参数设为 true 自动化 L1 通过
1.3.4 确保根据需要设置 --service-account-private-key-file 参数 自动化 L1 通过
1.3.5 确保根据需要设置 --root-ca-file 参数 自动化 L1 通过
1.3.6 确保 RotateKubeletServerCertificate 参数设为 true 自动化 L2 通过
1.3.7 确保 --bind-address 参数设为 127.0.0.1 自动化 L1 等效控制
1.4 计划程序
1.4.1 确保 --profiling 参数设为 false 自动化 L1 通过
1.4.2 确保 --bind-address 参数设为 127.0.0.1 自动化 L1 等效控制
2 etcd
2.1 确保根据需要设置 --cert-file--key-file 参数 自动化 L1 通过
2.2 确保 --client-cert-auth 参数设为 true 自动化 L1 通过
2.3 确保 --auto-tls 参数未设为 true 自动化 L1 通过
2.4 确保根据需要设置 --peer-cert-file--peer-key-file 参数 自动化 L1 通过
2.5 确保 --peer-client-cert-auth 参数设为 true 自动化 L1 通过
2.6 确保 --peer-auto-tls 参数未设为 true 自动化 L1 通过
2.7 确保对 etcd 使用唯一的证书颁发机构 手动 L2 通过
3 控制平面配置
3.1 身份验证和授权
3.1.1 客户端证书身份验证不应用于用户 手动 L1 通过
3.1.2 不应对用户使用服务帐户令牌身份验证 手动 L1 通过
3.1.3 不应对用户使用启动令牌身份验证 手动 L1 通过
3.2 Logging
3.2.1 确保已创建最小审核策略 手动 L1 通过
3.2.2 确保审核策略包含关键安全问题 手动 L2 通过
4 工作节点
4.1 工作器节点配置文件
4.1.1 确保 kubelet 服务文件权限设为 600 或更严格 自动化 L1 通过
4.1.2 确保 kubelet 服务文件所有权设为 root:root 自动化 L1 通过
4.1.3 如果存在代理 kubeconfig 文件,请确保权限设为 600 或更严格 手动 L1 空值
4.1.4 如果存在代理 kubeconfig 文件,请确保所有权设为 root:root 手动 L1 空值
4.1.5 确保 --kubeconfig kubelet.conf 文件权限设为 600 或更严格 自动化 L1 通过
4.1.6 确保 --kubeconfig kubelet.conf 文件所有权设为 root:root 自动化 L1 通过
4.1.7 确保证书颁发机构文件权限设为 600 或更严格 手动 L1 通过
4.1.8 确保客户端证书颁发机构文件所有权设为 root:root 手动 L1 通过
4.1.9 如果使用 kubelet config.yaml 配置文件,请确保权限设为 600 或更严格 自动化 L1 通过
4.1.10 如果使用 kubelet config.yaml 配置文件,请确保所有权设为 root:root 自动化 L1 通过
4.2 kubelet
4.2.1 确保 --anonymous-auth 参数设为 false 自动化 L1 通过
4.2.2 确保 --authorization-mode 参数未设为 AlwaysAllow 自动化 L1 通过
4.2.3 确保根据需要设置 --client-ca-file 参数 自动化 L1 通过
4.2.4 确保 --read-only-port 参数设为 0 手动 L1 通过
4.2.5 确保 --streaming-connection-idle-timeout 参数未设为 0 手动 L1 通过
4.2.6 确保 --make-iptables-util-chains 参数设为 true 自动化 L1 通过
4.2.7 确保未设置 --hostname-override 参数 手动 L1 通过
4.2.8 确保将 --eventRecordQPS 参数设为可实现相应事件捕获的级别 手动 L2 通过
4.2.9 确保根据需要设置 --tls-cert-file--tls-private-key-file 参数 手动 L1 通过
4.2.10 确保 --rotate-certificates 参数未设为 false 自动化 L1 通过
4.2.11 验证 RotateKubeletServerCertificate 参数设为 true 手动 L1 失败
4.2.12 确保 Kubelet 仅使用强加密密码 手动 L1 通过
4.2.13 确保对 Pod PID 设置限制 手动 L1 通过
4.3 kube-proxy
4.3.1 确保 kube-proxy 指标服务绑定到 localhost 自动化 L1 通过
5 策略
5.1 RBAC 和服务帐户
5.1.1 确保仅在需要时使用 cluster-admin 角色 自动化 L1 取决于环境
5.1.2 尽量减少对机密的访问 自动化 L1 取决于环境
5.1.3 尽量减少在角色和群集角色中使用通配符 自动化 L1 取决于环境
5.1.4 尽量减少对 create pod 的访问 自动化 L1 取决于环境
5.1.5 确保未主动使用默认服务帐户 自动化 L1 取决于环境
5.1.6 确保仅在必要时安装服务帐户令牌 自动化 L1 取决于环境
5.1.7 避免使用 system:masters 组 手动 L1 取决于环境
5.1.8 在 Kubernetes 群集中限制绑定、模拟和提升权限的使用 手动 L1 取决于环境
5.1.9 最大程度地减少用于创建永久性卷的访问权限 手动 L1 取决于环境
5.1.10 最大程度地减少对节点的代理子资源的访问 手动 L1 取决于环境
5.1.11 最大程度地减少对 certificatesigningrequests 对象的审批子资源的访问 手动 L1 取决于环境
5.1.12 最大程度地减少对 Webhook 配置对象的访问 手动 L1 取决于环境
5.1.13 最大程度地减少对服务帐户令牌创建的访问 手动 L1 取决于环境
5.2 Pod 安全标准
5.2.1 确保群集至少具有一个活动策略控制机制 手动 L1 取决于环境
5.2.2 尽量减少特权容器的准入 手动 L1 取决于环境
5.2.3 尽量减少要共享主机进程 ID 命名空间的容器的准入 手动 L1 取决于环境
5.2.4 尽量减少要共享主机 IPC 命名空间的容器的准入 手动 L1 取决于环境
5.2.5 尽量减少要共享主机网络命名空间的容器的准入 手动 L1 取决于环境
5.2.6 尽量减少具有 allowPrivilegeEscalation 的容器的准入 手动 L1 取决于环境
5.2.7 尽量减少根容器的准入 手动 L2 取决于环境
5.2.8 尽量减少具有 NET_RAW 功能的容器的准入 手动 L1 取决于环境
5.2.9 尽量减少具有附加功能的容器的准入 手动 L1 取决于环境
5.2.10 尽量减少具有已分配功能的容器的准入 手动 L2 取决于环境
5.2.11 最大程度地减少 Windows HostProcess 容器的准入 手动 L1 取决于环境
5.2.12 最大程度地减少 HostPath 卷的准入 手动 L1 取决于环境
5.2.13 最大程度地减少使用 HostPorts 的容器的准入 手动 L1 取决于环境
5.3 网络策略和 CNI
5.3.1 确保使用中的 CNI 支持网络策略 手动 L1 通过
5.3.2 确保所有命名空间均已定义网络策略 手动 L2 取决于环境
5.4 机密管理
5.4.1 优先使用机密作为文件,而不是作为环境变量 手动 L2 取决于环境
5.4.2 考虑外部机密存储 手动 L2 取决于环境
5.5 可扩展准入控制
5.5.1 使用 ImagePolicyWebhook 准入控制器配置图像来源 手动 L2 未通过
5.6 常规策略
5.6.1 使用命名空间在资源之间创建管理边界 手动 L1 取决于环境
5.6.2 确保在 pod 定义中将 seccomp 配置文件设为 docker/default 手动 L2 取决于环境
5.6.3 将安全性上下文应用于 Pod 和容器 手动 L2 取决于环境
5.6.4 不应使用默认命名空间 手动 L2 取决于环境

备注

除了 Kubernetes CIS 基准之外,还可以使用 AKS CIS 基准

附加说明

  • 经过安全强化的 OS 是专门为 AKS 构建和维护的,因此,“仅”在 AKS 平台受支持。
  • 为了进一步减少攻击面,操作系统中一些不必要的内核模块驱动程序被禁用。

后续步骤

有关 AKS 安全性的详细信息,请参阅以下文章: