TT Lab
开始
学习 学习路径 课程

KCSA — Kubernetes 安全助理

4C — 外层救不了内层

在 TT Lab 中继续学习

一句话总结

Cloud → Cluster → Container → Code。这四层 外层包裹着内层,却替代不了内层。云防火墙再完美,如果代码里没有授权检查,正常用户也能看到别人的数据。

为什么需要它

“加强安全”这句话没有指向任何方向。是收紧防火墙,是整顿 RBAC,是扫描镜像,还是增加代码评审——全都是安全,但 它们防范的威胁完全不同。

4C 模型整理了这种混乱。因为它说清楚了每一层能防住什么,以及 哪些事在原理上防不住。

工作原理

四层及各自的管辖范围

层 控制手段 在这一层能防住的 在这一层防不住的
Cloud/基础设施 网络边界、IAM、节点操作系统、物理安全 从互联网直接连到 apiserver、etcd 持有合法凭据的内部人员
Cluster 认证/授权(RBAC)、准入、网络策略、审计日志 无权限的 API 调用、危险的 Pod 规格 在权限范围内发生的滥用
Container 镜像来源与扫描、最小权限运行、只读根文件系统 有漏洞的基础镜像、以 root 运行 应用逻辑缺陷
Code 授权检查、输入验证、Secret 处理、依赖管理 IDOR、注入、硬编码的密钥 上面各层的配置失误

为什么外层救不了内层

有三个原因。

第一,外层不知道请求的含义。云防火墙只看到“谁向哪里打开了 TCP”。合法登录的用户调用 GET /v1/orders/10422,这是他自己的订单还是别人的订单,防火墙没有判断的依据。做出这个判断所需的信息在数据库里。

第二,内层的缺陷在外层看来是正常流量。IDOR 攻击的请求能通过认证,响应码也是 200。没有一个失败的请求,所以也不会触发告警。

第三,各层依赖彼此的假设。容器即使以最小权限运行,只要节点被攻陷,该节点上所有容器会一起沦陷。反过来,节点再牢固,如果代码把凭据转储到日志里,这个值就会流进日志索引。

所以该怎么用

4C 不是“全都做”,而是用来追问 “这个威胁在哪一层防范最便宜也最可靠” 的工具。

在现场相遇的样子

作者的家庭实验室里,出现过一起让 4C 的层间依赖原样显露出来的事件。DHCP 续租使控制平面节点的 IP 从 .111 变成了 .120,整个集群就停了。IP 地址分配这个 Cloud/基础设施层的一件事,就让 Cluster 层整个失灵。

更准确地说,问题出在证书上。apiserver.crt 的 Subject Alternative Name 里只有 .111,没有 .120。由于 TLS 信任绑定在 IP 上,基础设施层里一个地址的改变,破坏了集群层的身份体系。

把同一个集群扩大到 7 个节点之后,也得出了类似的教训。虽然靠 3 个 etcd 成员确保了 quorum,但 controlPlaneEndpoint 被写死成 cp-1 的物理 IP,所以 cp-1 一挂,数据是安全的,却没有人能连上去。“数据可用性和访问可用性是两回事”——这同样是各层无法互相替代的同一个道理。

接下来阅读什么

在后续的阅读材料里,会把每一层的攻击面展开成具体的入口清单。从下一个模块开始,会下沉到 Cluster 层,把 apiserver、etcd、kubelet 一个个拆开来看。