你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

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.8.0 的结果。 这些结果适用于 AKS 1.21.x 到 AKS 1.27.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 即使不使用 PodSecurityPolicy,确保已设置准入控制插件 SecurityContextDeny 未评分 L1 失败
1.2.13 确保已设置准入控制插件 ServiceAccount 已评分 L1 通过
1.2.14 确保已设置准入控制插件 NamespaceLifecycle 已评分 L1 通过
1.2.15 确保已设置准入控制插件 NodeRestriction 已评分 L1 通过
1.2.16 确保 --secure-port 参数未设为 0 已评分 L1 通过
1.2.17 确保 --profiling 参数设为 false 已评分 L1 通过
1.2.18 确保已设置 --audit-log-path 参数 已评分 L1 等效控制
1.2.19 确保将 --audit-log-maxage 参数设为 30 或所需数值 已评分 L1 等效控制
1.2.20 确保将 --audit-log-maxbackup 参数设为 10 或所需数值 已评分 L1 通过
1.2.21 确保将 --audit-log-maxsize 参数设为 100 或所需数值 已评分 L1 通过
1.2.22 确保根据需要设置 --request-timeout 参数 已评分 L1 通过
1.2.23 确保 --service-account-lookup 参数设为 true 已评分 L1 通过
1.2.24 确保根据需要设置 --service-account-key-file 参数 已评分 L1 通过
1.2.25 确保根据需要设置 --etcd-certfile--etcd-keyfile 参数 已评分 L1 通过
1.2.26 确保根据需要设置 --tls-cert-file--tls-private-key-file 参数 已评分 L1 通过
1.2.27 确保根据需要设置 --client-ca-file 参数 已评分 L1 通过
1.2.28 确保根据需要设置 --etcd-cafile 参数 已评分 L1 取决于环境
1.2.29 确保根据需要设置 --encryption-provider-config 参数 已评分 L1 取决于环境
1.2.30 确保正确配置加密提供程序 已评分 L1 取决于环境
1.2.31 确保 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 客户端证书身份验证不应用于用户 未评分 L2 通过
3.1.2 不应对用户使用服务帐户令牌身份验证 未评分 L2 通过
3.1.3 不应对用户使用启动令牌身份验证 未评分 L2 通过
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 确保 --protect-kernel-defaults 参数设为 true 已评分 L1 通过
4.2.7 确保 --make-iptables-util-chains 参数设为 true 已评分 L1 通过
4.2.8 确保未设置 --hostname-override 参数 未评分 L1 通过
4.2.9 确保将 eventRecordQPS 参数设为可实现相应事件捕获的级别 未评分 L2 通过
4.2.10 确保根据需要设置 --tls-cert-file--tls-private-key-file 参数 已评分 L1 通过
4.2.11 确保 --rotate-certificates 参数未设为 false 已评分 L1 通过
4.2.12 确保 RotateKubeletServerCertificate 参数设为 true 已评分 L1 通过
4.2.13 确保 Kubelet 仅使用强加密密码 未评分 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.6 尽量减少根容器的准入 未评分 L2 取决于环境
5.2.7 尽量减少具有 NET_RAW 功能的容器的准入 未评分 L1 取决于环境
5.2.8 尽量减少具有附加功能的容器的准入 未评分 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 优先使用机密作为文件,而不是作为环境变量 未评分 L1 取决于环境
5.4.2 考虑外部机密存储 未评分 L2 取决于环境
5.5 可扩展准入控制
5.5.1 使用 ImagePolicyWebhook 准入控制器配置图像来源 未评分 L2 失败
5.7 常规策略
5.7.1 使用命名空间在资源之间创建管理边界 未评分 L1 取决于环境
5.7.2 确保在 pod 定义中将 seccomp 配置文件设为 docker/default 未评分 L2 取决于环境
5.7.3 将安全性上下文应用于 Pod 和容器 未评分 L2 取决于环境
5.7.4 不应使用默认命名空间 已评分 L2 取决于环境

备注

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

附加说明

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

后续步骤

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