01 · 集群总体架构
Kubernetes集群由控制面(Control Plane)与一组工作节点(Node)构成。控制面负责全局决策与集群事件响应,节点负责运行容器化工作负载。安全研究的第一个基本事实是:控制面的任何组件失守,在绝大多数架构下等同于整集群失守——因为控制面持有全部集群状态(含全部Secrets)与对所有工作负载的调度控制权。
| 组件 | 职责 | 默认端口 | 安全关键性 |
|---|---|---|---|
| kube-apiserver | 集群唯一入口,所有组件与CLI均经其操作集群状态;处理认证、授权、准入控制 | 6443(HTTPS) | 最高:历史上未授权访问类漏洞的汇聚点,须默认拒绝匿名访问 |
| etcd | 集群全部状态的分布式键值存储(含Secrets明文,除非启用静态加密) | 2379客户端 2380 peer | 最高:快照/备份泄露即全集群机密泄露;peer通信无加密=集群可被注入 |
| kube-scheduler | 为Pod选择节点;自身不直接暴露用户数据,但可被用于施加调度侧影响 | 10251(HTTP健康检查,仅本机;v1.22起逐步弃用) | 中:需绑定本地监听,禁止集群网可达 |
| kube-controller-manager | 运行各类控制器(副本、节点、端点等),持有强权限ServiceAccount | 10252(HTTP健康检查,仅本机;v1.22起逐步弃用) | 中高:其凭证泄露可被用于大范围操纵集群资源 |
| cloud-controller-manager | 与云厂商API交互(负载均衡、节点、路由、卷的生命周期) | 云厂商相关 | 中高:其云凭证泄露可影响云账号内资源 |
| kubelet | 节点代理:执行Pod生命周期管理、挂载卷、上报状态;暴露REST接口 | 10250(HTTPS) 10255(只读,v1.16起废弃) | 高:匿名读取曾泄露Pod环境变量(含密钥),未授权exec等同于节点shell |
| kube-proxy | 实现Service的虚拟IP与负载均衡规则(iptables/IPVS模式) | 10256(metrics) | 中:规则篡改可造成流量劫持(与CVE-2020-8554类问题相关) |
| 容器运行时 | containerd / CRI-O,经CRI与kubelet交互,实际创建容器进程 | 本地socket(默认不监听网络) | 高:运行时漏洞(runc/CRI-O)直接构成逃逸面 |
| CoreDNS | 集群服务发现与域名解析 | 53(UDP/TCP) 9153(metrics) | 中高:DNS投毒/隧道可支撑C2通信与数据外传 |
架构分层的安全含义:控制面组件之间的通信(apiserver↔etcd、apiserver↔kubelet、apiserver↔scheduler)应全部使用双向TLS(默认由kubeadm证书体系支撑);任何"为了调试方便"关闭TLS、放行匿名访问或将控制面端口暴露至节点网段之外的做法,都会把单点配置错误放大为集群级风险。托管集群(EKS/AKS/GKE及各国内云)由云厂商托管控制面,但节点kubelet、Pod网络与全部工作负载配置仍是客户责任面。
02 · 控制面攻击面详析
2.1 API Server:全集群的唯一总线
- 认证(Authentication):支持X.509客户端证书、静态Bearer Token文件、ServiceAccount Token、OpenID Connect(OIDC)、Webhook等多种认证插件;匿名请求默认是否允许由
--anonymous-auth控制——生产集群必须关闭。历史上"匿名访问+API Server聚合层"的组合曾导致CVE-2018-1002105提权。 - 授权(Authorization):支持Node、ABAC、RBAC、Webhook四种模式,RBAC为事实标准;授权决策基于"用户/组/SA + verb + resource + namespace"四维,配置不当的ClusterRoleBinding是横向移动的主要通道(第3页详述)。
- 准入控制(Admission):持久化前的最后闸口,内置插件与动态准入(Webhook)共同决定"默认安全"水位(第3页详述)。
- 暴露面:API Server不应直接暴露于互联网;必须暴露时(如CI/CD、多集群联邦)应置于白名单网关之后,启用审计日志并监控异常verb(如批量list secrets)。
2.2 etcd:集群王冠上的宝石
- etcd默认以明文存储所有值——包括Secrets;必须通过EncryptionConfiguration启用静态加密(推荐KMS提供程序,KMS v2自Kubernetes v1.29起GA)。
- etcd客户端端口2379若对节点网开放且缺少客户端证书双向认证,攻击者可读取/篡改全部集群状态;peer端口2380同理。
- 备份快照(snapshot)包含全部机密,其存储桶的访问控制与加密必须与生产数据同级;快照恢复演练是灾难恢复能力的唯一验证方式(第7页)。
2.3 kubelet:节点上的"小API Server"
- kubelet的10250端口暴露pods/exec、pods/logs、pods/attach等接口;在未启用匿名认证且未配置Webhook授权的旧版本上,匿名请求可读取Pod清单(含环境变量中的密钥)甚至执行命令——公开互联网上曾大量扫描到此类暴露。
- 只读端口10255(无认证的只读接口)自v1.16起废弃、后续版本逐步收紧(v1.22起scheduler/controller-manager改用安全端口10259/10257提供HTTPS健康检查),遗留旧集群应升级并按基线绑定回环。
- kubelet服务证书自动签发与轮换(ServerTLSBootstrap功能,v1.12引入)渐成主流部署方式,替代早期手动分发证书的模式;轮换失败会导致节点失联,运维监控需覆盖。
2.4 scheduler / controller-manager 的间接面
两者通常仅监听本机回环,直接暴露风险低,但其持有的强权限凭证(controller-manager的ServiceAccount令牌)是凭证窃取的高价值目标——获取该令牌可在集群内执行近乎全部资源操作。其健康检查端口的未授权访问信息泄露属低危,按基线绑定回环即可消除。
03 · 节点与工作负载攻击面
- kube-proxy与Service劫持:kube-proxy依据Service/Endpoint规则改写节点转发规则;CVE-2020-8554证明攻击者可通过设置ExternalIP/LoadBalancer IP为集群内尚未分配或敏感的目标地址(如localhost上运行的数据库),诱导集群内流量被劫持至恶意Pod——该漏洞无需任何权限即可实施,防护依赖修复版本与网络层缓解。
- 容器运行时接口(CRI):containerd默认不监听网络(本地socket);一旦因调试开启TCP监听且未认证,等同于直接容器创建权。CRI-O历史上通过Pod注解注入sysctl(CVE-2022-0811,cr8escape)实现权限提升,凸显"注解/标签即输入"的验证原则。
- 容器存储接口(CSI)与卷挂载:hostPath卷可将宿主机任意路径挂载进容器,是最高危的Pod配置之一;subPath的符号链接处理曾引入CVE-2021-25741目录逃逸。持久卷(PV)的回收策略与快照权限亦需纳入审计。
- 节点操作系统:节点内核漏洞在容器场景的影响被放大(共享内核);节点还应禁用SSH密码登录、启用只读根分区或独立/var/lib/containerd分区,防止容器日志与镜像写满系统盘(拒绝服务的朴素路径)。
04 · 典型攻击路径图谱
综合NSA/CISA加固指南与公开事件复盘,针对Kubernetes的典型攻击路径可归纳为以下六步链式模型。防御设计的要义在于:在链路上设置多重独立失效点,使单点被突破不导致目标达成。
05 · 标志性漏洞档案
以下条目均可在NVD(nvd.nist.gov)与Kubernetes官方安全公告中查证。评分采用NVD官方CVSS v3.x分值;修复版本以官方安全公告为准。档案用途为防御基线评估与检测规则验证,不提供利用代码。
| CVE/时间 | CVSS | 涉及组件 | 机理与防护要点 | 修复版本(官方公告) |
|---|---|---|---|---|
| CVE-2018-1002105 2018.12 | 9.8(高危) | kube-apiserver (聚合层) | 经聚合API服务器升级请求时权限检查被绕过的提权漏洞:普通用户可借由exec/attach通道获得API Server同等权限。防护:升级至修复版本;对外审慎开放聚合层;审计聚合API使用。 | v1.10.11 / v1.11.5 / v1.12.3 / v1.13.0-alpha.1起修复 |
| CVE-2019-5736 2019.02 | 8.6(高危) | runc (容器运行时) | 容器内进程以/proc/self/exe(即宿主机上runc二进制)为输入执行时,可覆写宿主机runc实现逃逸。防护:升级runc;不以root运行不受信容器;启用seccomp限制关键系统调用。 | runc 1.0.0-rc7(补丁于2019.02.11合入并发布;Docker 18.09.2及以上版本亦内置修复) |
| CVE-2019-1002101 2019.03 | 5.5(中危) | kubectl cp | kubectl cp解包tar时未正确处理符号链接,可在解压目标之外写入文件。防护:升级kubectl;CI/CD中固定工具版本并校验。 | v1.11.9 / v1.12.7 / v1.13.5 / v1.14.0起修复 |
| CVE-2019-11246 2019.06 | 6.5(中危) | kubectl cp | tar符号链接处理不当可在容器内覆盖/删除目标路径之外的文件。防护:升级kubectl;限制运维工具版本漂移。 | v1.12.9 / v1.13.6 / v1.14.2起修复 |
| CVE-2020-8554 2020.06 | 5.0(NVD原始评分,后续研究上调至中高危区间) | kube-proxy / Service | Man-in-the-middle using ExternalIP:攻击者创建ExternalIP指向敏感目标(如localhost服务或云元数据端点)的Service,诱使集群内流量被路由至其Pod。防护:升级修复版本;限制RBAC中patch service/status权限;网络层阻断可疑ExternalIP。 | v1.16.13 / v1.17.9 / v1.18.6起修复(含后续回移补丁) |
| CVE-2021-25741 2021.09 | 8.1(高危) | kubelet (subPath挂载) | 符号链接交换攻击:利用subPath卷挂载处理时序,逃逸至宿主机文件系统。防护:升级kubelet;避免对不受信负载开放hostPath/subPath组合;PSS Restricted档限制挂载行为。 | v1.19.15 / v1.20.11 / v1.21.5 / v1.22.2起修复 |
| CVE-2022-0492 2022.02 | 7.8(高危) | Linux内核 cgroups(容器逃逸面) | cgroups v1 release_agent机制可被容器内进程滥用(配合mount能力)实现宿主机命令执行。防护:内核升级;容器以drop ALL capabilities+no-new-privileges运行(PSS Baseline即有此要求)。 | Linux内核修复版本(2022.02修复合入主线) |
| CVE-2022-0811 2022.03 | 8.8(高危) | CRI-O (cr8escape) | 对Pod注解中的sysctl参数未做白名单校验,攻击者可注入如kernel.core_pattern等内核参数实现宿主机代码执行。防护:升级CRI-O至1.19.6+/1.20.5+/1.21.4+/1.22.1+;注解/标签视为不可信输入做白名单校验。 | CRI-O 1.19.6 / 1.20.5 / 1.21.4 / 1.22.1+ |
| CVE-2024-21626 2024.01 | 8.6(高危) | runc (工作目录处理) | 容器内进程工作目录文件描述符泄漏:当容器工作目录设置为/proc/self/fd/..等路径时,可访问宿主机文件系统。防护:升级runc 1.1.12+;启用seccomp;避免不受信负载设置异常工作目录。 | runc 1.1.12+(2024.01.31发布) |
漏洞治理要点:①控制面组件(apiserver/kubelet/运行时)必须纳入与OS同级的补丁SLA,公开K8s漏洞的修复版本以Kubernetes官方CHANGELOG与安全公告为准;②"已打补丁"不等于"已加固"——CVE-2022-0811与CVE-2021-25741的机理均涉及"注解/挂载等配置即输入"的验证缺失,对应的准入校验规则应在集群内长期生效(第3、4页);③托管集群客户无法控制控制面补丁节奏,但节点组件升级与运行时版本仍是客户责任。
06 · 端口与协议基线
| 端口 | 组件 | 暴露范围基线 | 说明 |
|---|---|---|---|
| 6443/TCP | kube-apiserver | 仅控制面节点间与运维白名单;禁止互联网直曝 | 集群最高价值端口;跨集群访问走白名单网关+审计 |
| 2379/TCP | etcd客户端 | 仅apiserver所在网段可达 | 启用客户端证书双向认证;开启静态加密存储 |
| 2380/TCP | etcd peer | 仅etcd集群成员间 | peer通信须TLS |
| 10250/TCP | kubelet | 仅控制面节点(apiserver→kubelet)与节点本地 | 禁止匿名认证;监控异常exec/pods列表行为 |
| 10251/10252 | scheduler / controller-manager | 仅回环(127.0.0.1) | 健康检查端口,绑定回环即可 |
| 10256/TCP | kube-proxy metrics | 仅监控网段 | metrics端口无认证,勿暴露业务网 |
| 53 UDP/TCP | CoreDNS | 集群内Pod与节点 | 对外递归解析应经企业DNS转发,防DNS隧道滥用 |
| 9153/TCP | CoreDNS metrics | 仅监控网段 | 同上 |
核查建议:端口基线应转化为可执行核查项——①集群内以DaemonSet形式运行端口扫描器周期核对监听面;②网络层以云安全组/网络ACL固化白名单;③对6443/10250的访问建立审计日志并接入检测规则(第7页场景库);④任何新增监听端口的变更须过变更评审。
07 · 控制面暴露面高频失误清单
结合公开威胁情报与基线核查实践,以下四类失误是公开互联网上Kubernetes暴露事件的绝对主体。每一条均可通过第8页基线核查项在数小时内消除:
| 失误 | 后果 | 一键核查方式 |
|---|---|---|
| 6443对公网开放且无白名单 | 认证爆破、漏洞面直接暴露于互联网扫描器 | 外部扫描/云安全组核查;公网暴露即高危工单 |
| kubelet 10250允许匿名读取 | Pod清单与环境变量(含密钥)批量泄露 | curl -k https://节点:10250/pods 匿名访问测试 |
| etcd 2379未启用客户端双向TLS | 集群全部状态与Secrets可读可写 | etcdctl --endpoints member list 免证书连通性测试 |
| dashboard/聚合层等附加组件遗留弱认证 | 历史未授权访问事件的经典入口 | 集群附加组件清单审计;匿名token登录测试 |
本节参考来源(第2页)
Kubernetes官方文档《Kubernetes Cluster Architecture》与组件参考:kubernetes.io/docs/concepts/architecture;kubelet认证授权说明:kubernetes.io(kubelet认证授权)。
NSA & CISA《Kubernetes Hardening Guidance》v1.1(2022年8月):控制面加固、pod安全、网络隔离、日志审计等官方建议原文。
CVE官方条目(评分与修复版本以NVD为准):CVE-2018-1002105、CVE-2019-5736、CVE-2020-8554、CVE-2021-25741、CVE-2022-0492、CVE-2022-0811、CVE-2024-21626。
Kubernetes官方安全公告与CHANGELOG(修复版本核对):github.com/kubernetes/kubernetes CHANGELOG。
MITRE ATT&CK for Containers(容器化环境攻击技术知识库,防御框架对照):attack.mitre.org(Containers矩阵)。