3、集群组件安全配置:kube-apiserver、kube-controller-manager、kube-scheduler、kubelet 的安全参数审计

Kubernetes 控制面组件与节点代理的安全配置是集群防护的第一道防线。攻击者一旦利用组件的不安全参数,即可绕过认证、篡改调度策略、窃取 Secret 或执行容器逃逸。本章对 kube-apiserver、kube-controller-manager、kube-scheduler、kubelet 四个核心组件进行安全参数逐项审计,并给出基线核验标准。

审计原则:所有组件应遵循最小权限、加密通信、日志可追溯、匿名访问禁用四大基线。以下参数检查项均基于 CIS Kubernetes Benchmark v1.24+ 与 NIST SP 800-190 控制要求。

3.1 kube-apiserver 安全参数审计

kube-apiserver 是集群的入口网关,其安全参数直接影响整个集群的认证、授权与准入控制能力。以下为必须审计的关键参数清单:

参数 / 标志 安全基线值 风险说明
--anonymous-auth false 允许匿名请求将绕过认证,极易被利用进行未授权操作。
--insecure-port 0(禁用) 明文 HTTP 端口,不加密不认证,必须关闭。
--secure-port 6443 仅启用 TLS 加密端口,禁止监听 0.0.0.0 以外的非安全地址。
--client-ca-file 必须配置 未配置客户端 CA 将无法验证客户端证书,导致 mTLS 失效。
--authorization-mode Node,RBAC 至少包含 RBAC,禁止仅使用 AlwaysAllow。
--enable-admission-plugins NodeRestriction,PodSecurity,DenyServiceExternalIPs 缺少准入插件将允许恶意 Pod 绕过安全策略。
--audit-log-path 必须配置 无审计日志将无法追溯安全事件。
--encryption-provider-config 必须配置 未启用 etcd 加密时,Secret 以明文存储。
--service-account-key-file 必须配置 缺少该文件将无法验证 ServiceAccount 签名。
--tls-cipher-suites TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 等强套件 弱加密套件(如 3DES、RC4)易被降级攻击。
审计命令示例:
# 检查匿名认证是否禁用
ps -ef | grep kube-apiserver | grep -- '--anonymous-auth=false'

# 检查 insecure-port 是否关闭
ps -ef | grep kube-apiserver | grep -- '--insecure-port=0'

# 检查准入插件列表
ps -ef | grep kube-apiserver | grep -- '--enable-admission-plugins'

3.2 kube-controller-manager 安全参数审计

kube-controller-manager 负责集群状态调节,其安全参数主要围绕证书认证、ServiceAccount 管理与控制器权限控制。

参数 / 标志 安全基线值 风险说明
--use-service-account-credentials true 设为 false 时所有控制器使用同一凭证,违反最小权限原则。
--service-account-private-key-file 必须配置 缺少该文件将无法对 ServiceAccount 进行签名。
--root-ca-file 必须配置 未配置根 CA 将导致 Pod 无法验证 API Server 证书。
--bind-address 127.0.0.1 或 内网管理地址 绑定 0.0.0.0 将暴露 metrics 与健康检查端口。
--secure-port 10257 必须启用 TLS 端口,禁止使用不安全的 10252 端口。
--controllers 仅启用必要控制器 禁用不需要的控制器(如 namespace、endpointslice)可缩小攻击面。
常见误配:部分集群将 --bind-address 设为 0.0.0.0 且未启用认证,导致攻击者可通过 metrics 接口获取集群敏感指标。必须将绑定地址限制为回环地址或受控管理网络。

3.3 kube-scheduler 安全参数审计

kube-scheduler 负责 Pod 调度决策,其安全参数主要关注端口暴露、TLS 配置与权限分离。

参数 / 标志 安全基线值 风险说明
--bind-address 127.0.0.1 调度器不应暴露在外部网络,绑定回环地址可防止未授权访问。
--secure-port 10259 必须启用 TLS 端口,禁用不安全的 10251 端口。
--authentication-kubeconfig 必须配置 未配置时调度器将无法验证客户端身份。
--authorization-kubeconfig 必须配置 未配置时将跳过授权检查,允许任意请求执行调度操作。
--tls-cert-file / --tls-private-key-file 必须配置 缺少证书将导致 TLS 握手失败或使用自签名证书。
审计命令示例:
# 检查调度器绑定地址
ps -ef | grep kube-scheduler | grep -- '--bind-address=127.0.0.1'

# 检查是否启用安全端口
ps -ef | grep kube-scheduler | grep -- '--secure-port=10259'

3.4 kubelet 安全参数审计

kubelet 是运行在每个节点上的代理,其安全配置直接决定节点能否被远程控制或数据泄露。kubelet 的审计项是所有组件中最多的,也是攻击者最常利用的入口。

