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 安全性的详细信息,请参阅以下文章: