使用 Kubescape 扫描 Kubernetes 上的 ICS/OT 工作负载:从 Modbus/OPC-UA 到例外与补偿控制

发布时间:2026/11/15 20:02:34

使用 Kubescape 扫描 Kubernetes 上的 ICS/OT 工作负载:从 Modbus/OPC-UA 到例外与补偿控制 使用 Kubescape 扫描 Kubernetes 上的 ICS/OT 工作负载从 Modbus/OPC-UA 到例外与补偿控制【免费下载链接】kubescapeKubescape is an open-source Kubernetes security platform for your IDE, CI/CD pipelines, and clusters. It includes risk analysis, security, compliance, and misconfiguration scanning, saving Kubernetes users and administrators precious time, effort, and resources.项目地址: https://gitcode.com/GitHub_Trending/ku/kubescape本篇指南面向运行在 Kubernetes 之上的工业控制系统ICS与运营技术OT安全工程师系统讲解如何用 Kubescape 扫描容器化的 SCADA 组件、PLC 协议桥接器与 OPC-UA 服务器。在这些场景中标准的 Kubernetes 加固控制常常与 Layer-1 协议要求相冲突本指南将带你走通扫描 → 提取失败项 → 为已记录偏差配置精准例外 → 用 NetworkPolicy 落地补偿控制的完整闭环并给出可直接复制运行的清单与配置。前置条件在开始之前请确认以下环境要素就绪已安装kubescapeCLI本仓库examples/ics-ot/目录下的示例清单modbus-deployment.yaml与opcua-deployment.yaml可选指向目标集群的 kubeconfig。本演练不要求真实集群因为扫描目标是清单文件--keep-local还会阻止结果上报到已配置的后端可选用于切片 JSON 输出的jq。从源码看--keep-local的定义位于 cmd/scan/scan.go其说明为If you do not want your Kubescape results reported to configured backend.它不能与--submit同时使用cmd/scan/scan_test.go 中的测试断言了这一约束错误信息为you can use keep-local or submit, but not both。工作原理Kubescape 会依据 NSA、MITRE 与 CIS 框架中的控制项来评估 Kubernetes 清单。在 OT 命名空间中同一套控制项既会标记云原生工作负载的配置错误也会标记 OT 的合法偏差——例如 Modbus 桥接器必需的hostNetwork: true或厂商 SCADA 容器必需的privileged: true。本指南将带你依次扫描两个示例 OT 工作负载然后演示如何为已记录的偏差划定例外范围exception而不会静默掉其他发现项。常见 ICS/OT 协议与端口协议默认端口传输层典型用途Modbus TCP502TCPPLC 读写、HMI 轮询DNP320000TCPSCADA 到 RTU 通信OPC-UA4840TCP厂商中立的 SCADA 数据交换S7Comm102TCP西门子 S7 PLC 编程与数据EtherNet/IP44818TCP/UDPRockwell/Allen-Bradley PLCBACnet47808UDP楼宇自动化IEC 60870-5-1042404TCP电力系统远动其中多个协议Modbus、S7Comm、BACnet在协议层缺乏认证只能依靠网络分段实现隔离——这正是 Kubescape 对hostNetwork、hostPort与NET_ADMIN能力增强的发现项在 OT 命名空间中格外重要的原因。与 ICS/OT 相关的 Kubescape 控制项下表列出最常被合法 OT 工作负载触发的控制项。控制项名称取自仓库内 vendored 的 ValidatingAdmissionPolicy 包 core/pkg/opaprocessor/cel/vapdata/kubescape-validating-admission-policies.yaml该 bundle 的加载逻辑可见 core/pkg/opaprocessor/cel/loader.go。控制 ID控制项名称OT 相关性C-0016Allow privilege escalation厂商容器使用 setuid 辅助程序绑定特权端口C-0038Deny resources with host IPC or PID privileges镜像主机进程状态的 COM/DCOM 桥接器C-0041Deny resources with host network access需要直接触达现场总线网段的 Modbus/DNP3 桥接器C-0044Deny resources with host port连接知名 TCP/502 端口的遗留 HMIC-0046Deny resources with insecure capabilities组播发现、原始套接字协议桥接器C-0048Deny workloads with hostpath mountsUSB 转 RS-485 适配器、PLC 标签数据库C-0057Privileged container denied需要访问/dev/mem的厂商 SCADA 容器C-0074Resources mounting docker socket denied引导启动同级 OT 容器的边缘节点扫描一个 ICS/OT 工作负载示例清单 examples/ics-ot/modbus-deployment.yaml 定义了一个位于ot-modbus命名空间的 Modbus TCP 控制器。它刻意违反了多个控制项C-0041hostNetwork: true注释声明bridge needs direct PLC subnet reachability without NATC-0044hostPort: 502供遗留 HMI 客户端连接知名 TCP/502C-0048hostPath挂载/dev/ttyUSB0USB 转 RS-485 串行桥接器type: CharDeviceC-0057privileged: true厂商 libmodbus 需要/dev/mem进行时序敏感轮询。直接对清单文件发起扫描配合--keep-local无需集群连接kubescape scan --keep-local examples/ics-ot/modbus-deployment.yaml --format json --output /tmp/modbus-scan.jsonpretty-printer 输出会按资源对失败控制项分组。以 Modbus 示例为例表格中包含HostNetwork accessC-0041、HostPath mountC-0048、Privileged containerC-0057等行以及同一清单上触发的若干附加控制项非 root 用户、默认 service account、host port 等。具体集合取决于当前使用的框架 bundle如需权威列表请传入--format json。同时扫描两个示例清单kubescape scan --keep-local examples/ics-ot/ --format json --output /tmp/ot-scan.json其中 examples/ics-ot/opcua-deployment.yaml 中的 OPC-UA 服务器会触发 C-0057privileged: true、C-0016allowPrivilegeEscalation: true、C-0038hostPID: true与 C-0046追加CAP_NET_ADMIN外加同一组次要发现项。该清单还额外定义了一个ClusterIP类型的 Service将 4840 端口暴露给集群内消费方——这是 OPC-UA 发现/数据交换的典型拓扑。过滤 JSON 输出JSON 输出将控制结果嵌套在results[].controls[]下每个控制项的状态位于status.status。提取扁平的失败控制项列表jq -r .results[].controls[] | select(.status.statusfailed) | \(.controlID) \(.name) \ /tmp/ot-scan.json | sort -uCI 中的严重级别阈值对 OT 流水线而言常见模式是仅在critical或high级别的发现项上让构建失败把更低级别的发现项作为信息提示。使用--severity-threshold实现kubescape scan --keep-local examples/ics-ot/ \ --severity-threshold high --format junit --output /tmp/ot-scan-junit.xml该标志在 cmd/scan/scan.go 中定义它是失败控制项的严重级别达到该值时命令失败并返回退出码 1的阈值且严重级别未知缺少 base score的失败控制项被视为超过任何阈值——在 CI 门禁设计中需要留意这一保守行为。为合法的 OT 用例应用例外当一个发现项代表已记录且已接受风险的 OT 偏差时应使用限定范围的例外scoped exception而不是全局禁用。异常文件 examples/exceptions/ics-ot-exceptions.json 针对带有sector: ics-ot标签的资源仅抑制 C-0041hostNetwork[ { name: exclude-ot-sector-host-network, policyType: postureExceptionPolicy, actions: [disable], resources: [ { designatorType: Attributes, attributes: { sector: ics-ot } } ], posturePolicies: [ { controlID: C-0041 } ] } ]应用例外后重新扫描kubescape scan --keep-local examples/ics-ot/ \ --exceptions examples/exceptions/ics-ot-exceptions.json \ --format json --output /tmp/ot-scan-exc.json此时针对modbus-controller的 C-0041 发现项会移出失败集合在 JSON 中以passed状态配合subStatus: w/exceptions呈现。其余发现项Modbus 控制器上的 C-0044、C-0048、C-0057OPC-UA 服务器上的 C-0016、C-0038、C-0046、C-0057仍保持failed状态因为它们不在例外覆盖范围内。例外应尽量窄化范围让真正的新配置错误仍然浮出水面。例外结构的匹配逻辑关于例外文件的字段与匹配语义examples/exceptions/README.md 给出了完整参考每个例外对象必须同时包含resources与posturePolicies条目actions支持两种disable让已接受风险以带例外通过呈现并停止影响合规评分alertOnly将其标注为已确认但保持 failed、继续计入评分资源属性支持name、kind、namespace、cluster均支持正则以及任意资源标签键不支持正则策略属性支持frameworkName、controlName、controlID均支持正则列表内是 OR 逻辑resources数组中的多个匹配项取并集对象内是 AND 逻辑单个对象中的多个属性须同时满足例如{namespace: production, kind: Deployment}只匹配 production 命名空间中的 Deployment。正因如此sector: ics-ot这种标签型选择器会命中所有携带该标签的资源——包括误贴标签的非 OT 工作负载这一点在下面的故障排查中还会展开。OT 命名空间的网络策略抑制一个 Kubescape 发现项并不会消除底层风险它只是记录该风险已被接受。因此每个 OT 例外都应配套一个补偿控制。OT 命名空间中最常见的补偿控制是 NetworkPolicy用于限制哪些 Pod 可以与本协议端口建立会话。以下模式适用于 Modbus 控制器先对ot-modbus命名空间默认拒绝所有入站流量再只允许来自 HMI 命名空间的 TCP/502 访问。apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default-deny-ingress namespace: ot-modbus spec: podSelector: {} policyTypes: [Ingress] --- apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-modbus-from-hmi namespace: ot-modbus spec: podSelector: matchLabels: app: modbus-controller policyTypes: [Ingress] ingress: - from: - namespaceSelector: matchLabels: sector: ics-ot-hmi ports: - protocol: TCP port: 502注意Kubescape 并不强制实施 NetworkPolicy它只做检查。维护一个例外对应一条策略的映射可以让你在回答审计人员的问题如何阻止 HMI 命名空间中的攻击者触达 SIS时直接指向一个具名的单一资源。第二个常被忽视的模式是同时默认拒绝 OT 命名空间的出站流量。厂商容器常常向厂商更新端点回拨phone home显式的出站白名单可以把这类流量约束在已知路径上并防止被攻陷的 OT 容器沦为信标主机beacon hostapiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default-deny-egress namespace: ot-modbus spec: podSelector: {} policyTypes: [Egress]在工厂网络部署中请与 OT/IT 边界的上游防火墙规则配合使用让出站白名单同时在 Kubernetes 层与 L3 边界层得到强制。框架映射NIST SP 800-82 Rev. 3 与 IEC 62443-4-2 均承认只要这些偏差被记录、被限定范围并通过网络分段得到补偿OT 系统就可以在 IT 加固基线上存在合法偏差。上文列出的 Kubescape 控制项最自然地映射到这两个框架的网络完整性与最小功能家族——800-82 r3 中的 PR.AC-5 与 PR.PT-362443-4-2 中的 SR 5.1、SR 5.2 与 SR 7.6。请将这些映射视为映射到关系而非一一对应。在合规报告中引用标识符之前务必对照当前版本的公开原始资料进行确认Kubescape 的发现项是保护性需求分析的输入而不是它的替代品。故障排查扫描某个 OT Pod 返回零发现项确认 Pod 的命名空间与标签与 Kubescape 的评估对象一致。如果该命名空间出现在通过--exceptions传入的kube-system风格例外文件中则该命名空间的所有发现项都会被抑制。先在不带--exceptions的情况下运行扫描确认原始输出中确实存在发现项再逐步把例外文件叠加回来。C-0041 在 OT 命名空间之外的工作负载上被抑制例外文件使用基于属性的选择器。如果sector: ics-ot标签被误贴到非 OT 工作负载上这些负载同样会被命中。用kubectl get pods -A -l sectorics-ot -o wide审计标签在重新扫描前移除误贴的标签。例外文件被静默忽略Kubescape 要求每个例外对象同时包含resources与posturePolicies条目。只含posturePolicies的文件不会匹配任何资源也不会产生任何excluded行。用python3 -m json.tool examples/exceptions/ics-ot-exceptions.json校验 JSON 语法并确认designatorType为Attributes、属性键要么是 Kubernetes 资源标签、要么是内置字段name、kind、namespace、cluster。kubescape scan报 failed to download policies环境中的首次扫描需要出站 HTTPS 来下载 regolibrary 框架。气隙air-gapped环境必须预先填充本地缓存或使用--use-from标志指向预先下载的 bundle该标志定义于 cmd/scan/scan.go语义为从指定路径加载本地策略对象否则下载最新版。离线工作流详见 docs/getting-started.md 中的 Offline/Air-gapped Support 章节下载单个 artifact 后可用kubescape scan framework nsa --use-from /path/nsa.json方式扫描。JSON 输出对明显违反的控制项显示status: passed部分控制项需要集群侧的 admission webhook 才能完整评估。--keep-local扫描仅针对静态规则集评估清单可能无法捕获所有条件。如需权威结果请使用对目标命名空间有读权限的 kubeconfig 扫描真实集群。进一步阅读例外机制完整参考字段、匹配逻辑与更多示例其中包含按标签、按命名空间、按集群、多例外合并等场景的 JSON 模板Azure Pipelines 集成指南用于把 OT 扫描接入 CI 流水线Kubescape 入门指南覆盖安装与离线air-gapped工作流CLI 参考涵盖scan子命令的全部标志ICS/OT 例外示例 与两个可直接运行的 OT 示例清单 modbus-deployment.yaml、opcua-deployment.yaml框架与控制项的权威标识符请以 NIST SP 800-82 Rev. 3、IEC 62443-4-2 与 MITRE ATTCK for ICS 的当前公开版本为准。【免费下载链接】kubescapeKubescape is an open-source Kubernetes security platform for your IDE, CI/CD pipelines, and clusters. It includes risk analysis, security, compliance, and misconfiguration scanning, saving Kubernetes users and administrators precious time, effort, and resources.项目地址: https://gitcode.com/GitHub_Trending/ku/kubescape创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/11/12 16:15:38

