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.11.1 建议的结果。 结果适用于 AKS 1.29.x 到 AKS 1.32.x。 有关支持时间线,请参阅 支持的 Kubernetes 版本

安全级别

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

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

评估状态

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

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

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

证明状态

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

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

基准详细信息

CIS身份识别码 建议说明 评估状态 级别 状态 原因
1 控制平面组件
1.1 控制平面节点配置文件
1.1.1 确保 API 服务器 pod 规范文件权限设为 600 或更严格 自动化 L1 空值 N/A,因为 AKS 是托管解决方案
1.1.2 确保 API 服务器 Pod 规范文件所有权设置为 root: root 自动化 L1 空值 N/A,因为 AKS 是托管解决方案
1.1.3 确保控制器管理器 pod 规范文件权限设为 600 或更严格 自动化 L1 空值 N/A,因为 AKS 是托管解决方案
1.1.4 确保控制器管理器的 Pod 规范文件的所有权被设置为 root: root 自动化 L1 空值 N/A,因为 AKS 是托管解决方案
1.1.5 确保计划程序 pod 规范文件权限设为 600 或更严格 自动化 L1 空值 N/A,因为 AKS 是托管解决方案
1.1.6 确保调度程序 Pod 规格文件所有权设置为 root: root 自动化 L1 空值 N/A,因为 AKS 是托管解决方案
1.1.7 确保 etcd pod 规范文件权限设为 600 或更严格 自动化 L1 空值 N/A,因为 AKS 是托管解决方案
1.1.8 确保 etcd Pod 规范文件所有权设置为 root: root 自动化 L1 空值 N/A,因为 AKS 是托管解决方案
1.1.9 确保容器网络接口文件权限设为 600 或更严格 手动 L1 空值 N/A,因为 AKS 是托管解决方案
1.1.10 确保容器网络接口文件所有权设置为 root: root 手动 L1 空值 N/A,因为 AKS 是托管解决方案
1.1.11 确保 etcd 数据目录权限设为 700 或更严格 自动化 L1 空值 N/A,因为 AKS 是托管解决方案
1.1.12 确保 etcd 数据目录所有权设为 etcd:etcd 自动化 L1 空值 N/A,因为 AKS 是托管解决方案
1.1.13 确保 admin.conf 文件权限设为 600 或更严格 自动化 L1 空值 N/A,因为 AKS 是托管解决方案
1.1.14 确保 admin.conf 文件所有权设置为 root: root 自动化 L1 空值 N/A,因为 AKS 是托管解决方案
1.1.15 确保 scheduler.conf 文件权限设为 600 或更严格 自动化 L1 空值 N/A,因为 AKS 是托管解决方案
1.1.16 确保 scheduler.conf 文件所有权设置为 root: root 自动化 L1 空值 N/A,因为 AKS 是托管解决方案
1.1.17 确保 controller-manager.conf 文件权限设为 600 或更严格 自动化 L1 空值 N/A,因为 AKS 是托管解决方案
1.1.18 确保 controller-manager.conf 文件所有权设置为 root: root 自动化 L1 空值 N/A,因为 AKS 是托管解决方案
1.1.19 确保 Kubernetes PKI 目录和文件所有权设置为 root: root 自动化 L1 空值 N/A,因为 AKS 是托管解决方案
1.1.20 确保 Kubernetes PKI 证书文件权限设为 600 或更严格 手动 L1 空值 N/A,因为 AKS 是托管解决方案
1.1.21 确保 Kubernetes PKI 密钥文件权限设为 600 手动 L1 空值 N/A,因为 AKS 是托管解决方案
1.2 API 服务器
1.2.1 确保 --anonymous-auth 参数设为 false 手动 L1 通过
1.2.2 确保未设置--token-auth-file参数 自动化 L1 失败 由 AKS 自动旋转,当前已设置参数
1.2.3 请确保--DenyServiceExternalIPs未设置 手动 L1 失败 客户可以使用适用于 Kubernetes 的 Azure Policy 来拒绝具有外部 IP 的服务。
1.2.4 确保根据需要设置 --kubelet-client-certificate--kubelet-client-key 参数 自动化 L1 通过
1.2.5 确保根据需要设置 --kubelet-certificate-authority 参数 自动化 L1 失败 Kubelet 服务证书使用自签名证书
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 等效控制 AKS 将审核日志存储 14 天,Deployment.yaml 的值为 0。
1.2.18 确保将 --audit-log-maxbackup 参数设为 10 或所需数值 自动化 L1 等效控制 AKS 将审核日志存储 14 天,Deployment.yaml 的值为 0。
1.2.19 确保将 --audit-log-maxsize 参数设为 100 或所需数值 自动化 L1 通过
1.2.20 确保根据需要设置 --request-timeout 参数 手动 L1 通过 未设置参数,将设置默认值 = 60s(符合)
1.2.21 确保 --service-account-lookup 参数设为 true 自动化 L1 通过 未设置参数,将默认值设置为 true(符合)
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 取决于环境 启用 Azure KMS 时设置参数
1.2.28 确保正确配置加密提供程序 手动 L1 取决于环境 启用 Azure KMS 时设置参数
1.2.29 确保 API 服务器仅使用强加密密码 手动 L1 通过 AKS 支持来自 CIS 的 21 个推荐的 4 个强密码套件的子集
1.2.30 确保参数 --service-account-extend-token-expiration 设置为 false 自动化 L1 取决于环境 在群集上启用 OIDC 时,此参数设置为 false
1.3 控制器管理器
1.3.1 确保根据需要设置 --terminated-pod-gc-threshold 参数 手动 L1 通过 AKS 将默认值设置为 6000 而不是 12500
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 通过 参数设置为 true,请参阅 Kubelet 服务证书轮换
1.3.7 确保 --bind-address 参数设为 127.0.0.1 自动化 L1 等效控制 使用 Pod 的 IP
1.4 计划程序
1.4.1 确保 --profiling 参数设为 false 自动化 L1 通过
1.4.2 确保 --bind-address 参数设为 127.0.0.1 自动化 L1 等效控制 使用 Pod 的 IP
2 etcd
2.1 确保根据需要设置 --cert-file--key-file 参数 自动化 L1 通过
2.2 确保根据需要设置 --cert-file--key-file 参数 自动化 L1 通过
2.3 确保 --client-cert-auth 参数设为 true 自动化 L1 通过
2.4 确保 --auto-tls 参数未设置为 true 自动化 L1 通过 未设置参数,将默认值设置为 false(符合)
2.5 确保根据需要设置 --peer-cert-file--peer-key-file 参数 自动化 L1 通过
2.6 确保 --peer-client-cert-auth 参数设为 true 自动化 L1 通过
2.7 确保 --peer-auto-tls 参数未设置为 true 自动化 L1 通过 未设置参数,将默认值设置为 false(符合)
2.8 确保使用唯一的证书颁发机构 etcd 手动 L2 通过 --client-ca-file 对于 api-server,不同于 --trusted-ca-file etcd
3 控制平面配置
3.1 身份验证和授权
3.1.1 不应将客户端证书身份验证用于用户 手动 L1 通过 部署 AKS 群集时,默认启用本地帐户。 可以 禁用本地帐户 以禁用用于身份验证的客户端证书。
3.1.2 不应将服务帐户令牌身份验证用于用户 手动 L1 通过 AKS 为发送到群集控制平面的请求提供 对 Microsoft Entra 身份验证 的支持。 服务帐户令牌的使用将留给客户(根据需要强制实施最佳做法)
3.1.3 不应将启动令牌身份验证用于用户 手动 L1 通过 用户无法使用启动令牌
3.2 伐木业
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 失败 AKS 针对 kube-proxy 具有中央 Prometheus 擦除功能,并在检测到时 KubeProxyStale 应用警报和自动修正。 该 metrics-bind-address 设置用于该目的。
5 策略
5.1 RBAC 和服务帐户
5.1.1 确保仅在需要时使用 cluster-admin 角色 自动化 L1 取决于环境 对 Azure Kubernetes 服务使用 Azure Policy 内置策略定义
5.1.2 尽量减少对机密的访问 自动化 L1 取决于环境
5.1.3 尽量减少在角色和群集角色中使用通配符 自动化 L1 取决于环境 对 Azure Kubernetes 服务使用 Azure Policy 内置策略定义
5.1.4 尽量减少对 create pod 的访问 自动化 L1 取决于环境
5.1.5 确保未主动使用默认服务帐户 自动化 L1 取决于环境
5.1.6 确保仅在必要时安装服务帐户令牌 自动化 L1 取决于环境
5.1.7 避免使用系统:管理员组 手动 L1 取决于环境
5.1.8 限制在 Kubernetes 群集中使用 Bind、Impersonate 和升级权限 手动 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 取决于环境 对 Azure Kubernetes 服务使用 Azure Policy 内置策略定义
5.2.2 尽量减少特权容器的准入 手动 L1 取决于环境 对 Azure Kubernetes 服务使用 Azure Policy 内置策略定义
5.2.3 尽量减少要共享主机进程 ID 命名空间的容器的准入 手动 L1 取决于环境 对 Azure Kubernetes 服务使用 Azure Policy 内置策略定义
5.2.4 尽量减少要共享主机 IPC 命名空间的容器的准入 手动 L1 取决于环境 对 Azure Kubernetes 服务使用 Azure Policy 内置策略定义
5.2.5 尽量减少要共享主机网络命名空间的容器的准入 手动 L1 取决于环境 对 Azure Kubernetes 服务使用 Azure Policy 内置策略定义
5.2.6 尽量减少具有 allowPrivilegeEscalation 的容器的准入 手动 L1 取决于环境 对 Azure Kubernetes 服务使用 Azure Policy 内置策略定义
5.2.7 尽量减少根容器的准入 手动 L2 取决于环境
5.2.8 尽量减少具有 NET_RAW 功能的容器的准入 手动 L1 取决于环境 对 Azure Kubernetes 服务使用 Azure Policy 内置策略定义
5.2.9 尽量减少具有附加功能的容器的准入 手动 L1 取决于环境 对 Azure Kubernetes 服务使用 Azure Policy 内置策略定义
5.2.10 尽量减少具有已分配功能的容器的准入 手动 L2 取决于环境
5.2.11 最大程度地减少 Windows HostProcess 容器的准入 手动 L1 取决于环境
5.2.12 最大程度地减少 HostPath 卷的准入 手动 L1 取决于环境 对 Azure Kubernetes 服务使用 Azure Policy 内置策略定义
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 安全性的详细信息,请参阅以下文章: