
Malcolm takes the three hardest-to-integrate open-source network security tools — Suricata (IDS), Zeek (protocol analysis), and Arkime (full packet capture) — and ships them as a single Docker Compose stack with OpenSearch, prebuilt dashboards, and a unified web interface. Instead of spending weeks wiring these together, you run one install script.
Built by CISA and Idaho National Laboratory for critical infrastructure defenders. Ships with ICS protocol parsers for Modbus, DNP3, S7, OPC-UA, BACnet, EtherNet/IP, and IEC 60870-5-104 out of the box.
Feed it PCAPs, connect it to a SPAN port, or point it at existing log directories. It indexes everything into OpenSearch and gives you searchable, visualized network intelligence.
The ICS protocol coverage is the distinguishing feature. Via Zeek's ICSNPP plugin ecosystem, Malcolm parses Modbus function codes, DNP3 application-layer objects, Siemens S7 read/write requests, OPC-UA service calls, BACnet property requests, and EtherNet/IP CIP messaging. Each protocol gets its own dashboard, so you can filter by protocol, source, function code, or time range without writing queries.
The stack runs as ~15 Docker containers: Zeek and Suricata for capture and analysis, Logstash and Filebeat for log normalization, OpenSearch for indexing, OpenSearch Dashboards and Arkime for visualization, and NGINX for unified authentication.
Malcolm needs more hardware than a typical Docker stack. Minimum: 8 CPU cores, 24 GB RAM, SSD. Recommended for production: 16+ cores, 32+ GB RAM. Full packet capture at 1 Gbps generates roughly 10 TB/day of storage, so plan accordingly.
git clone https://github.com/cisagov/Malcolm
cd Malcolm
./scripts/install.py
docker compose up -d
The install script walks through configuration (network interfaces, retention policies, authentication). First-time setup takes about an hour including download of container images. The web interface is available at https://localhost once all containers are healthy.
The learning curve is real — you're operating Suricata, Zeek, Arkime, and OpenSearch simultaneously. Malcolm preconfigures the integration plumbing, but understanding what each component does and how to tune it still takes time. Budget a week to get comfortable with the interface and start writing useful queries.
Malcolm embeds Suricata as its signature-based detection engine, running it in IDS mode against live traffic or uploaded PCAPs and indexing all alerts into OpenSearch.
Malcolm's OpenSearch data can be visualized in Grafana as an alternative to OpenSearch Dashboards, integrating OT security alerts into existing plant monitoring dashboards.