HTML表格打造发票收据凭证:动态行与中文大写金额

简介:面向网页前端初学者的HTML发票收据凭证界面实践项目,基于原生HTML表格构建可录入项目、数量、单价的电子凭证,支持填写中文数字与阿拉伯数字,并通过JavaScript实时监听输入变化自动计算合计金额,适合用于快速生成…

2026/11/15 19:57:45

昆明哪里学电工证 在哪考才不花冤枉钱

昆明哪里学电工证 在哪考才不花冤枉钱 怕考不过白交培训费?很多在昆明准备考电工证的朋友都遇到过这种情况。你不是一个人,大家其实都怕花了钱,最后证书没拿到,白忙一场。但你知道吗? 在昆明哪里学电工证…

2026/11/15 19:57:45

考水电工证价值行业前景与薪资待遇

电工证在手到底值不值?郑州报考避坑指南让你看清真相 工地太忙根本没时间复习考试,这几乎是所有一线电工师傅的心声。特别是在郑州这种施工项目密集的城市,时间就是金钱,谁也不愿意把宝贵的时间浪费在没头绪的考试复习上。但你有没有想过,…

2026/11/15 19:57:45

低压电工证考培训怎么报名才能快速上岗?

低压电工证考培训怎么报名才能快速上岗? 找工作被拦在门口,不是因为能力不够,而是没有低压电工证。很多刚入行的朋友都遇到过这种情况:面试时被问到“有没有特种作业操作证”,一说没有,机会立马就没了。其实, 低压电工证考培训怎么报名…

