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 攻击链与关键监控节点:

Kubernetes 攻击链与监控节点 Kubernetes 攻击链与 Prometheus 监控节点 阶段 1:外部暴露 API Server 匿名访问 阶段 2:凭证窃取 ServiceAccount 泄露 阶段 3:横向移动 Pod 逃逸/网络穿越 监控节点 1 apiserver_request_total code=401/403 突增 监控节点 2 kube_secret_created 异常 Secret 创建 监控节点 3 container_network _receive_bytes_total 指标驱动的检测逻辑 • 阶段 1 检测:rate(apiserver_request_total{code=~"401|403"}[5m]) > 0 且来源 IP 不在白名单 • 阶段 2 检测:rate(kube_secret_created[5m]) > 历史基线 3σ 且关联 ServiceAccount 异常 • 阶段 3 检测:container_network_receive_bytes_total 出现非预期 Pod 间流量 • 综合告警:将上述指标输入 Prometheus Alertmanager,形成攻击链关联告警

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 告警规则的转换流程:

CIS 到 Prometheus 指标映射框架 CIS 检查项 → Prometheus 指标映射框架 CIS 控制域 CIS 检查项 ID 检查结果 (Pass/Fail) Prometheus 指标 告警规则 Dashboard 面板 示例:CIS 1.2.6 (API Server 匿名访问) → kube_bench_check_result{check_id="1.2.6",status="fail"} → 告警:AnonymousAccessEnabled

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 转化为指标,并与上述原生指标联合分析,实现“静态基线 + 动态行为”的双重安全监控。