Skip to content

20 — 安全加固深度教材

K8s 安全加固是生产环境的必修课。本章覆盖 CIS Benchmark、Falco 运行时检测、Trivy 镜像扫描、Kyverno 策略引擎。


1. CIS Kubernetes Benchmark

1.1 核心检查项

CIS Benchmark 分两大部分:

控制面安全:
  1.1.1  确保 apiserver 启用匿名认证 --anonymous-auth=false
  1.1.2  确保基础认证禁用 --basic-auth-file 不存在
  1.1.7  确保授权模式包含 RBAC --authorization-mode=RBAC
  1.1.11 确保 Admission Controller 启用 --enable-admission-plugins
  1.1.12 确保 LimitRanger 启用
  1.1.19 确保证书启用 --profiling=false
  1.2.x  etcd 安全(TLS、数据加密)
  1.3.x  Controller Manager 安全
  1.4.x  Scheduler 安全

节点安全:
  4.1.1  确保 kubelet 禁用匿名认证
  4.1.2  确保 kubelet 启用授权
  4.2.x  kubelet 配置安全

策略:
  5.1.x  RBAC 和 ServiceAccount
  5.2.x  Pod Security Standards
  5.3.x  NetworkPolicy
  5.4.x  Secrets 管理
  5.5.x  通用策略

1.2 kube-bench 自动检查

bash
# 安装 kube-bench
kubectl apply -f https://raw.githubusercontent.com/aquasecurity/kube-bench/main/job.yaml

# 查看结果
kubectl logs job/kube-bench | grep -E 'PASS|FAIL|WARN'

# 分类统计
kubectl logs job/kube-bench | grep -c PASS   # 通过数
kubectl logs job/kube-bench | grep -c FAIL   # 失败数
kubectl logs job/kube-bench | grep -c WARN   # 警告数

# 修复示例:
# FAIL 1.2.20 确保 --profiling=false
# 修复:修改 kube-apiserver 配置添加 --profiling=false

2. Falco — 运行时安全检测

2.1 Falco 架构

Falco 工作原理:
  应用/容器 → 系统调用 → Falco eBPF/kernel module → 规则匹配 → 告警

  检测能力:
  - 容器内 shell 执行
  - 敏感文件读取(/etc/shadow、SSH key)
  - 网络连接异常(反向 Shell)
  - 特权容器滥用
  - 容器逃逸尝试

2.2 自定义规则

yaml
# /etc/falco/rules.d/custom-rules.yaml

# 检测容器内执行 shell
- rule: Terminal Shell in Container
  desc: 检测容器内启动 shell
  condition: >
    spawned_process and container and
    proc.name in (bash, sh, zsh, csh)
  output: >
    Shell opened in container
    (user=%user.name container=%container.name shell=%proc.name
    parent=%proc.pname cmdline=%proc.cmdline)
  priority: WARNING
  tags: [container, shell]

# 检测敏感文件读取
- rule: Read Sensitive File
  desc: 检测读取敏感文件
  condition: >
    open_read and container and
    fd.name in (/etc/shadow, /etc/sudoers, /root/.ssh/authorized_keys)
  output: >
    Sensitive file read (user=%user.name file=%fd.name container=%container.name)
  priority: CRITICAL
  tags: [filesystem]

# 检测出站连接异常
- rule: Outbound Connection to Non-Standard Port
  desc: 容器连接到非标准端口
  condition: >
    evt.type=connect and container and
    fd.typechar=4 and
    not fd.sport in (80, 443, 53, 3306, 6379, 9092)
  output: >
    Suspicious outbound connection (container=%container.name
    dst=%fd.sip:%fd.sport)
  priority: NOTICE
bash
# 查看 Falco 告警
kubectl logs -n falco daemonset/falco --tail=50

# Falco 与 Falcosidekick 集成(告警发送到 Slack/钉钉/PagerDuty)
# falcosidekick 配置 webhook 转发

3. Trivy — 漏洞扫描

bash
# 扫描镜像漏洞
trivy image nginx:latest
trivy image --severity HIGH,CRITICAL nginx:latest

# 扫描 K8s 集群
trivy k8s --report summary cluster
trivy k8s --report all --severity HIGH,CRITICAL cluster

# 扫描 IaC(Terraform/Helm/K8s YAML)
trivy config ./k8s-manifests/

# CI/CD 集成:阻止有严重漏洞的镜像部署
trivy image --exit-code 1 --severity CRITICAL myapp:v1.2.3
# 退出码 1 = 有 CRITICAL 漏洞,CI 失败

# Trivy Operator(集群内持续扫描)
# 安装 Trivy Operator
helm install trivy-operator aqua/trivy-operator -n trivy-system
# 自动扫描所有 Pod 的镜像并生成 VulnerabilityReport
kubectl get vulnerabilityreports -A | grep CRITICAL

4. Kyverno — 策略引擎

yaml
# Kyverno 策略:禁止特权容器
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: disallow-privileged-containers
spec:
  validationFailureAction: Enforce    # Enforce=拒绝 / Audit=仅记录
  rules:
  - name: deny-privileged
    match:
      any:
      - resources:
          kinds: [Pod]
    validate:
      message: "Privileged containers are not allowed"
      pattern:
        spec:
          containers:
          - securityContext:
              privileged: "false"

# Kyverno 策略:要求资源限制
---
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: require-resource-limits
spec:
  validationFailureAction: Enforce
  rules:
  - name: check-limits
    match:
      any:
      - resources:
          kinds: [Pod]
    validate:
      message: "CPU and memory limits are required"
      pattern:
        spec:
          containers:
          - resources:
              limits:
                memory: "?*"
                cpu: "?*"
bash
# 查看策略违规
kubectl get policyreport -A
kubectl get clusterpolicyreport

# Kyverno vs OPA Gatekeeper:
# Kyverno:K8s 原生,YAML 策略,学习曲线低
# OPA Gatekeeper:Rego 语言,功能更强,学习曲线陡

5. 面试高频问题

Q: K8s 安全加固的优先级?

Phase 1(立即):
  - 禁用匿名认证、启用 RBAC
  - 禁止特权容器
  - NetworkPolicy 零信任

Phase 2(短期):
  - 镜像扫描(Trivy)
  - Pod Security Standards
  - Secrets 加密(External Secrets)

Phase 3(中期):
  - Falco 运行时检测
  - Kyverno/OPA 策略引擎
  - CIS Benchmark 审计

Phase 4(长期):
  - mTLS(Service Mesh)
  - 零信任网络
  - 混沌工程验证