3、Kubernetes安全基线:Kube-bench工具介绍、Master节点安全配置、Worker节点安全配置、etcd加密
3.1 安全基线概述与Kube-bench工具
Kubernetes安全基线是保障集群生产环境稳定运行的第一道防线。CIS(Center for Internet Security)发布的Kubernetes Benchmark是目前业界最权威的基线标准,覆盖Master节点、Worker节点、etcd、控制平面组件及Pod安全策略等维度。Kube-bench是Aqua Security开源的工具,专门用于自动检查集群是否符合CIS Kubernetes Benchmark。
核心价值:Kube-bench将数百条手动检查项转化为自动化测试,在CI/CD流水线中可作为准入前的“安全门禁”,确保不符合基线的集群版本或配置无法进入生产环境。
Kube-bench工作原理
- 检测对象:Master节点组件(kube-apiserver、kube-controller-manager、kube-scheduler)、Worker节点组件(kubelet、kube-proxy)、etcd、CNI插件、Pod安全策略。
- 检测方式:通过读取进程启动参数、配置文件、系统服务单元文件、文件权限及目录结构,与CIS规则逐条比对。
- 输出格式:支持JSON、JUnit XML、Plain Text,便于集成到Jenkins、GitLab CI、Argo Workflows等流水线。
流水线集成建议:在CI阶段使用
kube-bench run --targets master,worker,etcd,若检测出FAIL或WARN级别超过阈值(如FAIL > 5),则中断流水线并生成审计报告。
Kube-bench安装与基本使用
# 通过容器运行(推荐,避免依赖冲突)
docker run --rm -v /etc/kubernetes:/etc/kubernetes \
-v /var/lib/etcd:/var/lib/etcd \
-v /var/run:/var/run \
--pid=host \
aquasec/kube-bench:latest run
# 指定目标组件
kube-bench run --targets master,worker
# 输出JSON格式报告
kube-bench run --json > kube-bench-report.json
3.2 Master节点安全配置
Master节点是集群的控制核心,其安全配置直接影响整个集群的权限管控能力。CIS Benchmark对Master节点提出以下关键要求:
| CIS控制项 | 检查内容 | 推荐配置 | 风险等级 |
|---|---|---|---|
| 1.1.1 | API Server匿名请求 | --anonymous-auth=false |
高 |
| 1.1.2 | API Server基本认证 | --basic-auth-file 不应启用 |
高 |
| 1.1.3 | API Server令牌认证文件 | ---auth-file 不应启用 |
高 |
| 1.1.12 | etcd证书验证 | --etcd-certfile 和 --etcd-keyfile 必须配置 |
高 |
| 1.1.36 | 审计日志策略 | --audit-log-path 启用,且保留策略合理 |
中 |
| 1.2.1 | Controller Manager绑定地址 | --bind-address=127.0.0.1 |
高 |
Master节点关键加固操作
# 1. 禁用匿名请求
# 在 kube-apiserver 启动参数中添加
--anonymous-auth=false
# 2. 启用TLS及客户端证书认证
--client-ca-file=/etc/kubernetes/pki/ca.crt
--tls-cert-file=/etc/kubernetes/pki/apiserver.crt
--tls-private-key-file=/etc/kubernetes/pki/apiserver.key
# 3. 限制kube-controller-manager监听本地地址
--bind-address=127.0.0.1
--secure-port=10257
# 4. 启用审计日志
--audit-log-path=/var/log/kubernetes/audit.log
--audit-log-maxage=30
--audit-log-maxbackup=10
--audit-log-maxsize=100
常见误区:仅修改启动参数但未重启kube-apiserver Pod(静态Pod需修改清单文件);或使用kubeadm时直接编辑/etc/kubernetes/manifests/kube-apiserver.yaml后未等待kubelet重新拉取。
3.3 Worker节点安全配置
Worker节点承载实际工作负载,其安全配置重点在于kubelet的权限管控和节点认证。CIS Benchmark对Worker节点的核心要求如下:
| CIS控制项 | 检查内容 | 推荐配置 | 风险等级 |
|---|---|---|---|
| 4.1.1 | kubelet匿名访问 | authentication.anonymous.enabled: false |
高 |
| 4.1.2 | kubelet证书轮换 | rotateCertificates: true |
中 |
| 4.2.1 | kubelet只读端口 | readOnlyPort: 0(禁用) |
高 |
| 4.2.2 | kubelet绑定地址 | --bind-address 使用节点IP而非0.0.0.0 |
中 |
| 4.2.3 | kubelet授权模式 | authorization.mode: Webhook |
高 |
Worker节点kubelet配置示例
# /var/lib/kubelet/config.yaml
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
authentication:
anonymous:
enabled: false
webhook:
enabled: true
x509:
clientCAFile: /etc/kubernetes/pki/ca.crt
authorization:
mode: Webhook
readOnlyPort: 0
rotateCertificates: true
serverTLSBootstrap: true
流水线自动化检查:在Worker节点加入集群前,使用kube-bench的
--targets worker进行预检,并将结果写入节点标签node.benchmark/worker-pass: "true",未通过标签的节点禁止调度工作负载。
3.4 etcd加密
etcd存储了集群所有资源对象(包括Secret、ConfigMap、ServiceAccount 等敏感数据),其加密保护是安全基线的重中之重。CIS Benchmark要求etcd必须启用TLS双向认证,并推荐对静态数据加密。
etcd加密层次
- 传输层加密(TLS):etcd集群内部通信及与API Server的通信必须使用TLS双向证书验证。
- 静态数据加密(Encryption at Rest):通过Kubernetes的EncryptionConfiguration对写入etcd的资源进行AES-CBC或AES-GCM加密。
- 密钥管理:加密密钥应存储在HSM或外部密钥管理服务(KMS)中,避免明文写入配置文件。
启用静态数据加密
# 1. 创建加密配置文件 /etc/kubernetes/encryption-config.yaml
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
- resources:
- secrets
providers:
- aescbc:
keys:
- name: key1
secret: <base64-encoded-32-byte-key>
- identity: {}
# 2. 在kube-apiserver启动参数中引用
--encryption-provider-config=/etc/kubernetes/encryption-config.yaml
# 3. 验证加密是否生效
# 查看etcd中存储的Secret是否为密文
ETCDCTL_API=3 etcdctl get /registry/secrets/default/my-secret \
--endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key | head -5
重要提醒:启用静态加密后,原有未加密的Secret不会自动重新加密。需通过
kubectl get secrets --all-namespaces -o json | kubectl replace -f -触发重新写入,确保所有存量数据都被加密。
etcd TLS配置清单
| 配置项 | 参数 | 说明 |
|---|---|---|
| 客户端证书 | --cert-file |
etcd服务端证书,用于向客户端证明身份 |
| 客户端密钥 | --key-file |
与证书对应的私钥 |
| 客户端CA | --client-cert-auth + --trusted-ca-file |
启用客户端证书验证,拒绝未授权客户端 |
| 对等证书 | --peer-cert-file / --peer-key-file |
etcd集群节点间通信证书 |
| 对等CA | --peer-client-cert-auth + --peer-trusted-ca-file |
集群节点间双向认证 |
3.5 安全基线检查流程总览
3.6 流水线集成审计要点
DevSecOps实践:将Kube-bench集成到CI/CD流水线中,每次部署前自动执行基线检查,生成JSON格式报告并归档至审计系统。结合OPA/Gatekeeper实现策略即代码,对FAIL项自动生成工单并指派给集群管理员。
审计报告关键字段
| 字段 | 说明 | 示例值 |
|---|---|---|
| id | CIS控制项编号 | 1.1.1 |
| text | 检查项描述 | Ensure that the --anonymous-auth argument is set to false |
| status | 检查结果 | FAIL / PASS / WARN |
| scored | 是否计入评分 | true / false |
| node_type | 节点类型 | master / worker / etcd |
| remediation | 修复建议 | Edit the kube-apiserver manifest and add --anonymous-auth=false |
常见问题与避坑
- kube-bench版本与Kubernetes版本不匹配:CIS Benchmark随Kubernetes版本更新,务必使用与集群版本对应的kube-bench版本(如v1.24、v1.27、v1.30)。
- 静态Pod修改后未生效:kube-apiserver、kube-controller-manager等以静态Pod运行,修改/etc/kubernetes/manifests/下的YAML后需等待kubelet自动重建(约30秒)。
- etcd加密密钥轮换:密钥泄露后需立即轮换,但Kubernetes不支持热更新EncryptionConfiguration,需重启kube-apiserver并重新加密所有资源。
- 只读端口误开启:kubelet的只读端口(10255)不进行认证,若开启将暴露节点状态信息,务必设置为0禁用。
自动化修复脚本示例:针对常见的FAIL项,可编写Ansible Playbook或Shell脚本自动修复,并在流水线中作为后置步骤执行。例如:
sed -i 's/--anonymous-auth=true/--anonymous-auth=false/g' /etc/kubernetes/manifests/kube-apiserver.yaml。