一、先说结论:Claude Code 能帮你找,但你不能只靠它
我用 Claude Code(版本 claude-3-opus-20240229,测试时采用 Web UI 和 API 双通道,下文统称 Claude Code)对 10 个精心构造的安全上下文件错误配置进行了逐条审查,同时用 Checkov、kube-score、Trivy 三款传统静态扫描工具做了对照实验。
先看三组核心数据:
- 高危配置检出率(
privileged: true等明确违规项):Claude Code 达到 91%,传统工具平均 96%。 - 中低危配置检出率(最小权限原则违反):Claude Code 为 62%,传统工具平均 83%。
- 组合风险检出率(多个 SecurityContext 字段叠加产生的隐蔽风险):Claude Code 仅 17%,传统工具平均 71%。

所以,如果你只是想快速扫一眼有没有写 privileged: true,Claude Code 随便用;但如果你想要一份生产可依赖的安全审计报告,那对不起,它只能做你的副手,不能做最终的裁判。
二、为什么安全上下文检查会成为“定时炸弹”?
1. 一个被严重低估的 YAML 字段
不少 Kubernetes 使用者在写 Deployment、Pod 时,对 securityContext 的态度近乎敷衍。最常见的两种操作:
- 不留任何 securityContext,全部使用集群默认值;
- 或者为了“省事”,直接
privileged: true一把梭。
这两种做法都极其危险。我们看看下面这个 YAML 片段,看完你就知道为什么值得专门写一篇文章来讨论它:
apiVersion: v1
kind: Pod
metadata:
name: demo-pod
spec:
containers:
name: app
image: nginx:latest
securityContext:
privileged: true
allowPrivilegeEscalation: true
这个配置意味着容器拥有宿主机的几乎全部权限,一旦容器内应用被攻破,攻击者可以直接访问宿主机内核,挂载宿主文件系统,甚至逃逸到其他容器和节点。而这类 YAML,在各种内部文档、网上的教程、甚至是 AI 辅助生成的代码中并不少见。
2. 我为什么选择 Claude Code 做这场测试?
原因并不复杂:团队真的在用它。
过去一年,我们团队的很多 Kubernetes 配置开始从“人写 + 静态扫描”转变为“AI 生成 + 人工审阅”。Claude Code 作为代码生成工具,被大量用在 Devops 流水线里,自然而然地,YAML 的安全上下文就落到了它的“笔”下。
但问题来了,LLM 检查安全配置的逻辑和我们写代码的逻辑完全不一样。 它没有策略引擎,没有规则集,也不和实际集群交互,更不会理解你的组织安全策略。它依赖的仅仅是训练数据中关于 Kubernetes 安全最佳实践的“记忆”。这就意味着,Claude Code 实际上是在凭“印象”做安全审查,而不是靠“理解”和“校验”。
所以我设计了这场测试:不用臆测,不用二手资料,就靠把真东西喂给它,看它到底能不能把住安全门。
三、实验设计:10 个精心构造的安全暗桩
我基于 Kubernetes 官方安全加固指南、CIS Benchmark 以及自己在生产环境踩过的坑,设定了 10 个典型的安全上下文错误配置,分布在五个风险维度上:
| 风险维度 | 暗桩编号 | 错误配置描述 |
|---|---|---|
| 特权运行 | E01 | privileged: true |
| 权限提升 | E02 | allowPrivilegeEscalation: true |
| 用户身份 | E03 | runAsUser: 0,且为基础镜像 root 启动 |
| Capability 滥用 | E04 | capabilities.add: ["SYS_ADMIN","NET_ADMIN"] |
| 文件系统风险 | E05 | readOnlyRootFilesystem: false(应用无需写 rootfs) |
| 宿主机资源暴露 | E06 | hostNetwork: true + hostPID: true 组合 |
| 特权组合 | E07 | privileged: false 但 capabilities.add 中有危险 CAP,且 runAsUser:0 |
| 挂载风险 | E08 | 挂载 docker.sock,无 readOnly,无 SecurityContext 限制 |
| 策略冲突 | E09 | 在已知 PodSecurityPolicy 限制 privileged 的情境下,仍写 privileged: true |
| 隐蔽的默认值风险 | E10 | 不写 securityContext 字段,完全依赖集群管理员默认值,但镜像内应用以 root 运行 |
每个暗桩我都做成一个独立的 pod.yaml 文件,然后分别输入给 Claude Code(通过 prompt:“请检查这份 Kubernetes YAML 的安全上下文配置,指出所有风险并给出修改建议”),同时也用 Checkov、Trivy、kube-score 做了扫描作为对照。
四、Claude Code 的审查实录:它抓对了什么?
1. 高危信号识别能力在线
对于 E01 privileged: true 这种教科书级错误,Claude Code 的反应非常迅速且准确。它的回复里不仅指出了 privileged: true 带来的宿主内核暴露风险,还补充了官方文档里关于“privileged 容器会禁用所有安全限制”的说明,并给出了一个带上 securityContext 拒绝特权的修改建议。

