3. Kubernetes安全基线概述:CIS Benchmark核心要求与K8s攻击面分析
在生产环境中,Kubernetes 集群的安全配置往往是最容易被忽视的薄弱环节。CIS (Center for Internet Security) Kubernetes Benchmark 提供了业界公认的基线配置标准,而理解 K8s 的攻击面则是实施有效监控的前提。本章将建立安全基线的认知框架,并剖析关键攻击路径。
3.1 CIS Kubernetes Benchmark 核心要求
CIS Benchmark 针对不同组件(控制平面、Worker 节点、策略等)定义了数百条检查项。以下表格归纳了与 Prometheus 指标监控强相关的核心领域:
| CIS 控制域 | 核心检查项示例 | 关联 Prometheus 指标/告警 |
|---|---|---|
| 控制平面配置 | API Server 匿名访问禁用、--authorization-mode=Node,RBAC、--profiling=false | apiserver_request_total{code="401"}、apiserver_request_duration_seconds |
| etcd 安全 | 客户端证书认证、TLS 加密、--auto-compaction-retention 设置 | etcd_server_health_failures_total、etcd_disk_backend_commit_duration_seconds |
| Worker 节点安全 | kubelet 匿名访问禁用、--read-only-port=0、--protect-kernel-defaults=true | kubelet_node_config_error、kubelet_runtime_operations_errors_total |
| Pod 安全标准 | Pod Security Admission 配置、容器特权模式禁用、Seccomp/AppArmor 配置 | kube_pod_container_resource_requests、kube_pod_security_context_host_network |
| 网络策略 | 默认拒绝入站/出站流量、最小权限网络隔离 | networkpolicy_created_total、kube_networkpolicy_metadata |
| 审计日志 | 审计策略启用、记录 Metadata/RequestResponse 级别 | apiserver_audit_event_total、apiserver_audit_error_total |
监控切入点: 在 Prometheus 中,CIS 检查项通常无法直接通过单一指标覆盖。最佳实践是将 CIS 扫描工具(如 kube-bench)的输出指标化(例如通过
kube_bench_check_result 自定义指标),再与原生 K8s 指标关联分析。
3.2 Kubernetes 攻击面分析:从指标视角看风险
攻击者通常利用配置缺陷、凭证泄露或组件漏洞进行横向移动。以下 SVG 图展示了典型的 K8s 攻击链与关键监控节点:
3.3 关键攻击面与对应指标基线
以下列表梳理了 K8s 环境中最高风险的攻击面,以及如何通过 Prometheus 指标建立安全基线:
- 攻击面:未授权 API 访问
- 风险描述:匿名用户或未绑定 RBAC 的 ServiceAccount 能够调用敏感 API。
- 基线指标:
apiserver_request_total{code="401"}应为 0;apiserver_request_total{group="",resource="secrets"}应仅来自授权用户。
- 攻击面:特权容器与 HostPath 挂载
- 风险描述:容器以 privileged=true 运行,或挂载宿主机敏感目录(如 /var/log、/etc/kubernetes)。
- 基线指标:
kube_pod_container_info{container_image!=""}结合kube_pod_security_context_host_network或kube_pod_security_context_privileged标签,统计特权 Pod 数量。
- 攻击面:etcd 未加密或未认证
- 风险描述:etcd 暴露在非 TLS 端口,或未启用客户端证书认证。
- 基线指标:
etcd_server_health_failures_total持续增长;etcd_network_client_traffic_in_bytes出现异常来源 IP。
- 攻击面:kubelet 只读端口开放
- 风险描述:kubelet 的 10255 端口(只读)开放,允许未认证获取 Pod 列表、节点状态。
- 基线指标:
up{job="kubelet"}应仅通过认证端口(10250)采集;kubelet_node_config_error检查配置合规性。
- 攻击面:网络策略缺失
- 风险描述:命名空间未配置 NetworkPolicy,允许 Pod 间任意通信。
- 基线指标:
kube_networkpolicy_metadata覆盖的命名空间比例;container_network_receive_bytes_total{namespace!="kube-system"}的跨命名空间流量基线。
常见误区: 很多团队只关注 CIS 检查项的“通过/未通过”状态,而忽略了运行时指标的动态变化。例如,即使 RBAC 配置正确,一个被攻破的 Pod 仍可能通过挂载的 ServiceAccount 令牌发起异常请求。因此,静态基线 + 动态指标异常检测才是完整的安全监控策略。
3.4 从 CIS 到 Prometheus:指标映射框架
将 CIS 检查项转化为可观测指标,需要建立清晰的映射关系。以下 SVG 图展示了从 CIS 控制域到 Prometheus 告警规则的转换流程:
3.5 实战:建立最小安全基线指标集
基于上述分析,以下是一个可直接用于 Prometheus 告警的最小安全基线指标集(部分示例):
# 1. 检测匿名请求突增
- alert: AnonymousRequestSurge
expr: rate(apiserver_request_total{code="401"}[5m]) > 0.1
for: 2m
labels:
severity: critical
annotations:
summary: "API Server 匿名请求异常增多"
# 2. 检测特权 Pod 运行
- alert: PrivilegedPodRunning
expr: kube_pod_security_context_privileged == 1
for: 1m
labels:
severity: warning
annotations:
summary: "检测到特权模式运行的 Pod"
# 3. 检测 etcd 健康状态
- alert: EtcdHealthFailure
expr: rate(etcd_server_health_failures_total[5m]) > 0
for: 1m
labels:
severity: critical
annotations:
summary: "etcd 健康检查失败"
# 4. 检测 kubelet 配置错误
- alert: KubeletConfigError
expr: kubelet_node_config_error > 0
for: 5m
labels:
severity: warning
annotations:
summary: "kubelet 节点配置存在错误"
课程实践提示: 在后续章节中,我们将使用 kube-bench 作为数据源,将其 JSON 输出通过 Prometheus 的
custom-collector 或 textfile-collector 转化为指标,并与上述原生指标联合分析,实现“静态基线 + 动态行为”的双重安全监控。