跳到正文

03 / 05 · 2022.08 — 2023.07

浙江木链科技有限公司

在工控安防方向做 Python 后端:参与旁路流量审计系统的流量处理链路、白名单检测引擎与 Django REST 接口,集成 Suricata 做黑名单检测,支持 27 种工控协议的深度解析。

职位
Python 开发工程师
行业
工控安防
地点
浙江
团队
13 人
在职
1 年

关键成果

  • 27 种

    深度解析的工控协议:Modbus、S7COMM、IEC104、IEC61850、DNP3、OPC UA、PROFINET、BACnet 等

  • 996 条

    接入 Suricata 的工控漏洞特征规则,用于黑名单检测

  • 10 秒

    用 Redis 过期事件实现的流聚合窗口,把逐包写库变成按流写库

在这里做的项目

PROJECTS · 1

2022.08 – 2023.07 · Python 后端开发 · 团队 13人

工控安全审计平台

面向电力、制造等工控场景的旁路流量审计系统:探针抓取交换机镜像流量,经 Kafka 进入 Cython 协议解析引擎,按资产、白名单、黑名单三层策略检测并告警。支持 27 种工控协议深度解析(Modbus、S7COMM、IEC104、IEC61850 MMS/GOOSE/SV、DNP3、OPC UA/DA/AE、PROFINET、ENIP/CIP、BACnet 等),已在电力科研院所等项目中落地。

  • 参与流量处理链路开发:抓包探针 → Kafka → 协议解析引擎 → PostgreSQL;利用 Redis 过期事件实现 10 秒窗口的流聚合与批量入库,显著降低数据库写入压力;利用 Redis TTL 实现设备离线检测
  • 实现基于五元组、MAC 和协议功能码的白名单检测引擎,用位图区分“行为异常”与“内容异常”;支持 IEC104 ASDU、OPC 接口 / 功能码的深度规则匹配,并支持按时间段自动学习生成白名单
  • 负责资产管理、白名单 / 黑名单策略、告警、报表等 Django REST 接口开发;用 Celery Beat 实现报表导出、策略备份、过期数据清理、探针健康巡检等定时任务
  • 集成 Suricata,解析 unified2 告警,接入近千条(996 条)工控漏洞特征规则实现黑名单检测
  • 基于 Kafka Connect(Debezium CDC)把数据同步到 Pilosa 位图索引,支撑流量统计与多维查询
  • (定制版)解析 IEC 61850 SCD 文件,自动生成变电站 IED 通信基线与拓扑
  • Python
  • Django / DRF
  • Celery
  • Kafka
  • Redis
  • PostgreSQL
  • Pilosa
  • Suricata
  • Cython
  • Vue 2

系统架构