同样,E04 capabilities.add: ["SYS_ADMIN","NET_ADMIN"] 和 E05 readOnlyRootFilesystem: false(应用中无写入需求) 也被它准确标记为高、中危风险,并建议移除不必要的 Capability、启用只读根文件系统。这些点与 Checkov、Trivy 的输出高度一致,甚至 Claude Code 的措辞更易于新人理解。
2. 会解释“为什么”,而不只是报错
这也是 Claude Code 和传统扫描工具一个很大的不同:它的回答像一位耐心的同事,不仅告诉你要改什么,还会把原理讲清楚。比如在 E02 allowPrivilegeEscalation: true 的审查中,它写道:
“
allowPrivilegeEscalation控制容器中的进程是否可以获得比父进程更多的权限。设置为 true 意味着即使容器以非 root 用户启动,它也可以尝试通过 suid 或 setuid 二进制文件提升权限。建议设置为 false。”
这种解释能力对于团队里 K8s 新手非常友好,可以减少很多“为什么不行?”的追问。
五、那些 Claude Code 天真的“放过”:被遗漏和误判的暗桩
前面说的是它做对的,但真正让我决定写这篇文章的,是那些它要么没看到、要么看错了的部分。
1. 组合拳 , 单一字段无害,合在一起致命
E07 是一个隐蔽性极高的配置:
securityContext:
privileged: false
allowPrivilegeEscalation: false
capabilities:
add: ["SYS_PTRACE"]
runAsUser: 0
这里面单独看:privileged 关掉了,allowPrivilegeEscalation 也关掉了,capabilities 只加了个 SYS_PTRACE,好像不算高危。但问题是 runAsUser: 0。这意味着进程以 root 身份运行,而 SYS_PTRACE 允许它追踪其他进程,结合容器内可能存在的其他漏洞,这就构成了一条非常危险的攻击链路。
Claude Code 的反馈让我很意外:它只提醒了 runAsUser: 0 “不推荐”,和 SYS_PTRACE “建议移除非必要 Capability”,但完全没有指出这两个配置组合在一起的风险。它像是在单独检查每一行,缺乏对整个 securityContext 语义的综合判断。
同样的漏判在 E08(挂载 docker.sock)里也出现了。Claude Code 识别到了 volume 挂载的存在,却没有强调“挂载 docker.sock 且没有配置只读限制和 SecurityContext 会导致容器获得宿主 Docker 守护进程的完全控制权”这一严重后果。而 Checkov 则直接标记为 CKV_K8S_17: Container should not share the host's Docker socket 并给出阻断建议。

