2026/9/15 13:27:42

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

使用 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),仅供参考