第8章 平台安全与 DevSecOps
安全左移的平台化
章节导读
安全是平台工程价值主张中最硬核的一环。传统模式下,安全是「事后检查」:安全团队在上线前做渗透测试、在审计时翻配置、在事故发生后做应急响应——这种「警察模式」在数百个微服务、每天数千次部署的云原生组织中已经结构性失效:安全团队的人数永远追不上服务的增长,检查的速度永远追不上部署的频率。平台工程对安全的重构是「把安全能力嵌入平台而非事后检查」:安全基线成为黄金路径的默认值(非 root、加密、最小权限),安全检查成为流水线的不可移除阶段(SAST、SCA、镜像扫描、签名),安全策略成为集群的准入控制(Kyverno/OPA Gatekeeper 实时拦截违规资源),合规要求成为可执行的代码(策略即代码)。开发者不需要「记得做安全」,因为平台让「不做安全」变得不可能——这就是「安全左移的平台化」(Platformized Shift-Left Security),也是 DevSecOps 理念在平台工程时代的完整实现形态。
理解平台安全的起点是威胁模型的变化。云原生与供应链时代的攻击面已经从「 perimeter 防御」(防火墙内的都是可信的)演变为「假设突破」(assume breach):攻击者可能通过一个依赖库的投毒(ua-parser-js 事件)、一个 CI 系统的入侵(Codecov 事件)、一个泄漏的云凭证(无数起 S3 数据泄漏)进入组织内部。SolarWinds 事件(2020)是转折点:攻击者入侵构建系统,在合法签名的软件更新中植入后门,影响 18000 个组织包括多个美国政府机构——它证明了「构建管道本身是攻击面」。此后的行业响应形成了软件供应链安全的完整体系:SBOM(软件物料清单,知道你的软件由什么构成)、制品签名与验证(确认软件来自可信构建)、依赖扫描与更新(发现已知漏洞)、构建环境隔离(防止构建被劫持)、准入控制(部署时验证以上全部)。平台是这套体系的天然载体:供应链安全的每个环节都需要跨团队一致执行,而平台模板与流水线正是「一致性执行」的机制保证。
平台安全基线的设计哲学是「默认安全」(secure by default)与「最小权限」(least privilege)的工程化。默认安全意味着:黄金路径产出的服务自动满足安全基线——容器以非 root 运行、根文件系统只读、capabilities 全部丢弃、seccomp 使用 RuntimeDefault、镜像来自受信任仓库且经过扫描签名、网络策略默认拒绝跨 namespace 流量、密钥通过平台密钥系统注入而非环境变量明文。开发者要「不安全」需要显式努力(提交例外申请、通过审批、接受审计),而「安全」是零努力的默认——激励结构与安全的对齐是平台安全设计的精髓。最小权限的落地机制:K8s RBAC 的角色模板(业务团队的 ServiceAccount 只能操作自己 namespace 的资源)、云 IAM 的细粒度角色(每个工作负载通过 IRSA/Workload Identity 获得仅够用的云权限,消灭「一个 admin key 全公司共用」)、密钥管理系统的动态凭证(Vault 的数据库动态凭证:每次申请生成短生命周期的专用账号,用完即焚,泄漏窗口从「永久」压缩到「分钟级」)。
密钥管理值得单独强调,因为它是平台安全中「用户感知最强」的能力。传统模式的密钥管理是安全反模式的集合:密钥写在代码里(泄漏到 Git 历史)、写在环境变量里(进程 dump 可见)、写在配置文件里(权限混乱)、人工轮换(一年一次或从不)。平台化的密钥管理提供自助且安全的完整体验:开发者在门户申请密钥(自动走审批与审计)、密钥存储在 Vault/云 KMS(加密静态存储、访问全审计)、应用通过 sidecar/CSI driver/SDK 动态获取(密钥不落盘或只落内存盘)、自动轮换(平台定期轮换并热更新到应用,开发者无感知)、泄漏应急(一键吊销 + 影响面分析:这个密钥被哪些服务使用过、最近访问时间)。External Secrets Operator 把云 KMS/Vault 与 K8s Secret 打通,成为平台密钥注入的标准组件。
合规自动化是平台安全的组织级价值。金融(SOC2、PCI-DSS)、医疗(HIPAA)、欧盟(GDPR、DORA 法案)的合规要求传统上靠「审计准备冲刺」应对:审计前一个月全公司疯狂补文档、改配置,审计后迅速回退。平台化合规把要求编码为持续执行的策略:「PCI 范围内的服务必须启用加密传输」是一条 Kyverno 策略 + 目录标签(pci-scope)的组合,违规部署被实时拦截;「所有生产变更必须有审批记录」由流水线的 approval gate 结构性保证;「数据保留期合规」由平台的存储策略自动执行。审计从「冲刺」变成「导出」:策略执行日志、变更审计记录、访问日志全部在平台中持续积累,审计报告的大部分证据可以自动化生成。合规团队的角色从「检查者」转变为「策略作者」——他们编写 Rego 策略表达合规要求,平台负责执行,这是「合规即代码」(Compliance as Code)的完整闭环。
零信任架构(Zero Trust)在平台中的落地是本章的最后一个主题。零信任的三原则——永不默认信任、始终验证、假设已突破——与平台机制天然契合:工作负载身份(SPIFFE/SPIRE 为每个工作负载签发加密身份,服务间调用 mTLS 双向认证)实现「始终验证」;网络策略默认拒绝 + 显式允许实现「永不默认信任」;运行时安全(Falco 检测异常行为:容器内启动 shell、意外外连)实现「假设已突破」的检测层。平台把这些能力默认交付给每个服务——单个团队自建零信任几乎不可能(需要身份、网络、检测的系统性配合),平台化让零信任从架构愿景变成默认现实。后续要点将深入:供应链安全的完整防线、策略即代码的治理运营、安全自助服务的体验设计、以及安全团队与平台团队的协作模式。
核心概念
- DevSecOps
- 供应链安全
- 策略即代码
- 零信任
要点精析
【安全左移的平台化:从「检查点」到「结构性保证」】「安全左移」(shift left)的口号早已普及,但多数组织的左移停留在「在 CI 里加一个扫描步骤」的浅层实现——扫描是加了,但开发者可以忽略结果、可以跳过步骤、可以在自建流水线里不配置。平台化的安全左移是结构性的:安全控制被嵌入平台的不可绕过路径。结构性保证的四个层次。第一层,生成即安全:黄金路径模板产出的代码与配置默认满足安全基线——安全上下文、网络策略、密钥接入方式在模板中硬编码,开发者「创建服务」的动作本身就完成了安全配置;对比「事后要求团队补安全配置」,生成即安全的覆盖率是 100% 且成本为零。第二层,流水线门禁不可移除:安全扫描(SAST/SCA/镜像/密钥)在平台流水线模板内部,业务侧的引用接口没有「跳过安全步骤」的参数;自定义流水线(逃生舱口)必须通过「流水线策略校验」证明包含等价的安全步骤才能获得生产部署权限。第三层,准入控制实时拦截:Kyverno/OPA Gatekeeper 在 K8s API 层拦截违规资源——即使前两层都被绕过(老服务、手工 kubectl),违规的 Pod 也无法创建;准入策略与模板默认值来自同一「安全基线源」,保证两层的一致性。第四层,运行时检测兜底:Falco 类运行时安全检测「已经部署的合规工作负载」的异常行为(容器逃逸尝试、意外进程、异常网络外连)——前三层防「已知的不安全配置」,第四层防「未知的攻击行为」。四层的纵深防御(defense in depth)让单点失效不导致整体失守,这是「假设突破」思维的平台实现。左移的真正含义在此澄清:不是「把安全检查提前到开发阶段」(那只是时序调整),而是「把安全从检查变成结构」——安全属性由系统的构造方式保证,而非由人的纪律保证。
【平台安全基线:默认配置、最小权限与密钥管理】安全基线是平台安全的具体内容清单,分三个域。配置基线域:容器安全上下文(runAsNonRoot、readOnlyRootFilesystem、drop ALL capabilities、seccomp RuntimeDefault——对应 K8s Pod Security Standards 的 restricted 级别,平台把 restricted 设为业务 namespace 的默认强制);网络安全(默认拒绝的 NetworkPolicy 模板:只允许来自同 namespace 与 ingress controller 的流量,跨服务调用需要显式声明——服务间的允许关系可以从服务目录的 dependsOn 自动生成,目录数据再次成为安全自动化的输入);镜像安全(基础镜像白名单:平台维护的 distroless 或 slim 基础镜像,定期扫描与更新,业务镜像必须 FROM 白名单基础镜像——策略强制)。权限基线域:RBAC 模板库(业务 ServiceAccount 的默认角色:只读自己 namespace 的 configmap/secret,无集群级权限;需要跨 namespace 或集群级权限的场景走显式申请与审批);云 IAM 的工作负载身份(IRSA/Workload Identity:每个 K8s ServiceAccount 映射到独立的云角色,权限最小化到具体资源 ARN——「订单服务只能读写 orders-bucket」而非「所有服务共享一个 S3 全权限角色」);平台自身的权限(IDP 组件的 ServiceAccount 权限最小化 + 定期审查——平台是高价值攻击目标,其权限过大等于给攻击者准备了万能钥匙)。密钥管理域:Vault/云 KMS 作为唯一密钥源(K8s Secret 只是缓存层,External Secrets Operator 同步);动态凭证(数据库、云 API 的短生命周期凭证);自动轮换(平台策略:静态密钥最长 90 天,动态密钥小时级);密钥使用的审计与异常检测(一个只在批处理时段使用的密钥突然在凌晨被调用——告警)。基线的治理机制:基线文档即代码(一个 Git 仓库定义全部基线,Kyverno 策略、模板默认值、扫描规则都从它生成或对照它审查),基线变更走安全团队与平台团队的联合评审,基线符合率持续度量(集群中满足 restricted PSS 的 Pod 占比、使用平台密钥系统的服务占比——不符合项自动生成整改工单)。
【供应链安全:SBOM、签名、扫描与准入的完整防线】软件供应链安全的平台化防线由五个环节构成,每个环节都有明确的工具与平台集成点。环节一,SBOM 生成:流水线为每个镜像生成 SPDX 或 CycloneDX 格式的物料清单(syft 工具),上传到制品库并与镜像 digest 关联;SBOM 的价值在漏洞爆发时兑现——Log4Shell 当天,有完整 SBOM 的组织用一条查询(「哪些镜像的 SBOM 包含 log4j-core 2.x」)在小时内定位全部受影响服务,没有 SBOM 的组织花了数周扫描全部代码库。平台把 SBOM 查询做成自助能力:门户的「供应链」页面输入 CVE 编号,返回受影响服务清单(含版本、部署环境、owner)——安全响应从「全员救火」变成「精准打击」。环节二,构建证明与签名:构建环境生成不可伪造的构建证明(SLSA provenance:这个镜像由哪个仓库的哪个 commit 在哪个流水线构建),cosign 对镜像与证明签名(keyless 模式用 OIDC 身份签名,消灭签名密钥管理负担);签名绑定「制品 ↔ 构建来源」的信任链。环节三,依赖治理:SCA 扫描(Trivy/Grype)在流水线阻断高危漏洞,Dependabot/Renovate 自动提依赖更新 PR(平台机器人批量处理:一次基础依赖升级向 300 个仓库提 PR,CI 验证后自动合并);内部制品代理(Artifactory/Nexus 代理公共仓库并缓存扫描——杜绝「开发者本地 npm install 直接拉公共仓库」的未扫描依赖流入)。环节四,准入验证:生产集群的准入控制器(Kyverno verifyImages / Connaisseur)验证镜像签名——只接受组织签名密钥/signatureless 身份签名的镜像,未签名或外部签名的镜像拒绝部署;这是「构建侧失守」的最后防线(攻击者即使把恶意镜像推进了 Registry,没有有效签名也无法部署)。环节五,持续监控:已部署镜像的持续扫描(Registry 侧的定期重扫——新披露的 CVE 影响老镜像)、运行时 SBOM 与部署清单的比对(实际运行的是不是登记的版本)。五环节的平台化意义:单个团队无法负担完整供应链安全的复杂度,平台把它变成默认交付——每个走黄金路径的服务自动拥有 SBOM、签名、扫描、准入验证的完整防线,安全团队的工作从「检查每个团队」变成「维护平台防线」。
【策略即代码的安全应用:OPA Gatekeeper 与 Kyverno 的治理运营】策略即代码把安全要求从文档变为可执行校验,其工具选型与治理运营同样重要。Kyverno 与 OPA Gatekeeper 的对比:Kyverno 用 YAML 写策略(K8s 原生语法,学习成本低,安全团队与平台团队都能维护)、原生支持 mutate(自动修正违规——如自动注入缺失的安全上下文,「修正而非拒绝」的体验更好)与 generate(自动生成配套资源——如新 namespace 自动获得默认 NetworkPolicy);Gatekeeper 用 Rego(表达力更强,与 Conftest 共享策略语言,适合复杂逻辑,但 Rego 的学习曲线陡峭)。平台实践的主流选择:Kyverno 处理 K8s 准入(mutate 能力是体验优势),Conftest/OPA 处理 CI 阶段的 IaC 校验(Terraform plan、Helm 渲染结果),两者共享「安全基线源」的策略语义。策略治理的运营机制比工具选择更关键。策略库的组织:独立 Git 仓库(security-policies/),按域分目录(pod-security/、network/、supply-chain/、compliance/),每条策略附元数据(owner、严重级、上线日期、豁免流程链接)与单元测试。策略生命周期:新策略的四阶段上线——Dry-run(只记录不拦截,评估存量违规量)→ Audit(违规产生告警与工单,不拦截)→ Warn(拦截但允许显式豁免注解 + 审批)→ Enforce(硬拦截,豁免走正式流程);每阶段有明确的晋级条件(存量违规清零或全部登记豁免、误报率 < 2%)。豁免机制的设计:豁免必须是显式的(资源上的注解 + 到期时间 + 审批人)、有期限的(默认 90 天,到期自动失效并重新拦截——「永久豁免」是策略腐烂的开始)、可审计的(豁免清单月度报告给安全委员会)。策略效果的度量:拦截统计(每策略的月度拦截次数——高频拦截说明模板默认值或文档需要改进,让违规在更早阶段被预防)、存量符合率趋势、豁免数量与到期处理率。策略即代码的终极价值:安全团队的影响力从「人数 × 检查时间」变为「策略数 × 自动执行」——3 人的安全团队通过 200 条策略守护 500 个服务,这是传统模式不可能的杠杆。
【合规自动化:把审计要求编码为平台策略】合规自动化的实现路径是「要求 → 控制 → 策略 → 证据」的四步映射。以 SOC2 与 PCI-DSS 的常见要求为例演示映射方法。要求「CC6.1:逻辑访问的安全管理」→ 控制「生产环境访问基于最小权限与多因素认证」→ 策略(Kyverno:生产 namespace 的 RBAC 绑定必须引用平台审批的角色模板;平台侧:生产 kubectl 访问通过 MFA 认证的跳板系统)→ 证据(RBAC 审计导出、跳板系统的访问日志、审批记录——全部自动采集)。要求「PCI 3.2:持卡人数据加密存储」→ 控制「标记为 pci-scope 的服务的存储必须加密」→ 策略(Kyverno:带 pci-scope 标签的 PVC 必须使用加密 StorageClass;Conftest:pci-scope 服务的 Terraform 必须启用 RDS/KMS 加密)→ 证据(策略执行日志、加密配置的定期扫描报告)。要求「PCI 6.3:漏洞管理」→ 控制「高危漏洞在 30 天内修复」→ 策略(平台工作流:扫描发现 CRITICAL CVE 自动创建工单并设置 30 天 SLA,到期未修复自动升级到安全委员会并施加缓解——如 WAF 虚拟补丁)→ 证据(漏洞工单系统的时间线导出)。合规自动化的三个成熟度级别:级别一,证据自动化(控制仍靠人工执行,但证据采集自动化——审计准备时间从月降到天);级别二,控制自动化(控制由平台策略执行,人处理例外——符合率从「审计时冲刺」变成「持续 95%+」);级别三,要求映射自动化(合规框架更新时,策略库的差距分析半自动化——用 OSCAL 等标准格式表达控制与策略的映射)。组织收益的量化:某金融科技公司的实践数据显示,合规自动化把年度审计准备从 6 人周降到 0.5 人周,审计发现的配置违规从 200+ 项降到个位数,且新合规要求(如欧盟 DORA 法案)的落地周期从 6 个月压缩到 6 周——因为「把要求写成策略」的边际成本远低于「推动 200 个团队手工整改」。合规团队角色的转变:从检查者到策略作者,从对抗者到平台能力的共建者——安全合规团队向平台团队「提需求」(新策略),平台团队交付「执行机制」,业务团队获得「默认合规」。
【安全自助服务:开发者自助扫描与自助修复】安全能力的平台化不仅是「强制」,更是「赋能」——开发者应该能够自助地理解与改善自己服务的安全状态。安全自助服务的四个能力。第一,自助扫描与状态查询:门户的服务页面有「安全」标签页,聚合该服务的全部安全信号——镜像漏洞清单(按严重级与可利用性排序)、依赖健康(过期版本、停止维护的库)、密钥状态(轮换时间、访问模式)、策略符合度(哪些基线满足、哪些豁免中)、安全评分(平台定义的综合分数与同业分位数对比)。评分的设计哲学:分数本身不是目的(防止「为分数而优化」的扭曲),而是「对话的起点」——每个扣分项链接到具体的修复指南与一键操作。第二,自助修复:常见漏洞的修复路径自动化——基础镜像过期?平台机器人已提交升级 PR(一键合并);依赖 CVE?Renovate PR 附带漏洞说明与兼容性测试结果;缺失安全上下文?Kyverno mutate 已自动注入(或提供一键应用的修正 PR)。「修复建议 + 一键执行」把安全修复的成本从「研究 + 实施 + 验证」压缩为「评审 + 点击」。第三,自助例外申请:真实场景需要例外(遗留应用无法非 root 运行、特殊性能需求无法启用某扫描)——例外申请在门户自助发起,自动路由到安全团队(附上下文:服务信息、例外内容、期限、缓解措施建议),审批状态可追踪,批准的例外自动转化为带到期时间的策略豁免注解。第四,安全知识自助:上下文相关的文档——错误信息中的修复指南链接、扫描结果旁的「为什么这危险」解释、runbook 中的安全操作步骤;平台的「安全办公时间」(每周固定时段安全工程师答疑)与「安全冠军计划」(每个业务团队一名兼职安全联络人,平台提供培训与工具)把安全知识分布式化。安全自助服务的度量:漏洞平均修复时间(MTTR for vulnerabilities,平台化前后对比通常从 45 天降到 7 天)、例外申请的审批周期(目标 < 24 小时——安全团队响应慢会把开发者推回「先绕过再说」)、安全评分的组织分布趋势(中位数持续上升且方差缩小 = 尾部团队被平台拉起)。
【案例:零信任架构在平台中的落地】零信任(Zero Trust)从架构愿景到平台默认能力的落地路径值得完整剖析。零信任的核心转变:从「网络位置决定信任」(内网即可信)到「身份与上下文决定信任」(每次访问都验证)。平台落地的四个支柱。支柱一,工作负载身份:SPIFFE/SPIRE 为每个工作负载签发基于属性的加密身份(SPIFFE ID:spiffe://acme.com/ns/payments/sa/api——身份绑定 namespace 与 ServiceAccount,无法伪造),身份以短期证书(X.509 SVID,小时级轮换)形式交付;平台通过 SPIRE 的 K8s workload registrar 自动为每个 Pod 签发身份——开发者零配置。支柱二,服务间认证与加密:服务网格(Istio/Linkerd)或 SPIFFE 感知的客户端库实施 mTLS——服务间调用双向验证身份,加密传输;授权策略基于身份而非 IP(「只有 spiffe://acme.com/ns/checkout/sa/frontend 可以调用 payments-api 的 /charge 端点」——授权规则可以从服务目录的 dependsOn 关系自动生成初稿,团队确认后生效)。支柱三,网络微隔离:默认拒绝的 NetworkPolicy(平台自动生成)+ 基于目录依赖关系的允许规则——横向移动(攻击者拿下一个服务后扫描内网)被结构性阻断;网络策略的「目录驱动生成」是平台独有的能力(依赖关系数据在目录中,策略生成自动化)。支柱四,持续验证与检测:设备与用户访问的 MFA + 设备信任(办公网访问生产系统通过身份感知代理,如 BeyondCorp 模式);运行时检测(Falco 规则:容器内新进程执行、意外外连、敏感文件访问——「假设突破」后的快速检测);访问的上下文评估(异常的访问时间、来源、频率触发凭证吊销)。落地节奏的现实建议:不要试图一步到位——第一阶段先做「身份与可见性」(SPIRE 部署 + 服务间调用的身份化观测:谁在调用谁,与目录声明的依赖对比,发现未声明的调用——这些「影子依赖」本身就是安全与架构债务);第二阶段做「加密与认证」(mTLS 全量,permissive 模式起步观察再切 strict);第三阶段做「授权与隔离」(基于身份的细粒度授权 + 默认拒绝网络策略);第四阶段做「检测与响应」。每阶段都以平台默认能力的形式交付——业务团队「免费」获得零信任的对应层次,这正是平台工程与安全架构的合力:零信任的复杂性被平台吸收,组织获得系统性的安全水位提升。
【安全团队与平台团队的协作模式】平台安全的组织落地需要安全团队与平台团队的深度协作,两者的职责边界与协作机制设计决定成败。职责分工的原则:安全团队拥有「安全要求的定义权」(基线内容、策略语义、例外审批标准、事件响应),平台团队拥有「执行机制的实现权」(模板集成、策略引擎运维、自助体验、度量采集)。安全团队写「什么必须安全」(Rego/Kyverno 策略的业务语义),平台团队负责「策略如何被执行」(引擎部署、性能优化、豁免机制、用户体验)。这个分工的深层逻辑:安全专家稀缺且不应消耗在工程实现上(让安全工程师调试 Kyverno webhook 的性能问题是人才浪费),平台工程师缺乏安全领域知识但精通机制建设——各自做杠杆最大的部分。协作机制的四个载体。载体一,安全基线仓库:单一 Git 仓库定义全部安全基线(策略代码 + 基线文档 + 测试),安全团队与平台团队共同维护(CODEOWNERS:策略语义变更需安全团队批准,引擎配置变更需平台团队批准)——基线的版本历史就是组织安全要求的演进史。载体二,联合评审流程:新安全策略的上线走「安全提案 → 平台可行性评估(性能影响、误报预估、用户体验)→ Dry-run 联合分析 → 分阶段上线」的流程,两团队在每阶段共同决策。载体三,威胁建模的平台化:新平台能力的设计评审包含安全评审(平台组件是高价值目标——工作流引擎能操作全组织的资源,其认证、授权、输入校验需要最高标准);平台自身的威胁模型文档(STRIDE 分析)由安全团队主导、平台团队执行缓解。载体四,事件响应的协同:安全事件的响应中平台是「执行手臂」——一键吊销密钥、批量隔离受影响服务(网络策略即时下发)、全组织范围的应急扫描(SBOM 查询 + 镜像重扫);事件复盘的平台行动项(「这类攻击应该被哪层防线拦截」)进入平台路线图。协作的反模式警示:安全团队「扔策略过墙」(写一堆策略要求平台执行,不顾误报与体验,开发者怨气指向平台)与平台团队「安全事不关己」(把安全当外部约束而非产品属性)都会导致双输;健康的模式是共同对「开发者体验下的安全水位」负责——安全策略的拦截率高不是政绩(说明预防不足),豁免泛滥不是失败(说明例外流程健康),真正的成功指标是「漏洞修复时间的下降与安全事故的减少,同时开发者满意度不降」。
代码示例
/* 示例 1:Kyverno 安全基线策略集——Pod Security Standards restricted 的平台化 */
/* 平台为所有业务 namespace 强制 restricted 基线,mutate 优先于 deny */
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: platform-pod-security
annotations:
policies.kyverno.io/title: 平台 Pod 安全基线
policies.kyverno.io/description: >
实施 K8s Pod Security Standards 的 restricted 级别。
优先自动修正(mutate),无法修正时拒绝(validate)。
spec:
background: true
rules:
/* 规则 1 (mutate): 自动注入缺失的安全上下文——修正优先于拒绝 */
- name: inject-security-context
match:
any:
- resources:
kinds: ["Pod"]
namespaces:
selector:
matchLabels:
platform.acme.com/security-baseline: "restricted"
mutate:
patchStrategicMerge:
spec:
securityContext:
runAsNonRoot: true
seccompProfile:
type: RuntimeDefault
containers:
- (name): "*"
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop: ["ALL"]
/* 规则 2 (validate): 禁止特权容器与 host 命名空间——不可修正的硬红线 */
- name: deny-privileged
match:
any:
- resources:
kinds: ["Pod"]
validate:
message: >
特权容器与 host 命名空间被组织安全基线禁止(容器逃逸风险)。
如确有需求(如监控 agent),请使用平台专用 namespace 与
审批流程: https://platform.acme.internal/docs/security-exceptions
pattern:
spec:
=(hostNetwork): false
=(hostPID): false
containers:
- =(securityContext):
=(privileged): false
/* 规则 3 (validate): 镜像必须来自受信任仓库且带 digest */
- name: require-trusted-signed-images
match:
any:
- resources:
kinds: ["Pod"]
validate:
message: >
镜像必须来自 registry.acme.com 且使用 digest 引用
(tag 可变,digest 不可变——供应链完整性要求)。
pattern:
spec:
containers:
- image: "registry.acme.com/*@sha256:*"
---
/* 规则 4: 镜像签名验证(verifyImages)——供应链的最后防线 */
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: verify-image-signature
spec:
rules:
- name: verify-cosign-signature
match:
any:
- resources:
kinds: ["Pod"]
namespaces:
selector:
matchLabels:
platform.acme.com/tier: production
verifyImages:
- imageReferences: ["registry.acme.com/*"]
attestors:
- entries:
- keys:
publicKeys: |-
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE...
-----END PUBLIC KEY-----
verifyDigest: true
required: true解释:这份策略集展示了平台安全基线的「修正优先、拒绝兜底、签名断后」三层设计。规则 1 的 mutate 策略是体验设计的精髓:开发者提交缺失安全上下文的 Pod(老应用的清单、手写的测试 YAML),Kyverno 自动注入 runAsNonRoot、seccomp、drop ALL capabilities——用户甚至不知道违规发生过,产出物已经合规。mutate 优先于 validate 的理由:拒绝产生挫败与工单,修正产生零摩擦的合规;只有无法自动修正的违规(用户显式声明了冲突配置)才进入拒绝路径。namespace selector 把策略范围限定在打了 security-baseline: restricted 标签的 namespace——平台创建的业务 namespace 自动带此标签(黄金路径的结构性保证),系统 namespace 与特殊审批的 namespace 不受影响,策略作用域的精确控制避免误伤。规则 2 是不可修正的硬红线:privileged 与 host 命名空间是容器逃逸的直接通道,没有任何业务场景应该在业务 namespace 中使用(监控 agent 类需求走平台专用 namespace 与审批);message 中的例外流程链接把「被拒绝」导向「合法的例外路径」而非「绕过平台」。规则 3 强制 digest 引用:tag 是可变的(latest 今天指向 v1 明天指向 v2),digest 是内容寻址不可变的——「部署的就是扫描过签名过的那个镜像」的信任链依赖 digest 固定;这个要求由平台的部署通道自动满足(流水线部署时用 digest 而非 tag),策略拦截的是绕过通道的部署。规则 4 的 verifyImages 是供应链防线:生产 namespace 的每个镜像必须验证 cosign 签名(组织公钥),verifyDigest 确保签名绑定到具体 digest——攻击者即使推送了恶意镜像到 Registry(凭证泄漏场景),没有组织私钥签名就无法通过验证。四层规则的组合效果:常规违规被静默修正,恶意绕过被硬性拦截,供应链攻击被签名验证阻断——纵深防御在准入层的完整体现。/* 示例 2:External Secrets Operator——平台密钥系统的标准接入 */
/* 密钥存储在 Vault,K8s Secret 只是同步缓存,应用零感知接入 */
apiVersion: external-secrets.io/v1beta1
kind: SecretStore
metadata:
name: platform-vault
namespace: team-payments
spec:
provider:
vault:
server: "https://vault.platform.svc:8200"
path: "secret"
version: v2
auth:
/* 工作负载身份认证: ServiceAccount token 换 Vault 角色,无静态凭证 */
kubernetes:
mountPath: kubernetes
role: payments-external-secrets
serviceAccountRef:
name: external-secrets-sa
namespace: team-payments
---
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: payments-db-credentials
namespace: team-payments
annotations:
platform.acme.com/rotation-policy: "90d"
platform.acme.com/security-owner: security-team
spec:
refreshInterval: 1h /* 每小时同步: 轮换后 1 小时内应用获得新密钥 */
secretStoreRef:
name: platform-vault
kind: SecretStore
target:
name: db-credentials /* 生成的 K8s Secret 名,应用按常规方式消费 */
template:
metadata:
labels:
platform.acme.com/managed-secret: "true"
data:
- secretKey: username
remoteRef:
key: payments/prod/db
property: username
- secretKey: password
remoteRef:
key: payments/prod/db
property: password
---
/* Vault 侧的动态数据库凭证配置(平台团队管理) */
/* vault write database/config/payments-prod */
/* plugin_name=postgresql-database-plugin */
/* allowed_roles="payments-app" */
/* connection_url="postgresql://{{username}}:{{password}}@payments-db:5432/prod" */
/* root_rotation_statements="ALTER USER {{username}} WITH PASSWORD '{{password}}'" */
/* vault write database/roles/payments-app */
/* db_name=payments-prod */
/* creation_statements="CREATE ROLE ... LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}'" */
/* default_ttl="1h" max_ttl="24h" */解释:这份配置展示了平台密钥管理的完整链路:Vault 作为唯一密钥源、External Secrets Operator(ESO)作为同步机制、工作负载身份作为认证方式、动态凭证作为高级形态。ESO 的架构价值:应用消费的是普通的 K8s Secret(db-credentials),代码与配置零改动——密钥管理的复杂性被平台组件吸收;SecretStore 定义「从哪里取」(Vault 地址与认证方式),ExternalSecret 定义「取什么、放到哪」(remoteRef 到 target 的映射)。认证链路的安全设计:ESO 用 Kubernetes ServiceAccount token 向 Vault 的 kubernetes auth 方法认证,Vault 验证 token 的真实性(调用 K8s TokenReview API)并检查 ServiceAccount 是否绑定到 payments-external-secrets 角色——全链路无静态凭证(对比传统方式:Vault token 写在 K8s Secret 里,而那个 Secret 本身又要保护——鸡生蛋问题;工作负载身份认证彻底消灭了这个循环)。refreshInterval: 1h 与 rotation-policy 注解的配合实现自动轮换的体验:Vault 侧轮换密钥后,ESO 在 1 小时内同步新值到 K8s Secret,应用通过 Secret volume 的自动更新(kubelet 同步周期)或重启获得新密钥——开发者对轮换零感知。注释中的 Vault 动态凭证配置是更高级的形态:数据库凭证不再静态存储,而是按需生成——应用(或 ESO 的 push 模式)向 Vault 请求凭证时,Vault 实时在 PostgreSQL 中创建一个 VALID UNTIL 1 小时的专用账号;凭证泄漏的爆炸半径从「永久有效的共享账号」压缩为「1 小时有效的专用账号」,且 Vault 审计日志精确记录每次凭证签发(谁、何时、什么角色)——泄漏溯源从「不可能」变成「查日志」。平台化的接入体验:黄金路径模板自动为每个服务生成 SecretStore 引用与标准 ExternalSecret(数据库、API 密钥的命名约定),开发者在门户申请密钥(自动在 Vault 创建路径 + 配置权限 + 生成 ExternalSecret YAML 的 PR)——「密钥管理」从安全专家的领域变成 5 分钟的自助操作。/* 示例 3:Falco 运行时安全规则——「假设突破」的检测层 */
/* 准入控制防「不安全的配置」,运行时检测防「已部署负载的异常行为」 */
apiVersion: falcosecurity.k8s.io/v1alpha1
kind: FalcoRule
metadata:
name: platform-runtime-baseline
spec:
rules: |
/* 规则 1: 容器内启动交互式 shell——入侵后的典型第一动作 */
- rule: Terminal shell in container
desc: 检测到容器内 spawn 了交互式 shell(bash/sh/zsh + tty)
condition: >
spawned_process and container
and proc.name in (bash, sh, zsh, ksh)
and proc.tty
and not container.image.repository in (platform.acme.com/debug-toolbox)
output: >
容器内交互式 shell (user=%user.name user_loginuid=%user.loginuid
container=%container.name image=%container.image.repository
shell=%proc.name parent=%proc.pname cmdline=%proc.cmdline
namespace=%k8s.ns.name pod=%k8s.pod.name)
priority: WARNING
tags: [mitre_execution]
/* 规则 2: 意外外连——数据渗出与 C2 通信的信号 */
- rule: Outbound connection to non-allowlisted endpoint
desc: 业务容器连接到平台白名单外的外部地址
condition: >
outbound and container
and not k8s.ns.name in (platform-system, observability)
and not fd.sip in (allowed_internal_ranges)
and not fd.sname in (allowed_external_services)
output: >
意外外连 (dest=%fd.rip:%fd.rport container=%container.name
image=%container.image.repository cmdline=%proc.cmdline)
priority: CRITICAL
tags: [mitre_exfiltration, mitre_command_and_control]
/* 规则 3: 敏感文件访问——凭证窃取行为 */
- rule: Read sensitive file in container
desc: 容器进程读取 /etc/shadow、私钥或非常规位置的凭证文件
condition: >
open_read and container
and (fd.name in (/etc/shadow, /etc/sudoers)
or fd.name glob /root/.ssh/*
or fd.name glob /tmp/*.pem)
output: >
敏感文件访问 (file=%fd.name container=%container.name
user=%user.name cmdline=%proc.cmdline)
priority: CRITICAL
tags: [mitre_credential_access]
---
/* Falco 告警的平台集成: Falcosidekick 把事件路由到 */
/* Slack(#security-alerts) + 事故系统(P2 自动建案) + Loki(长期检索) */解释:Falco 规则是纵深防御的第四层——前三层(模板默认、流水线门禁、准入控制)都作用于「部署时」,防的是已知模式的违规配置;Falco 作用于「运行时」,检测的是「配置合规但行为异常」的入侵信号,对应零信任的「假设已突破」原则。三条规则映射 MITRE ATT&CK 攻击链的三个阶段(tags 中的 mitre_* 标注让安全团队可以按攻击战术聚合分析)。规则 1(容器内 shell)的检测逻辑:正常业务容器不需要交互式 shell——它的存在几乎总是意味着「有人进来了」(kubectl exec 入侵、webshell、供应链后门的行为);condition 中的 proc.tty 判定交互式(排除脚本中的非交互 sh -c 调用,避免误报),not 子句豁免平台的 debug-toolbox 镜像(显式批准的排障工具容器)——白名单豁免的精确性是 Falco 规则质量的关键:过宽漏报,过窄误报淹没安全团队。规则 2(意外外连)是数据渗出与 C2(命令控制)通信的核心检测:业务容器的合法外连目标应该是可枚举的(内部服务网段 + 显式登记的外部 API),白名单外的外连(尤其是非常规端口)高度可疑;allowed_external_services 列表由平台维护——服务目录的 dependsOn 中登记的外部依赖自动进入白名单,「未声明的外连」同时是安全风险与架构债务的信号。规则 3(敏感文件访问)检测凭证窃取:/root/.ssh、/tmp/*.pem 等位置的读取在正常业务逻辑中不应出现。output 字段的上下文富化是事件响应效率的决定因素:user、container、image、cmdline、namespace、pod 全部内联在告警中——安全工程师收到告警时不需要再查询多个系统拼凑上下文,30 秒内可以判断「这是哪个团队的哪个服务的什么行为」并决定响应动作(隔离 Pod、吊销凭证、升级事故)。Falcosidekick 的路由集成让 Falco 事件进入平台的标准告警管道(分级路由、审计留存、事故关联)——运行时安全不是孤立的工具,而是平台可观测性与事故管理体系的一部分。/* 示例 4:供应链响应的自助查询——「CVE 影响面分析」平台 API */
/* Log4Shell 式危机的分钟级响应:SBOM 索引 + 一键影响面查询 */
from fastapi import FastAPI
from pydantic import BaseModel
import httpx
app = FastAPI(title="Platform Supply Chain Response API")
class ImpactQuery(BaseModel):
cve_id: str /* 如 CVE-2021-44228 */
package_pattern: str | None /* 如 log4j-core,可选精确匹配 */
version_range: str | None /* 如 ">=2.0,<2.15",可选 */
@app.post("/v1/supply-chain/impact")
async def analyze_impact(query: ImpactQuery) -> dict:
"""跨全组织 SBOM 索引查询受影响制品,关联目录与部署数据。"""
/* 步骤 1: 在 SBOM 索引(Dependency-Track 或自建 CycloneDX 库)中 */
/* 匹配包含目标包与版本的制品(镜像 digest 级) */
async with httpx.AsyncClient() as client:
sbom_hits = (await client.post(
"http://dependency-track.platform.svc:8081/api/v1/finding/search",
json={"cve": query.cve_id, "package": query.package_pattern},
)).json()
/* 步骤 2: 制品 digest -> 服务目录实体(部署时登记的 digest 映射) */
affected_services = []
for hit in sbom_hits:
digest = hit["component"]["purl"]
entity = await catalog_lookup_by_digest(digest)
if entity:
affected_services.append({
"service": entity["metadata"]["name"],
"owner": entity["spec"]["owner"],
"environments": await deployments_by_digest(digest),
"fix_available": hit.get("fix_version"),
})
/* 步骤 3: 聚合输出——按 owner 分组,附修复版本与部署环境 */
return {
"cve": query.cve_id,
"affected_service_count": len(affected_services),
"affected_production_count": sum(
1 for s in affected_services if "production" in s["environments"]),
"services": affected_services,
"suggested_actions": [
"1. 平台机器人将向全部受影响仓库提交依赖升级 PR",
"2. 生产环境服务优先: 按 owner 分组的修复工单已自动创建",
"3. 无法立即修复的: 申请 WAF 虚拟补丁缓解 (链接见工单)",
],
}
/* 配套的自动化响应工作流(平台工作流引擎触发): */
/* 1. Renovate 批量 PR: 受影响仓库的依赖升级(附 CVE 说明与测试结果) */
/* 2. 工单自动创建: 按 owner 分组,CRITICAL 级 SLA 48h */
/* 3. 修复进度看板: 受影响服务的修复状态实时追踪(已修复/PR 待合并/未响应) */
/* 4. 升级机制: SLA 到期未修复 -> 安全委员会 + 自动缓解(WAF/网络策略) */解释:这个 API 是「SBOM 投资在危机时刻兑现」的具象化——2021 年 12 月 Log4Shell 爆发时,业界的响应速度差异是数量级的:有 SBOM 索引的组织在数小时内产出完整影响面清单,没有的组织花了数周用 grep 扫描全部代码库(还漏掉了二进制依赖与传递依赖)。实现链路分三步,每步依赖一项平台基础设施。步骤 1 依赖 SBOM 的持续采集与索引:流水线为每个镜像生成 CycloneDX SBOM 并上传到 Dependency-Track(开源的 SBOM 管理与漏洞关联平台),它持续把 SBOM 中的组件与新披露的 CVE(NVD 数据源)匹配——漏洞披露的瞬间,受影响制品清单已经就绪,查询是「读预计算结果」而非「现场扫描」。步骤 2 依赖部署时的 digest 登记:平台部署通道在部署事件中记录「服务 X 的环境 Y 正在运行 digest sha256:abc...」——这个映射让「受影响制品」翻译为「受影响的生产服务」,没有它 SBOM 查询只能到镜像级,无法回答「哪些线上服务需要立即修复」。步骤 3 依赖服务目录的 owner 数据:修复责任自动路由到 owning 团队,工单按团队分组——危机响应的组织动员自动化。suggested_actions 的设计体现「响应即产品」:查询结果不只给数据,还给行动方案(机器人 PR、工单、缓解选项)——安全团队在危机中的角色从「人肉协调 200 个团队」变为「启动自动化响应工作流并监督进度」。修复进度看板与升级机制完成闭环:未响应团队在 SLA 到期后自动升级(安全委员会介入 + 平台自动施加缓解——WAF 虚拟补丁或网络策略限制出站),「修复或缓解」的强制保证让组织级风险在可控时间内收敛。这套能力的平时价值:每周的新披露 CVE 自动匹配(无需危机也持续运行),团队收到的不是「恐慌通知」而是「带 PR 的修复建议」——供应链安全从应急模式进入常态运营模式。/* 示例 5:NetworkPolicy 的目录驱动生成——从依赖关系自动推导网络隔离 */
/* 平台工作流: 读取服务目录的 dependsOn,生成默认拒绝 + 精确允许的策略 */
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: payments-api-ingress
namespace: team-payments
annotations:
platform.acme.com/generated-from: "catalog:component/payments-api"
platform.acme.com/generated-at: "2024-09-15T08:00:00Z"
spec:
podSelector:
matchLabels:
app.kubernetes.io/name: payments-api
policyTypes: ["Ingress"]
ingress:
/* 允许来源 1: 目录中声明的上游——checkout-frontend dependsOn payments-api */
- from:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: team-checkout
podSelector:
matchLabels:
app.kubernetes.io/name: checkout-frontend
ports: [{ protocol: TCP, port: 8080 }]
/* 允许来源 2: 服务网格 sidecar 与健康检查(平台基础设施) */
- from:
- namespaceSelector:
matchLabels:
platform.acme.com/role: infrastructure
ports: [{ protocol: TCP, port: 15020 }]
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: payments-api-egress
namespace: team-payments
annotations:
platform.acme.com/generated-from: "catalog:component/payments-api"
spec:
podSelector:
matchLabels:
app.kubernetes.io/name: payments-api
policyTypes: ["Egress"]
egress:
/* 目录声明的下游依赖: fraud-detection 服务与 payments-postgres */
- to:
- podSelector:
matchLabels:
app.kubernetes.io/name: fraud-detection
ports: [{ protocol: TCP, port: 8080 }]
- to:
- podSelector:
matchLabels:
platform.acme.com/resource: payments-postgres
ports: [{ protocol: TCP, port: 5432 }]
/* 平台基础设施: DNS 与可观测性采集 */
- to:
- namespaceSelector:
matchLabels:
kube-system: "true"
ports: [{ protocol: UDP, port: 53 }]
- to:
- namespaceSelector:
matchLabels:
platform.acme.com/role: observability
ports: [{ protocol: TCP, port: 4317 }]
---
/* 生成器逻辑(平台工作流引擎中的伪代码): */
/* entity = catalog.get("component/payments-api") */
/* ingress_from = [e for e in catalog.query( */
/* "dependsOn == payments-api")] /* 谁依赖我 -> 我的 ingress */ */
/* egress_to = entity.spec.dependsOn /* 我依赖谁 -> 我的 egress */ */
/* policy = render_template(ingress_from, egress_to, platform_defaults) */
/* kubectl apply + 记录审计(生成时间、源目录版本) */解释:这个示例展示平台独有的安全自动化能力——「目录驱动的网络微隔离」,它是零信任第三支柱(网络隔离)与第 2 章服务目录的深度结合。传统 NetworkPolicy 的困境:手写网络策略需要工程师准确知道服务的全部通信关系(遗漏一条就断流量),而通信关系随架构演进持续变化——结果是大多数组织的 NetworkPolicy 要么不写(全通),要么写「宽松版」(允许整个 namespace 互访,隔离名存实亡)。平台化解法的数据基础是服务目录的 dependsOn 关系:这些关系由脚手架自动登记(新服务的依赖在创建时声明)、由开发者维护(依赖变更时更新目录)、并被可观测性数据验证(第 8 个关键要点提到的「影子依赖」检测:实际流量与目录声明的 diff)。生成器逻辑把目录数据翻译为最小权限的网络策略:ingress 规则来自「谁声明依赖我」(反向查询),egress 规则来自「我声明依赖谁」,加上平台基础设施的固定允许(DNS、可观测性采集、网格 sidecar)——每条允许规则都可追溯到目录中的一个声明关系。annotations 的溯源设计(generated-from、generated-at)让策略的「为什么」可审计:安全审查时任何一条允许规则都能回答「基于哪个目录声明生成」;策略与目录的同步由平台工作流保证(目录 dependsOn 变更触发策略重新生成,PR 形式提交给服务 owner 确认——网络变更可能导致断流,人在回路是必要的安全阀)。「影子依赖」的治理闭环尤其精妙:Falco/网格遥测发现未声明的通信(A 实际调用 B 但目录无声明)→ 平台生成「依赖申报」工单 → 团队确认后目录更新 → 策略自动放行;未确认的未声明通信在宽限期后被策略阻断——网络策略成为倒逼目录数据质量的机制,目录质量又反过来提升策略精度,两个平台能力相互强化。安全收益的量化:横向移动阻断(攻击者拿下 checkout-frontend 后无法扫描/访问与它无声明关系的 200 个服务)、攻击面收敛(每个服务的可达集合从「全集群」缩小到「个位数声明依赖」)、合规证据(PCI 的网络隔离要求由生成策略 + 目录溯源自动证明)。实验笔记
【实验目标】本实验构建一个「平台安全基线」的最小完整实现:从准入控制(Kyverno 安全策略)、密钥管理(Vault + External Secrets)、供应链验证(镜像签名 + verifyImages)到运行时检测(Falco),体验「纵深防御」各层的实际效果与协同。实验以「攻击者视角」验证每层防线:你将尝试部署各类违规与恶意工作负载,观察平台如何拦截、修正或告警。预计耗时 6-8 小时。
【环境准备】kind 集群;Helm;Kyverno(helm install kyverno);Vault(开发模式即可:helm install vault 用 dev 模式,或 docker 运行 vault server -dev);External Secrets Operator(helm install external-secrets);Falco(helm install falco,kind 环境需要内核模块支持——若 falco-modern-bpf 不可用可用 falco-talon 或跳过步骤五,用 Kyverno 的 policy report 替代演示);cosign 与 syft CLI;测试镜像——准备两个:一个「合规镜像」(基于平台风格构建:非 root 用户、distroless/alpine 基础、含健康端点的简单应用)与一个「违规镜像」(root 运行、基于完整 ubuntu、apt 装了些东西)。
【步骤一:准入控制基线(90 分钟)】部署本章代码示例 1 的 Kyverno 策略集(可简化 verifyImages 到步骤三再做)。为实验创建两个 namespace:team-alpha(打标签 platform.acme.com/security-baseline=restricted)与 team-legacy(不打标签,模拟豁免 namespace)。攻击者视角验证:(1)向 team-alpha 提交一个 root 运行 + 无安全上下文的 Pod——观察 mutate 规则是否自动注入安全上下文(kubectl get pod -o yaml 对比提交与实际的差异);(2)提交一个 privileged: true 的 Pod——观察拒绝与错误信息(message 是否包含例外流程指引?);(3)提交一个 docker.io/nginx:latest 镜像的 Pod——观察镜像来源策略的拦截;(4)向 team-legacy 提交同样的违规 Pod——确认不受策略影响(作用域隔离验证)。记录每种违规的拦截/修正行为与用户看到的错误信息质量。
【步骤二:密钥管理链路(90 分钟)】在 Vault(dev 模式)中配置:启用 kubernetes auth(绑定 kind 集群)、创建 KV v2 路径 secret/team-alpha/、写入一个测试密钥(db 凭证)。部署 SecretStore 与 ExternalSecret(参考代码示例 2,按你的 Vault 地址与角色调整)。验证链路:(1)ExternalSecret 状态变为 Ready,目标 K8s Secret 生成且值正确;(2)在 Vault 中轮换密钥值(vault kv put 新版本),等待 refreshInterval 后确认 K8s Secret 自动更新;(3)删除 Vault 侧密钥,观察 ESO 的行为与事件(同步失败如何呈现?);(4)安全审计体验:vault audit enable file 后触发几次读取,查看审计日志记录了什么(谁、何时、读了什么路径)。思考并记录:对比「密钥直接写在 K8s Secret 里」的传统方式,这条链路消灭了哪些风险?
【步骤三:供应链签名与验证(90 分钟)】用 cosign 生成密钥对(cosign generate-key-pair),对「合规镜像」签名(本地 kind 加载镜像后用 cosign sign 配合 registry,或用 ttl.sh 之类的临时 registry 演示)。部署 Kyverno verifyImages 策略(代码示例 1 的规则 4,公钥替换为你生成的)。攻击者视角验证:(1)部署已签名镜像的 Pod——通过;(2)部署未签名镜像的 Pod——拦截,检查错误信息;(3)用 syft 为合规镜像生成 SBOM(cyclonedx-json 格式),检查其内容结构(组件、版本、purl);(4)模拟 Log4Shell 式查询:在 SBOM 中 grep 某个包名,体验「影响面分析」的手工版。记录:签名验证增加了多少部署延迟(kubectl apply 到 Pod Running 的时间对比)?
【步骤四:网络微隔离(60 分钟)】部署两个测试服务(http-echo 即可):service-a 与 service-b 在 team-alpha namespace。先验证默认全通(a 可以 curl b)。然后应用「默认拒绝 + 精确允许」的 NetworkPolicy(参考代码示例 5 的结构简化版:只允许 a → b 的 8080)。验证:a curl b 成功、a curl 其他服务失败、b curl a 失败(单向允许)。再模拟「目录驱动」:写一个 20 行的脚本,从一个模拟目录文件(YAML:声明 a dependsOn b)生成 NetworkPolicy YAML——体验生成器逻辑。
【步骤五(可选):运行时检测(60 分钟)】部署 Falco(kind 环境用 falcoctl + modern eBPF 探针;若内核不支持则记录环境限制并跳过)。运行一个合规的测试 Pod,然后 kubectl exec 进入容器启动 sh——观察 Falco 告警(kubectl logs falco daemonset 或 Falco 的事件输出):Terminal shell 规则是否触发?告警的 output 字段包含哪些上下文?如果环境允许,再测试「意外外连」:在容器内 curl 一个外部地址,观察 egress 类规则。
【检查清单】(1)mutate 自动注入验证成功(提交与实际 Pod spec 的 diff 记录);(2)privileged/docker.io/未签名三类违规全部被拦截且错误信息含修复指引;(3)策略作用域正确(team-legacy 不受影响);(4)Vault → ESO → K8s Secret 链路完整,轮换自动同步,审计日志可查;(5)签名验证:已签名通过、未签名拦截;SBOM 生成且结构可解析;(6)NetworkPolicy 默认拒绝 + 精确允许生效,生成脚本可运行;(7)(可选)Falco 检测到容器内 shell;(8)实验报告包含「纵深防御矩阵」:每层防线 × 拦截的攻击类型 × 用户体验(静默修正/明确拒绝/告警)。
【进阶挑战】(1)实现「策略四阶段上线」演练:新策略先以 validateFailureAction: Audit 部署,用 PolicyReport 统计存量违规,修复后切 Enforce——体验完整的策略治理流程;(2)为步骤四的生成器添加「影子依赖检测」:对比 NetworkPolicy 允许集与实际流量(可用简单的连接测试脚本模拟),输出未声明通信清单;(3)豁免机制实现:设计一个带到期时间的豁免注解(platform.acme.com/security-exemption=EX-123,expires=2024-12-31),Kyverno 策略跳过带有效豁免的资源,写一个 CronJob 检查过期豁免并重新拦截;(4)安全评分:为实验环境的服务设计一个安全评分算法(准入合规 30 分 + 密钥管理 20 分 + 签名 20 分 + 网络隔离 20 分 + 运行时告警清零 10 分),用脚本计算各服务得分并输出报告。
延伸阅读
- 《Kubernetes Security and Observability》(Liz Rice & Michael Hausenblas,O'Reilly 2022):K8s 安全的系统性教材,Liz Rice(Falco 与 kube-bench 的核心维护者)从攻击者视角剖析 K8s 的威胁模型——容器逃逸、凭证窃取、横向移动的攻击路径与对应的平台防御。第 4-6 章的 RBAC、Pod 安全与网络策略内容是本章基线设计的理论展开。
- NIST SP 800-204 系列(微服务安全架构指南)与 NSA/CISA 的 Kubernetes Hardening Guide:官方权威的安全基线参考。NSA 指南的 Pod 加固、认证、网络隔离章节与本章的基线清单高度对应,可直接作为 Kyverno 策略的需求来源;SP 800-204D 的零信任微服务架构是本章案例的标准化表达。
- SLSA 框架文档(slsa.dev)与 Sigstore 项目(cosign 文档):软件供应链完整性的标准与实现。SLSA 的四级成熟度模型给出供应链防御的演进地图;cosign 文档的 keyless 签名章节(OIDC + Rekor 透明日志)解释了「无密钥管理负担的签名」如何实现——本章示例 1 的 verifyImages 与示例 4 的 SBOM 响应的上游技术。
- Kyverno 官方文档与 kyverno.io/policies 策略库:平台安全策略的实操权威。重点阅读 mutate/validate/verifyImages 三类策略的完整语义、PolicyReport 机制(存量违规的持续审计)与策略库中按 PSS(Pod Security Standards)组织的现成策略——本章示例 1 的生产化版本可以直接从策略库组装。
- Vault 官方文档的 Auth Methods 与 Dynamic Secrets 章节:工作负载身份认证(kubernetes auth 的 TokenReview 机制)与动态凭证(数据库、云 IAM 的按需签发)的深入材料。动态凭证是「凭证泄漏爆炸半径最小化」的终极方案,文档中的 lease 与轮换机制是本章示例 2 的完整背景。
- 《Zero Trust Networks》(Evan Gilman & Doug Barth,O'Reilly 2017):零信任架构的奠基读物——身份即边界、设备信任、微隔离的系统性论述。虽然早于云原生平台的普及,其「消除隐式信任」的核心思想正是平台安全基线与网络微隔离设计的理论源头;配合 SPIFFE 白皮书(spiffe.io)阅读效果最佳。
- Falco 官方文档与 Falco Talon 项目:运行时安全的规则编写指南(condition 的 sysdig 过滤语法、输出模板的字段库)与响应自动化(Talon 把检测事件联动为响应动作:隔离 Pod、吊销凭证)。MITRE ATT&CK 框架(attack.mitre.org)的容器矩阵是运行时规则覆盖度评估的地图。