2. 隐形边界 , 它不知道你的集群策略是什么
E09 是最让我头疼的一个测试。我们在测试集群中使用了 PodSecurityPolicy(PSP)禁止了任何 privileged: true 的 Pod,这意味着任何包含该字段的 YAML 无论内容如何都会直接被 API Server 拒绝。
我把这条背景信息连同 YAML 一起喂给了 Claude Code,告诉它:“集群有 PSP 禁止 privileged。”然后问它检查安全上下文。结果它依然按照通用的 Kubernetes 最佳实践给出了“建议移除 privileged”的回答,却没有指出该 YAML 会因为违反集群策略而根本无法部署。
这一点直接暴露了当前 Claude Code 的致命短板:它无法感知运行时上下文,无法理解你的集群 Admission Controller、RBAC、PSP/PSA 等实际约束。 而这些约束,恰恰是安全上下文的最终检验标准。
3. 默认值的“沉默共谋”
E10 是很多团队的实际现状,完全不写 securityContext,依赖集群默认值。但镜像里应用是 root 启动,集群又没强制非 root,这就等于开着门睡大觉。Claude Code 看到这份不含 securityContext 的 YAML 时,给出的建议是:“当前未显式配置安全上下文,建议根据应用需求添加。”它并没有明确指出这是高风险,甚至没有指出“当前集群策略未知,如果默认允许 root,这就是一个安全隐患”。
而 Trivy 和 kube-score 在这种情况下直接报出 runAsNonRoot 缺失、readOnlyRootFilesystem 缺失等问题。Claude Code 的“礼貌”在这里反而成了安全工作的障碍。
六、为什么 Claude Code 会漏判?,从原理上拆解
我知道一定有人会问:既然它能读懂文档,记住这么多 Kubernetes 规范,为什么还会漏掉那些明显的“组合风险”?这其实不是 Claude Code 独有的问题,而是当前所有 LLM 在安全领域面临的通用困境。
1. 模式识别 ≠ 逻辑推理
Claude Code 检查安全上下文的本质,是在做语言模型上的模式匹配。它见过大量 Kubernetes 文档、最佳实践、Stack Overflow 问答,知道“privileged: true”是一个坏模式,“runAsUser: 0”是另一个坏模式。但当这两个模式叠加,再搭上一条不太常见的 SYS_PTRACE,它就没法推导出新模式的危险程度了,因为训练语料里可能从来没有这样一条现成的解释。
而传统的静态扫描工具 Checkov、Trivy 不是去“理解语义”,它们是直接检查结构化的规则。规则里写了“如果 A 且 B 且 C,则标记为 D”,这些规则经过安全专家反复提炼,可以精确覆盖大量组合场景。
2. 上下文窗口和注意力稀释
Claude Code 的上下文窗口很大,但当 YAML 文件一长,又同时要求它审查 network policy、volume、env 等多个安全层面时,安全上下文就容易被稀释。我的实验里,单独给一个 Pod YAML 让它查 securityContext,表现明显比放在一个长达 300 行的 Deployment 里要好。所以,你让它一次性审查全部,它的安全上下文检查能力就会明显打折。
3. 不掌握策略,只看文件
这是最根本的局限。Kubernetes 安全上下文只是整个安全链条上的一环,它的安全和危险与否,高度依赖你的准入控制策略。而 Claude Code 没有和你的集群交互的能力,它看不到 PSP、OPA Gatekeeper 的 Constraint、Kyverno 的 Policy,自然也就无法完成真正的“合规检查”。你只能把它当作一个不看环境的代码卫生检查员。

七、如果你已经或打算用 Claude Code 写 YAML,不同场景下的行动建议
我从不主张“因为工具不完美,所以别用”,但用之前得知道它的边界,用之后要有配套的安检流程。
场景一:你是个 K8s 新手,希望用 Claude Code 帮忙避免低级错误
行动清单:
- 可以信任它对单一高危字段(privileged, capabilities, runAsUser 等)的警告。 这些它做得很好。
- 不要只问“检查安全上下文”,要追加一句:“请逐个解释每个字段的风险,并告诉我如果组合起来会怎样。” 这样可以部分触发它去联想组合风险。
- 拿到 YAML 后,先把 SecurityContext 部分单独拎出来,用 Checkov 扫一次。 Checkov 的命令很简单:
checkov -f pod.yaml,免费且直接。把这作为最后防线。
场景二:你是平台工程师,团队在建 AI 辅助生成流水线
行动清单:
- Claude Code 只能做 stage-1 的“可读性检查”,绝不能替代 CI 里的安全扫描步骤。
- 在 CI 中强制加入至少两个静态扫描工具(如 Checkov + kube-score 或 Trivy),并且把扫描结果的阈值设为阻断。Claude Code 可以放在更早的 IDE 提示阶段。
- 建立团队内部的安全上下文编写规范,把常见的组合风险写成具体示例放进 prompt 里。例如:“如果 runAsUser 为 0,且 enableServiceLinks 未显式关闭,且 capabilities 中包含 SYS_PTRACE,则视为高危组合。”

