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 安全基线检查流程总览

Kubernetes安全基线检查流程 CI阶段:代码提交/镜像构建 Kube-bench预检(Master/Worker/etcd) 检查结果判定(FAIL/WARN/PASS) FAIL > 阈值? 中断流水线 继续部署 说明:阈值可根据组织安全策略自定义,建议FAIL项≥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。