必须逐项修正APIServer和etcd配置以通过CIS Benchmark:禁用insecure-port、启用审计日志与TLS双向认证、限制etcd访问、加密静态数据;漏任一项均导致kube-bench失败。

要让 Kubernetes 集群通过 CIS Kubernetes Benchmark 1.5 或 1.6 的 APIServer 和 etcd 相关检查项,必须逐项修正配置偏差——比如禁用不安全端口、启用审计日志、强制 TLS 双向认证、限制 etcd 访问来源、加密静态数据等,漏掉任意一项都可能导致 kube-bench 报告中对应条目失败。
加固 kube-apiserver 配置
进入主控节点的 /etc/kubernetes/manifests/kube-apiserver.yaml 文件,修改其容器启动参数。
删除 --insecure-port=8080 参数 → 若保留该参数,API Server 将监听非 TLS 的 8080 端口,CIS 第 1.2.1 条直接判为失败。
添加 --audit-log-path=/var/log/apiserver/audit.log → 审计日志是 CIS 1.2.13 强制要求,路径必须可写且不在 rootfs 根目录下,否则 kube-bench 检测不到有效日志输出。
添加 --tls-cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 → 必须显式指定高强度密码套件,不能依赖默认值;CIS 1.2.19 明确禁止使用 CBC 模式套件。
添加 --authorization-mode=Node,RBAC → 【必须同时启用 Node 和 RBAC】,缺一不可;若只写 RBAC,kube-bench 会因 1.2.2 项失败而报错。
加固 etcd 配置
方法一:通过 RKE 部署时,在 cluster.yml 中设置 etcd 参数
在 services.etcd 配置块下添加:cipher_suites: ["TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384","TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384"] → 这是 etcd 服务端 TLS 加密通信的强制要求,CIS 1.4.1 明确列出。
添加 client_cert_auth: true → 启用客户端证书认证,禁用匿名访问;若未开启,CIS 1.4.2 直接不通过。
方法二:手动部署 etcd 时,在 systemd unit 文件中追加启动参数
--client-cert-auth=true → 与上一条等效,但必须和 --trusted-ca-file 配合使用,否则 etcd 启动失败。
--auto-compaction-retention=24h → CIS 1.4.7 要求开启自动压缩,防止历史版本堆积拖垮性能;不设值或设为 "0" 均视为未启用。
注意:etcd 数据目录 /var/lib/etcd 必须由 etcd 用户(非 root)独占持有,且权限为 700;若属主错误,CIS 1.4.4 检查将失败。
启用 etcd 静态数据加密
第一步:生成加密密钥文件
执行 openssl rand -hex 32 > /etc/kubernetes/pki/encryption-config.yaml.key → 密钥必须保存在控制平面节点本地且不可被普通用户读取。
第二步:创建 encryption-config.yaml
内容必须包含 resources 字段,且 providers 数组第一个必须是 aescbc(CIS 1.4.8 强制要求),示例如下:
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
- resources:
- secrets
- configmaps
- persistentvolumeclaims
providers:
- aescbc:
keys:
- name: key1
secret: 【此处填入 base64 编码后的 32 字节密钥】
第三步:修改 kube-apiserver 启动参数
添加 --encryption-provider-config=/etc/kubernetes/pki/encryption-config.yaml → 路径必须绝对准确,且 kube-apiserver 进程需有读取权限。
第四步:重启 kube-apiserver 容器
执行 docker ps -a | grep kube-apiserver | awk '{print $1}' | xargs docker rm -f → 然后等待 kubelet 自动拉起新实例;这一步不可跳过,否则加密配置不生效。


