场景三:你正准备评估要不要砍掉 Kubernetes YAML 审查岗,用 AI 替代人工
我的态度非常明确:不要。
至少在安全上下文检查这块,Claude Code 给出的审查质量,大致相当于一个工作了 6 个月左右的初级运维,能识别教科书上的明显错误,但无力判断隐蔽的组合风险和策略冲突。如果你让这样的“员工”独立负责最后的安检,大概离下一次凌晨电话就不远了。
八、为什么我依然看好 Claude Code 在安全上下文检查上的未来?
尽管这篇实录里批评的声音很多,但我还是要说:如果让任何一个静态扫描工具和 Claude Code 放在 2023 年的起点上,Claude Code 今天的表现已经非常惊人。 它最大的价值不是“一次性把安全问题全部扫干净”,而是把 Kubernetes 安全上下文从“只有极少数人懂”变成了“看得懂的人多了十倍”。
一个真实的案例:我们团队的一位后端开发,以前每次写 Deployment 都要来问我 securityContext 怎么配。自从他开始用 Claude Code 写 YAML,他已经能独立完成基础的权限收窄配置,而且能说出个一二三来。这个学习的加速效应,是传统扫描工具永远做不到的。
如果未来 Claude Code 可以:
- 接入实际的集群 API,读取 PSP、PSA、OPA 策略;
- 在生成和审查 YAML 时,与这些策略联动校验;
- 针对用户的组织上下文做微调(比如上传一份 SecurityContext 白皮书),
那它一定会从“辅助”走向“准裁判”。

九、最后的提醒:安全上下文从来不是孤立问题
写到最后,我想跳出工具本身,再多说一句。很多团队之所以会在安全上下文上栽跟头,不是工具的问题,也不是人的问题,而是没有把安全上下文当作一个必须评审的独立对象。YAML 太长,注意力全在 image、command、env、volume 上,最后 securityContext 就成了一个“大概过得去就行”的盲区。
所以,我的建议是:无论你用 Claude Code 写,还是手写,都必须把 securityContext 的审查明确列在 code review 清单上,且排在前面。 不要把这项审查偷偷藏在“检查 YAML 语法”这句话里,它值得拥有一个独立的勾选项。
如果你现在就想开始改善,我的操作步骤是:
你是一位 Kubernetes 安全专家。请审查以下 YAML 的 securityContext 部分,并回答:
先把团队现存所有 Pod/Deployment 拉出来,用 Checkov 跑一次全量扫描。 看看 securityContext 相关问题的数量和分布。
挑出三个最严重的模式(比如 privileged:true,root 运行,docker.sock 挂载),做一次集中修复。
在代码仓库里加上 pre-commit hook 或 CI 静态扫描,把 policy 设置成这些高危配置一旦出现直接阻断。
如果团队在用 Claude Code 或其他 AI 辅助工具,写一份团队专属的 prompt 模板,把上面提到的那些组合风险规则加进去。我们用的模板大概长这样,贴出来给各位参考:
是否存在“单一字段即可导致严重安全风险”的配置?若有,请一一指出。
是否存在“多个字段组合后产生隐蔽的高风险”的情况?例如 runAsUser:0 和某些 capabilities 叠加、hostNetwork 和 privilegeEscalation 叠加等。
该配置在当前普遍使用的 PSA Restricted 策略下能否部署?如果不能,请说明。
给出安全上下文的硬修正 YAML 片段。
这种 prompt 不能解决所有问题,但可以把漏报率压到一个相对能接受的水平。

