内容提要
该文章介绍了一种名为Supply Chain NRI Plugin的容器供应链验证工具,它通过Node Resource Interface在容器运行时层面同步验证镜像的SLSA、VEX和VSA证明,弥补了Kubernetes准入Webhook可被静态Pod或直接kubelet访问绕过的安全漏洞。插件支持分阶段部署、配置分离和故障处理,提供从观察到强制执行的渐进路径,作为纵深防御的第二层保障。
延伸解读
为什么需要运行时验证
文章指出,准入Webhook存在多个绕过路径:静态Pod直接由kubelet管理,即使镜像Pod被拒绝,容器仍会运行;命名空间选择器配置错误可能静默跳过验证;Webhook故障时,要么集群锁死,要么静默绕过。这些风险并非理论,已有利用变更Webhook混淆验证Webhook的技术被披露。因此,将验证下沉到容器运行时,确保每个容器无论以何种方式调度都必须经过检查,是纵深防御的关键。
NRI插件的工作机制
Supply Chain NRI插件利用NRI的CreateContainer钩子,在容器启动前同步调用。它从运行时注解中提取镜像引用和摘要,从OCI仓库获取SLSA、VEX和VSA证明,按命名空间策略验证,并允许或拒绝容器。该机制无法从API层绕过,因为运行时对每个容器都会同步调用。验证发生在容器创建时,而非镜像拉取时,因此即使镜像提前拉取,也会在运行前被验证。
配置分离与渐进部署
插件将操作配置(TOML文件)与安全策略(JSON策略文件)分离,便于不同团队管理。默认验证模式为disabled,支持从观察到强制执行的渐进路径:先以warn模式观察,再按命名空间收紧策略,最后切换为enforce。所有配置更改通过SIGHUP和文件系统监控热加载,无需重启Pod。这种设计降低了采用风险,让组织逐步适应供应链验证。
故障模式与权衡
插件对故障处理有明确权衡:当仓库不可达时,fetch_failure_policy默认warn(失败开放),容器通过但记录警告;设为deny则牺牲可用性换取安全。熔断器在连续失败后短路,warn模式下新镜像可能绕过验证,但已缓存镜像仍可用。缺失证明按类型分别控制,例如可要求SLSA存在但容忍VEX缺失。这些配置让运维人员根据风险偏好调整。
Q&A
什么是Supply Chain NRI Plugin,它主要解决什么问题?
Supply Chain NRI Plugin是一个容器供应链验证工具,它通过节点资源接口(NRI)在容器运行时层面同步验证镜像的SLSA、VEX和VSA证明。它主要解决Kubernetes准入Webhook可能被静态Pod或直接kubelet访问绕过的问题,提供纵深防御的第二层保障。
为什么准入Webhook不够安全,存在哪些绕过方式?
准入Webhook存在多种绕过方式:静态Pod由kubelet直接管理,即使镜像Pod准入失败,容器仍会运行;直接kubelet API访问可以绕过Webhook;命名空间选择器配置错误可能静默跳过验证;Webhook故障时可能导致集群锁死或静默绕过。
Supply Chain NRI Plugin是如何在运行时验证容器镜像的?
插件通过NRI的CreateContainer钩子,在容器启动前同步验证。它提取镜像引用和摘要,从OCI注册表获取供应链证明,根据命名空间策略验证,然后允许或拒绝容器。验证包括SLSA来源、VEX漏洞利用性和VSA验证摘要。
SLSA、VEX和VSA分别验证什么内容?
SLSA验证镜像如何构建,证明镜像由特定构建器从特定源代码构建;VEX验证已知漏洞是否实际可利用,受影响状态会阻止容器;VSA验证是否已有可信验证服务完成验证,如果有效则跳过其他检查。
Supply Chain NRI Plugin支持哪些部署方式?
支持三种部署方式:作为Kubernetes DaemonSet(最常见),作为systemd服务用于非Kubernetes主机,或作为预安装的NRI插件自动启动。插件以静态二进制、多架构容器镜像和DEB/RPM包形式提供。
如何从观察到强制执行逐步部署Supply Chain NRI Plugin?
插件默认禁用,支持分阶段部署:第一阶段观察,设置verification为warn,只记录不阻止;第二阶段按命名空间收紧,为生产命名空间设置deny策略;第三阶段强制执行,设置verification为enforce,阻止未通过验证的容器。配置更改通过SIGHUP热加载。
当注册表不可达时,Supply Chain NRI Plugin如何处理?
通过fetch_failure_policy设置控制,默认是warn,容器通过但记录警告;设置为deny则注册表故障时阻止新容器启动。电路断路器在连续失败后短路,防止级联超时。
Supply Chain NRI Plugin的威胁模型是什么?
该插件假设节点完整性,如果攻击者获得root权限,可以杀死插件进程、替换策略文件或禁用NRI。运行时验证关闭了API服务器和容器之间的间隙,但不能防御完全被攻陷的节点。