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 组件安全配置全景图
下图展示了四个核心组件之间的安全依赖关系与关键审计点。箭头表示安全配置的传递与验证链路。
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 流水线的准入检查步骤。每周自动生成审计报告,并与基线进行差异对比。