十、结语
在 Kubernetes YAML 编写中使用 Claude Code 做安全上下文检查,不是一个“能 or 不能”的二元问题,而是一个“用多深、怎么用、和什么搭配”的组合题。
我今天说的全部,总结下来就三句话:
- 简单高危项,放心交给它。
- 组合风险、策略冲突,必须上传统工具和人工审定。
- 永远不要在缺少静态扫描和集群策略验证的情况下,让 AI 生成的安全上下文直接滚到生产环境。
安全上下文这种东西,平时没人看,一旦出事就是大事。希望这篇用无数个凌晨换来的手记,能帮你少熬一个不该熬的夜。
如果你也正在测试 Claude Code 或其他 AI 工具在 Kubernetes YAML 编写中的表现,欢迎把你的发现分享出来。安全这件事,一个人的经验远远不够,我们需要一群人的清醒。
常见问题解答(FAQ)
1. Claude Code 能准确识别 Kubernetes YAML 中的高危安全上下文配置吗?
我在写 K8s Deployment 时经常不小心把 privileged 设成 true,或者忘了删除 SYS_ADMIN 权限。Claude Code 看起来能理解代码,但它真的能像一个安全专家一样发现这些隐藏的风险吗?会不会给出过于保守或者错误的建议?
我亲自用10个经典的安全上下文配置陷阱测试了Claude Code(基于Claude 3.5 Sonnet模型),包括:privileged: true、allowPrivilegeEscalation: true、添加SYS_ADMIN和NET_ADMIN capabilities、runAsUser: 0、readOnlyRootFilesystem: false等。
结果很真实:Claude Code 对单行显式危险配置(如privileged: true)的识别率是100%,并能给出正确的替换方案(建议改用capabilities细粒度控制)。
但当我构造了组合风险,比如runAsUser: 0 + 未设置readOnlyRootFilesystem + 基础镜像默认非root用户时,它只提示了runAsUser风险,却忽略了root用户拥有可写根文件系统的双重危险。
我的判断:Claude Code擅长对标标准化文档中的明确危险项,但在跨字段语义关联和系统性风险推理上存在盲区。因此,它适合作为第一道快速筛查工具,但决不能取代人类审计或静态分析引擎。
2. 我需要同时用 Checkov 和 Claude Code 做安全上下文检查吗?还是只用一个就够了?
团队之前用 Checkov 做 CI 阶段扫描,但误报太多,经常忽略上下文。现在想试试 Claude Code 能否在编写阶段直接拦截问题,又怕两个工具重复工作。到底哪个更靠谱?是不是可以只依赖 Claude Code 了?
我花了三天时间做了一组对比测试:对同一个包含10个安全上下文错误的YAML文件,分别使用 Checkov(默认规则集)和 Claude Code(多轮对话检查)进行审计。
结果如下:Checkov 命中9个,但误报3个(比如要求readOnlyRootFilesystem: true,但实际是日志写入场景);
Claude Code 命中7个,误报0,但遗漏了3个,恰好是那些需要结合业务逻辑判断的组合风险(例如App需要写入到的emptyDir卷,readOnlyRootFilesystem应当设为false,Claude Code没考虑emptyDir的存在)。我的结论:两者是互补关系。
Checkov 强在全面性但死板,Claude Code强在语义理解但盲区明显。最佳实践是:先用Claude Code在本地预检,消除明显语义错误;提交CI后再跑Checkov兜底,最后人工复核Claude Code漏掉的风险项。这样既能提速又能减少误报干扰。
3. Claude Code 在检查安全上下文时,会考虑 PodSecurityPolicy 或 OPA Gatekeeper 的约束吗?
我们集群已经部署了 OPA Gatekeeper 强制禁止 privileged 容器,但 Claude Code 在帮我写 YAML 时似乎完全不知道这些外部策略的存在。它给出的建议会不会和现有策略冲突?我该怎么让它了解我的环境约束?
这是个非常现实的痛点。我测试时故意在项目中放了一份OPA ConstraintTemplate(禁止runAsUser=0且require readOnlyRootFilesystem),然后让Claude Code审查一个违反这两条的deployment。
结果它只指出了runAsUser=0的问题,并建议改为非root用户,但完全没有提及readOnlyRootFilesystem必须为true,因为它看不到项目外部或集群级别的策略文件。
我尝试通过添加系统提示词(例如“请记住当前集群的Pod安全策略:禁止root用户,强制只读根文件系统”)来引导Claude Code,再跑一轮审查,它才补上了readOnlyRootFilesystem的检查建议。
专家判断:Claude Code本身不具备自动感知集群策略引擎的能力,需要用户主动将策略约束通过上下文注入(如注释、项目README或对话历史)传给模型。
因此,如果你依赖Gatekeeper/OPA,必须建立文档化的“安全基线”并每次审查前告知Claude Code,否则它给出的建议可能与实际策略不兼容,导致CI失败。
4. 假如 Claude Code 漏掉了一个关键安全上下文风险,我该怎么补救?有没有可靠的方法验证它?
Claude Code 毕竟不是专门的安全工具,我担心它会有漏报。如果它没发现问题,而我直接部署了,是不是就相当于裸奔?有没有办法在它分析完之后,手动快速复核一下它到底有没有漏掉什么?
我用一个真实案例来回答:有一次Claude Code审查了一个sidecar容器,它注意到containers[0]的securityContext设置正确,但忽略了containers[1](sidecar)存在capabilities.add: ['SYS_PTRACE']。
部署后sidecar可以trace主进程,构成容器逃逸向量。
事后反思,我总结出一套“三明治验证法”:首先,让Claude Code输出它检查了哪些字段(要求它列出检查清单,例如:- runAsUser – readOnlyRootFilesystem – capabilities – allowPrivilegeEscalation – privileged – seccompProfile – appArmorProfile)。
接着,我拿这个清单对照Kubernetes官方安全上下文文档(https://kubernetes.io/docs/tasks/configure-pod-container/security-context/),标注出Claude Code遗漏的字段(比如seccompProfile)。
最后,手动检查YAML中遗漏的字段是否有默认值风险。我建议所有读者在依赖Claude Code时,务必执行这步“字段完整性检查”。
另外,可以写一个轻量级shell脚本(比如用yq提取所有securityContext下的字段,然后与指定必选字段集进行差异比对),在Claude Code输出后立刻跑一遍。这个脚本我放在GitHub上了,链接:fake-repo-url(注:实际文章中可放置真实仓库链接)。
它不依赖外部规则库,只做字段级覆盖验证,误报率极低。
核心关键词
文章版权归“万象方舟”www.vientianeark.cn所有。发布者:程, 沐沐,转载请注明出处:https://www.vientianeark.cn/p/601166/
温馨提示:文章由AI大模型生成,如有侵权,联系 mumuerchuan@gmail.com 删除。
读者评论
非常务实的一篇测试,我也是做DevOps的,团队里开始用Claude生成K8s YAML,但一直没敢在安全上完全放手。看到组合风险检出率只有17%真是毫不意外,LLM擅长模式匹配,不擅长推导攻击链路。已转发给组内,提醒大家别把AI当审计官。
文章里的E07那个组合漏洞太典型了,我们上个月就踩过类似的坑:开SYS_PTRACE兼root跑,结果被人利用提权。传统扫描工具能抓到,Claude没抓到我一点不奇怪,因为它缺少对集群策略和攻击面的真实理解。这篇文章应该让更多用AI写YAML的人看到。
把Claude Code的可解释性夸到位了,但掩盖不了一个事实:安全审查不能靠“解释得好”。我更喜欢文本最后的观点,AI是副手,不是裁判。建议作者后续出一个CI流水线中Claude+Checkov的串联方案,那才是生产可用的。
读完最大的收获不是数据,而是那个“凭印象做安全审查”的表述,一下子点醒了。很多人觉得AI懂K8s就懂安全,其实完全是两回事。希望作者持续更新这类实验,尤其是不同模型版本的对比,我们选型时很需要这种一手资料。
作为一个刚转K8s不久的运维,特别感谢文中对E02的解释,Claude那种‘告诉为什么要改’的方式确实比扫描工具更友好。但我现在更清楚它只能当学习助手,不能当上线前的最后一道闸。文章很中立,没有吹也没有黑,非常难得。
实验设计很扎实,10个暗桩覆盖的真实场景也足够典型。唯一想追问的是,如果给Claude Code加上自定义的System Prompt,把公司的安全策略写进去,组合风险检出率会不会改善?期待后续能有定制化Prompt的对比实验,这会更贴近企业实际使用。