采集 · 探针 消息总线 解析 · 检测 存储 · 同步 应用 · 管理 离线告警 HTTP REST 规则 · 资产 · 协议开关 · 阈值 每 5s 拉取(热更新) 工控网络镜像流量交换机 SPAN 口 · 旁路只读 network-capturer 抓包探针 · Python Scapy L2 原始套接字 selector 多网卡轮询 Cython Cstat 计数 deque 缓冲 → Producer 运维保障 Supervisor 守护常驻进程 Celery 每 5 分钟巡检探针 抓包 / 写 Kafka 双计数 systemd 检查 Pilosa 状态 cpulimit 限制进程 CPU Suricata 4.0.4 AF_PACKET · cluster_flow 996 条工控漏洞特征规则 输出 unified2 二进制日志 Kafka 集群 cp-kafka 5.4 · ZooKeeper SASL 认证 · Docker 部署 retention.ms = -1 raw_packets 原始帧 · 保留 300GB alerts 检测告警 · 保留 1GB Kafka 设计要点 抓包与解析解耦、削峰 解析端重启不丢数据 Producer retries = 5 批量 100 条发送 BufferError → flush 重试 raw 300GB / 其它 1GB unified2 日志 /var/log/suricata packet-inspector 解析检测引擎 · Consumer 拉取 raw_packets · pypkt (Cython) 解析 70+ 协议 · 五元组+MAC+协议+载荷 → 哈希 · Redis 10s 过期窗口聚合计数 · 每 5s 批量 INSERT … RETURNING · WhitelistInspector 策略检测 · 异常 → Producer 写 alerts · ThreadPool(16) + fail2restart 自愈 详见 02 节内部线程图 store.py 告警入库 消费 alerts → sec_alert 表 Syslog 外发 · 推送演练靶场 Supervisor 常驻进程 gunicorn · celery worker/beat store.py · unified2_recorder db_2_pilosa · packet_stat detect_device_offline cpulimit unified2_recorder idstools 解析 → 黑名单告警入库 Redis 6 DB0/1 Celery broker/结果 DB2 流聚合窗口 TTL 10s DB3 设备活跃 TTL N 分钟 keyspace 过期事件 (Ex) PostgreSQL 10 packet_packet 流记录(含 count / length) sec_alert_secalert 安全告警 资产 · 白名单 · 黑名单 · 配置 wal_level = logical max_connections = 300 Kafka Connect · Debezium pgoutput 逻辑复制 → Avro auditor.public.* CDC 变更流 · Schema Registry db_2_pilosa AvroConsumer 写入位图 Pilosa 位图索引 流量统计 · 白名单自学习 Vue 2 前端 Vuex · Router · ECharts iView · axios · Electron Django 1.11 + DRF Gunicorn 8 workers :9003 资产 · 白名单 · 黑名单 安全告警 · 系统告警 数据包审计 · 报表导出 策略备份恢复 · 系统设置 用户 · 授权激活 白名单自学习 统一管理平台对接 drf-yasg 接口文档 约 12 个 Django app Celery worker + beat Redis 作 broker 报表 · 策略备份 · 统计 过期清理 · 进程巡检 bigdaddy 设备 Agent 改 IP / 时间 / 重启 配置抓包网卡 · 下发规则 固件升级 RSA + AES 证书生成 · 授权激活 对外对接 统一管理平台 · 国密 SM4 Syslog · 演练靶场推送 1 2 3 4 5 6 7 8 9 10
pop map[key] 放入待入库队列 ① Kafka 消费线程poll(0.01) raw_packets raw deque·1000 ② 解析 + 聚合线程pypkt 识别协议 → 生成哈希 key 内存 map + Redis DB2 新 key:SETEX key 10s 已有 key:count++ / bytes+= 同时 SETEX src_ip → DB3(离线检测) ③ 过期监听线程__keyevent@2__:expired parsed deque·1000 ④ 入库 + 检测线程(每 5s) 批量 INSERT … RETURNING count InspectorManager → 白名单检测 有异常 → thread_pool.submit(send_alert) PostgreSQL packet_packet Kafka alerts(异常列表) ⑤ 规则热更新线程(每 5s) 资产 / 白名单 / 协议开关 / 阈值 → share_data Django 后端 API 主线程守护 fail2restart 每 5s 检查 5 个线程的 future 线程异常 → 记日志并重新 submit PG 断连 → 循环重连不退出 线程池积压 > 500 → 主动退避 deque 设上限,防内存膨胀 Producer 队列 10 万条缓冲 告警发送失败走回调记录
资产校验 · check_ip_and_mac 白名单校验 · check_whitelists 独立检测链路 否 是 是 否 否 · 位图 0 是 不符 · 位图 2 符合/无载荷规则 解析后的流记录两类校验同时进行 IP 在资产表中?通信设备(路由)MAC 跳过 非法设备接入 2 开启 IP-MAC 绑定且实际 MAC 与资产不一致? MAC 地址冲突 4 资产校验通过无告警 匹配任一白名单五元组?IP / MAC / 端口范围 / L4 / 协议 通讯行为异常 3 工控协议载荷规则校验功能码 / 字段值 / 取值范围 通讯内容异常 5 正常通过结果位图 = 3 Suricata 特征规则命中CODESYS、S7 等工控漏洞利用特征 黑名单告警 1 Redis DB3 设备 key 过期N 分钟内该 IP 没有任何流量 设备无流量 30

系统数据流

抽象示意 · 不含内部细节
  1. 交换机镜像口

    旁路只读,不影响生产网

  2. 抓包探针 → Kafka

    Scapy · raw_packets 保留 300GB

  3. 协议解析引擎

    Cython · 27 种工控协议

  4. 策略检测

    资产 · 白名单(位图)· Suricata 黑名单

    ▲ 我负责的部分

  5. PostgreSQL → Pilosa

    流量明细 · CDC 位图索引

  6. Django + Vue

    告警 · 策略 · 报表

    ▲ 我负责的部分

照片均已征得同事同意,或对他人面部做了模糊处理

在这里学到了什么

在工控安防行业,了解了常见的攻击手段与权限提升,也第一次接触 Modbus、S7COMM、IEC104、OPC 等工控协议和旁路流量审计;在编写业务代码的同时,更加熟练地使用 Django / DRF 与 Celery。

协议解析是 CPU 密集的字节级操作,解析库用 Cython 把热点路径编译成 C 扩展,对上层仍保持 Python 接口;这期间也参与过 C++ 向 Rust 迁移的项目。用 Redis 过期事件做聚合窗口、用位图区分异常类型,都是用简单的原语来化解高频工控流量带来的写入与检测压力。

TECH STACK

  • Python
  • Django / DRF
  • Celery
  • Kafka
  • Redis
  • PostgreSQL
  • Pilosa
  • Suricata
  • Cython
  • Vue 2
  • Docker