2026/11/15 19:57:45

特种工高工怎么考?考前押题能帮你少走弯路

特种工高工怎么考?考前押题能帮你少走弯路 你是不是也担心,花了几千块报了特种工高工培训,结果考试还是没过,钱白花了?其实,很多人在报考特种作业证书时,都因为不了解流程、备考方法不对、选错培训机构,最后竹篮打水一场空。今天咱们就从…

2026/11/15 19:52:45

山西电力公司电工证丢了怎么补办?2026河南最新政策全解析

山西电力公司电工证丢了怎么补办?2026河南最新政策全解析 你是不是也遇到过这种情况?手头的 山西电力公司电工证 丢了,正准备去面试或者找新工作,结果发现证没带,顿时慌了神。这年头, 急需特种作业证才能上岗找工作…

2026/11/15 0:02:49

电工证考试口诉怎么准备值不值得考

电工证考试口诉怎么准备值不值得考 实操考试心里没底怕挂科,这是大多数准备考电工证的人心里最真实的感受。尤其是面对【电工证考试口诉】环节,很多人不知道该怎么准备,甚至担心自己说不好就被淘汰。其实,只要掌握方法, 值不值得考…

2026/11/15 0:02:49

桑植县考电工证千万别踩坑!报名全流程教你避坑

桑植县考电工证千万别踩坑!报名全流程教你避坑 你是不是也遇到过这种情况:想考个电工证,但不知道从哪儿下手,怕被中介坑,怕花冤枉钱,更怕考了证还不能用?别急,这正是你该看这篇文章的原因。在桑植县考电工证,确实有很多人被坑过,但只要你知道流程、…

2026/11/15 0:02:49

电工证考试口诉怎么准备值不值得考

电工证考试口诉怎么准备值不值得考 实操考试心里没底怕挂科,这是大多数准备考电工证的人心里最真实的感受。尤其是面对【电工证考试口诉】环节,很多人不知道该怎么准备,甚至担心自己说不好就被淘汰。其实,只要掌握方法, 值不值得考…

2026/11/15 0:02:49

桑植县考电工证千万别踩坑!报名全流程教你避坑

桑植县考电工证千万别踩坑!报名全流程教你避坑 你是不是也遇到过这种情况:想考个电工证,但不知道从哪儿下手,怕被中介坑,怕花冤枉钱,更怕考了证还不能用?别急,这正是你该看这篇文章的原因。在桑植县考电工证,确实有很多人被坑过,但只要你知道流程、…

2026/11/15 4:46:37

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/15 2:06:31

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