参数 / 标志 安全基线值 风险说明
--anonymous-auth false 允许匿名访问 kubelet API 将导致节点被远程控制。
--authentication webhook 或 x509 禁止使用 AlwaysAllow 模式。
--authorization webhook 使用 AlwaysAllow 将允许任何已认证用户执行所有 kubelet 操作。
--read-only-port 0(禁用) 只读端口(10255)不加密,暴露 Pod 与节点信息。
--protect-kernel-defaults true 未保护内核默认参数可能导致容器逃逸。
--rotate-certificates true 证书轮换可防止证书过期导致节点失联。
--tls-cipher-suites 强加密套件 弱套件允许中间人攻击。
--event-qps 5(合理限流) 过高 QPS 可能导致 API Server 过载。
--streaming-connection-idle-timeout 4h(或更短) 过长的空闲连接可能被劫持。
高危场景:kubelet 的 --anonymous-auth=true 配合 --authorization=AlwaysAllow 将允许任何网络可达的主机直接执行 kubectl exec、读取节点日志、甚至挂载宿主机文件系统。这是 CIS Benchmark 中评分最高的风险项之一。

3.5 组件安全配置全景图

下图展示了四个核心组件之间的安全依赖关系与关键审计点。箭头表示安全配置的传递与验证链路。

集群组件安全配置全景图 集群组件安全配置全景图 kube-apiserver 匿名认证关闭 | 安全端口 6443 | RBAC + 准入插件 kube-controller-manager 绑定 127.0.0.1 | 安全端口 10257 kube-scheduler 绑定 127.0.0.1 | 安全端口 10259 kubelet(每个节点) 匿名认证关闭 | 只读端口禁用 证书认证 调度授权 kubelet 证书轮换 节点控制器管理 审计要点:所有组件必须启用 TLS、禁用匿名访问、绑定安全地址、配置认证与授权 kubelet 是攻击面最大的组件,需重点检查 --anonymous-auth 与 --read-only-port

3.6 基线核验清单与自动化脚本

以下为四组件安全参数的快速核验清单,可用于日常巡检与 CI/CD 流水线集成:

组件 检查项 核验命令(kubectl / ps) 预期结果
kube-apiserver 匿名认证 ps -ef | grep kube-apiserver | grep anonymous-auth --anonymous-auth=false
安全端口 ps -ef | grep kube-apiserver | grep secure-port --secure-port=6443
准入插件 ps -ef | grep kube-apiserver | grep enable-admission-plugins 包含 NodeRestriction,PodSecurity
kube-controller-manager 绑定地址 ps -ef | grep kube-controller-manager | grep bind-address --bind-address=127.0.0.1
ServiceAccount 凭证 ps -ef | grep kube-controller-manager | grep use-service-account-credentials --use-service-account-credentials=true
kube-scheduler 绑定地址 ps -ef | grep kube-scheduler | grep bind-address --bind-address=127.0.0.1
安全端口 ps -ef | grep kube-scheduler | grep secure-port --secure-port=10259
kubelet 匿名认证 ps -ef | grep kubelet | grep anonymous-auth --anonymous-auth=false
只读端口 ps -ef | grep kubelet | grep read-only-port --read-only-port=0
授权模式 ps -ef | grep kubelet | grep authorization --authorization=webhook
自动化核验脚本片段(Shell):
#!/bin/bash
# 组件安全参数批量核验
COMPONENTS=("kube-apiserver" "kube-controller-manager" "kube-scheduler" "kubelet")

for comp in "${COMPONENTS[@]}"; do
  echo "=== 检查 $comp ==="
  case $comp in
    kube-apiserver)
      ps -ef | grep $comp | grep -E "anonymous-auth|secure-port|enable-admission-plugins"
      ;;
    kube-controller-manager)
      ps -ef | grep $comp | grep -E "bind-address|use-service-account-credentials"
      ;;
    kube-scheduler)
      ps -ef | grep $comp | grep -E "bind-address|secure-port"
      ;;
    kubelet)
      ps -ef | grep $comp | grep -E "anonymous-auth|read-only-port|authorization"
      ;;
  esac
done

3.7 常见安全误配与修复建议

  • 误配 1:kubelet 匿名认证开启 — 立即设置 --anonymous-auth=false 并重启 kubelet。同时检查 --authentication 是否为 webhook。
  • 误配 2:kube-apiserver 未配置加密提供者 — 启用 --encryption-provider-config 指向包含 AES-CBC 或 KMS 提供者的 YAML 文件。
  • 误配 3:kube-controller-manager 绑定 0.0.0.0 — 修改 --bind-address=127.0.0.1,确保 metrics 端口不暴露。
  • 误配 4:kube-scheduler 使用不安全的 10251 端口 — 禁用 --port=0 并启用 --secure-port=10259。
  • 误配 5:所有组件未配置 TLS 证书 — 使用集群 CA 签发组件证书,并配置 --tls-cert-file 与 --tls-private-key-file。
最佳实践:建议将组件安全参数审计集成到 kube-bench 或 kubeaudit 工具中,作为 CI/CD 流水线的准入检查步骤。每周自动生成审计报告,并与基线进行差异对比。