A powerful, easily deployable network traffic analysis tool suite for network security monitoring
This document outlines how to install Malcolm and Hedgehog Linux using the projectβs installer ISOs. These instructions apply to installing this software both on a βbare metalβ system or in a virtual machine environment using VMware, VirtualBox, QEMU/KVM, etc.
The Malcolm and Hedgehog Linux installers as described in these instructions are intended to be used to replace the existing operating system (if any) of the respective systems onto which they are installed; and, as such, are designed to require as little user input as possible. For this reason, there are NO user prompts or confirmations about partitioning and reformatting hard disks for use by the operating system. The installer assumes that all non-removable storage media (eg., SSD, HDD, NVMe, etc.) are available for use and βπππ will partition and format them without warning πππβ.
In contrast to using the ISO installer, Malcolm can also be installed on any x86-64 (also known as x64, x86_64, AMD64, and Intel 64) or AArch64 (also known as ARM64) platform capable of running Docker or Podman. See the installation example using Ubuntu 24.04 LTS for that method of installation and configuration, or Windows host system configuration and macOS host system configuration for those platforms.
Please see Downloading Malcolm for instructions on how to obtain the Malcolm and Hedgehog Linux installation ISOs.
As an alternative to the official release ISOs, instructions are provided for building the Malcolm installer ISO and Hedgehog Linux installer ISO (Malcolmβs dedicated network sensor appliance OS) from scratch.
Various methods can be used to write the contents of an installer ISO image to a USB flash drive. One simple free and open-source application for doing so is Etcher, which can be used on Windows, macOS, and Linux platforms.
Alternatively, instructions specific to a particular operating system may be found online (e.g., Arch Linux, Debian Linux, Ubuntu Linux).
Using one of these methods, write the Malcolm and Hedgehog Linux installer ISOs to two 8GB or larger USB flash drives, respectively.
Alternatively, the ISO images could be burned to writable optical media (e.g., DVDΒ±R). The Malcolm installer will likely need to be written to DVDΒ±R DL (βdual layerβ or βdouble layerβ) media as the image exceeds the 4.7 GB storage provided by standard DVDs.

Using Etcher on macOS

Using dd on Linux
The ISO installers are compatible with systems that support EFI-mode and legacy (BIOS) booting. The procedure for configuring a systemβs firmware to allow booting from USB or optical media varies from manufacturer to manufacturer. Manufacturers typically provide a βone-time bootβ menu upon a specific keypress (e.g., F12 for Dell, F9 for HP, etc.). If needed, consult the documentation provided by the hardware manufacturer on how to access the boot options menu and boot from the newly-burned USB flash media or DVDΒ±R.

An example of an EFI boot manager in QEMU

An example of a BIOS boot options menu in QEMU
Upon Booting the Malcolm installation ISO, users are presented with the following Boot menu. Use the arrow keys to select Install Malcolm, and press Enter.

The first screen of the installer
The next screen of the installer presents the following options relevant to installation:

The Install Malcolm menu
After users select the type of Malcolm install to perform, the installer will ask for several pieces of information prior to installing the Malcolm base operating system:
sudo group
After the passwords have been entered, the installer will proceed to format the system drive and install Malcolm.

At the end of the installation process, users will be prompted with a few self-explanatory yes/no questions:
Following these prompts, the installer will reboot and the Malcolm base operating system will boot.
The Malcolm installer does not require an Internet connection to complete successfully. If the installer prompts users to configure network connectivity, they may choose βdo not configure the network at this time.β
The Malcolm base operating system is a hardened Linux installation based on the current stable release of Debian running the XFCE desktop environment. The system has been preloaded with all of the components that make up Malcolm.
NetworkManager can be used to configure networking for Malcolm. NetworkManager can be configured by clicking the π§ (networked computers) icon in the system tray in the upper-right, or right-clicking the icon and selecting Edit Connectionsβ¦ to modify the properties of a given connection.
Display resolution should be detected and adjusted automatically. To make changes to display properties, click the Applications menu and select Settings β Display.
The panel bordering the top of the Malcolm desktop is home to a number of useful shortcuts:

The Malcolm base operating system does not use Dynamic Host Configuration Protocol (DHCP) to assign IP addresses to any ethernet interfaces by default. To configure DHCP for network interfaces intended for access and management, click the icon for the NetworkManager applet in the system tray and select Auto Ethernet:

Alternatively, to configure a network interface with a static IP address (recommended):



eth0, enp1s0, etc.) on

All network interfaces intended for capture only should have their method set to Disabled under the IPv4 Settings tab:

If users wish to change Malcolmβs hostname or configure system time synchronization, they can open a terminal (the icon immediately to the right of the Applications menu icon at the top of the Malcolm desktop) and run system-quickstart then enter the user (if the user is part of the sudo group) or root password.
Here users can configure Malcolm to keep its time synchronized with either an NTP server (using the NTP protocol), another Malcolm aggregator or another HTTP/HTTPS server. On the next dialog, choose the time synchronization method to configure.

If htpdate is selected, users will be prompted to enter the URL of an HTTP/HTTPS server (for another Malcolm instance, either port 443 or port 9200 over https may be used) and the time synchronization check frequency in minutes. A test connection will be made to determine if the time can be retrieved from the server.

If ntpdate is selected, users will be prompted to enter the IP address or hostname of the NTP server.

Upon configuring time synchronization, a βTime synchronization configured successfully!β message will be displayed, after which users will be returned to the welcome screen. Select Cancel.
This same utility can be used to enable SSH password authentication. (Caution: password authentication is less secure than public/private key pairs.)
The first time the Malcolm base operating system boots the Malcolm Configuration wizard will start automatically. This same configuration script can be run again later by running ./scripts/configure from the Malcolm installation directory, or clicking the Configure Malcolm π³ icon in the top panel.

The configuration scriptβs dialog- and terminal-based user interfaces identical configuration workflows with only slightly different presentations. This document will use the terminal-based (βTUIβ) interface, which can be forced by running install.py with the --tui flag, as opposed to the dialog-based (βDUIβ) interface, which can be forced with the --dui flag.
Users will first be presented with a Malcolm logo splash screen unless the --skip-splash flag is specified.
user@host:~/Malcolm$ ./scripts/configure
Welcome To
ββββββ ββββββ βββββ ββββ ββββββββββββββ βββββ ββββ ββββββ ββββββ
ββββββββ ββββββ βββββββββ βββββ ββββββββββββββββ βββ ββ βββββ ββββββββ ββββββ
ββββββββββββββ βββ βββββ ββββ ββββ ββ βββββββββ ββββ ββββββββββββββ
βββββββββ ββββ βββββββββββββ ββββ ββββ ββββ ββββ ββββ βββββββββ ββββ
ββββ βββ ββββ ββββββββββββββ ββββ ββββ ββββ ββββ ββββ ββββ βββ ββββ
ββββ ββββ ββββ ββββ ββββ ββββ β βββββββ ββββ ββββ ββββ
ββββ ββββ ββββ ββββ ββββ ββββ ββ ββββββ ββ ββββ ββββ ββββ
βββββ βββββ βββββ βββββ ββββββββββββββ ββββββββββββββ βββββββ ββββββββββββββ βββββ βββββ
βββββ βββββ βββββ βββββ ββββββββββββββ ββββββββββββββ βββββ ββββββββββββββ βββββ βββββ
v25.12.0. Press any key to continue...
The items in the Malcolm Configuration Menu are arranged hierarchically, with the current setting displayed next to each option. For the most part, each option in the menu corresponds to an environment variable stored in the ./config directory, used by Malcolm to determine runtime behavior.
--- Malcolm Configuration Menu ---
Select an item number to configure, or an action:
βββ 1. Container Runtime (current: docker)
β βββ 2. Container Network Name (current: empty)
β βββ 3. Malcolm Restart Policy (current: No)
β βββ 4. Process Group ID (current: 1000)
β βββ 5. Process User ID (current: 1000)
βββ 6. Run Profile (current: malcolm)
β βββ 7. Dark Mode for Dashboards (current: Yes)
β βββ 8. Extra Tags (current: [])
β βββ 9. Forward AIDE Results (current: No)
β βββ 10. Forward Audit Log (current: No)
β βββ 11. Forward CPU Utilization (current: No)
β βββ 12. Forward Disk Operation Statistics (current: No)
β βββ 13. Forward Disk Utilization (current: No)
β βββ 14. Forward Kernel Messages (current: No)
β βββ 15. Forward Logs to Remote Secondary Store (current: No)
β βββ 16. Forward Memory Utilization (current: No)
β βββ 17. Forward Network Activity (current: No)
β βββ 18. Forward Systemd Journal Logs (current: No)
β βββ 19. Forward Thermal Readings (current: No)
β βββ 20. Logstash Memory (current: 3g)
β βββ 21. Logstash Workers (current: 3)
β βββ 22. OpenSearch Memory (current: 24g)
β βββ 23. Primary Document Store (current: opensearch-local)
βββ 24. Require HTTPS Connections (current: No)
βββ 25. IPv4 for nginx Resolver Directive (current: Yes)
βββ 26. IPv6 for nginx Resolver Directive (current: No)
βββ 27. Traefik Labels (current: No)
βββ 28. Use Default Storage Location (current: Yes)
βββ 29. Clean Up Artifacts (current: Yes)
β βββ 30. Delete Old Indices (current: Yes)
β β βββ 31. Index Prune Threshold (current: 1T)
β β βββ 32. Prune Indices by Name (current: No)
β βββ 33. Delete Old PCAP (current: Yes)
β βββ 34. Delete PCAP Threshold (current: 5%)
βββ 35. Enable Arkime Index Management (current: No)
βββ 36. Enable Arkime Analysis (current: Yes)
β βββ 37. Allow Arkime WISE Configuration (current: No)
β βββ 38. Enable Arkime WISE (current: Yes)
βββ 39. Enable Suricata Analysis (current: Yes)
β βββ 40. Enable Suricata Rule Updates (current: Yes)
βββ 41. Enable Zeek Analysis (current: Yes)
β βββ 42. Enable Zeek File Extraction (current: Yes)
β β βββ 43. File Extraction Mode (current: interesting)
β β βββ 44. Extracted File Percent Threshold (current: 0)
β β βββ 45. Extracted File Size Threshold (current: 100G)
β β βββ 46. File Preservation (current: quarantined)
β β βββ 47. Preserved Files HTTP Server (current: Yes)
β β β βββ 48. Downloaded Preserved File Password (current: ********)
β β β βββ 49. Zip Downloads (current: Yes)
β β βββ 50. Scan with capa (current: Yes)
β β βββ 51. Scan with ClamAV (current: Yes)
β β βββ 52. Scan with YARA (current: Yes)
β β βββ 53. Update Scan Rules (current: Yes)
β β βββ 54. VirusTotal API Key (current: empty)
β βββ 55. Enable Zeek ICS/OT Analyzers (current: Yes)
β β βββ 56. Enable Zeek ICS "Best Guess" (current: Yes)
β βββ 57. Use Threat Feeds for Zeek Intelligence (current: Yes)
β βββ 58. Cron Expression for Threat Feed Updates (current: 0 0 * * *)
β βββ 59. Intel::item_expiration Timeout (current: -1min)
β βββ 60. Pull Threat Intelligence Feeds on Startup (current: Yes)
β βββ 61. Threat Indicator "Since" Period (current: 7 days ago)
βββ 62. Enrich with Reverse DNS Lookups (current: Yes)
βββ 63. Enrich with Manufacturer (OUI) Lookups (current: Yes)
βββ 64. Enrich with Frequency Scoring (current: Yes)
βββ 65. NetBox Mode (current: Local)
β βββ 66. Auto-Create Subnet Prefixes (current: Yes)
β βββ 67. Auto-Populate NetBox Inventory (current: Yes)
β βββ 68. NetBox Enrichment (current: Yes)
β βββ 69. NetBox IP Autopopulation Filter (current: empty)
β βββ 70. NetBox Site Name (current: Malcolm)
βββ 71. Expose Malcolm Service Ports (current: Yes)
βββ 72. Network Traffic Node Name (current: host)
βββ 73. Capture Live Network Traffic (current: Yes)
βββ 74. Analyze Live Traffic with Suricata (current: Yes)
βββ 75. Analyze Live Traffic with Zeek (current: Yes)
βββ 76. Capture Filter (current: empty)
βββ 77. Capture Interface(s) (current: eth0)
βββ 78. Capture Live Traffic with netsniff-ng (current: Yes)
βββ 79. Capture Live Traffic with tcpdump (current: No)
βββ 80. Gather Traffic Capture Statistics (current: Yes)
βββ 81. Optimize Interface Settings for Capture (current: Yes)
--- Actions ---
s. Save and Continue Installation
w. Where Is...? (search for settings)
x. Exit Installer
---------------------------------
Enter item number or action:
For some settings, additional sub-items will become available when that setting is enabled. For example, enabling Zeek File Extraction exposes the settings related to that feature:
β¦
βββ 23. Enable Zeek Analysis (current: Yes)
β βββ 24. Enable Zeek File Extraction (current: No)
β βββ 25. Enable Zeek ICS/OT Analyzers (current: No)
β¦
Enter item number or action: 24
Enable Zeek File Extraction (current: No)
Enable file extraction with Zeek? (y / N): Y
β¦
βββ 23. Enable Zeek Analysis (current: Yes)
β βββ 24. Enable Zeek File Extraction (current: Yes)
β β βββ 25. File Extraction Mode (current: interesting)
β β βββ 26. Extracted File Percent Threshold (current: 0)
β β βββ 27. Extracted File Size Threshold (current: empty)
β β βββ 28. File Preservation (current: quarantined)
β β βββ 29. Preserved Files HTTP Server (current: Yes)
β β β βββ 30. Downloaded Preserved File Password (current: empty)
β β β βββ 31. Zip Downloads (current: No)
β β βββ 32. Scan with capa (current: Yes)
β β βββ 33. Scan with ClamAV (current: Yes)
β β βββ 34. Scan with YARA (current: Yes)
β β βββ 35. Update Scan Rules (current: Yes)
β β βββ 36. VirusTotal API Key (current: empty)
β βββ 37. Enable Zeek ICS/OT Analyzers (current: No)
β¦
Enter item number or action: 25
File Extraction Mode (current: interesting)
1: none
2: known
3: mapped
4: all
5: interesting
6: notcommtxt
Enter choice number (interesting): 4
β¦
Once the desired Malcolm configuration options have been selected, select s to save the settings and proceed to the final configuration summary for confirmation. Then, select y to write the changed configuration to the corresponding environment variable files.
β¦
--- Actions ---
s. Save and Continue
w. Where Is...? (search for settings)
x. Exit Installer
---------------------------------
Enter item number or action: s
============================================================
FINAL CONFIGURATION SUMMARY
============================================================
Configuration Only : Yes
Configuration Directory : /home/user/Malcolm/config
Container Runtime : docker
Run Profile : malcolm
Process UID/GID : 1000/1000
Container Restart Policy : unless-stopped
Container Network : default
Default Storage Locations : Yes
HTTPS/SSL : Yes
Node Name : host
============================================================
Proceed with Malcolm installation using the above configuration? (y / N): y
no - do not automatically restart the containeron-failure - restart the container if it exits due to an error, which manifests as a non-zero exit codealways - always restart the container if it stopsunless-stopped - similar to always, except that when the container is stopped (manually or otherwise), it is not restarted even after Docker daemon restarts; this is usually a good choiceroot user by default. For better security, Malcolm immediately drops to non-privileged user accounts for executing internal processes wherever possible. The PUID (process user ID) and PGID (process group ID) environment variables allow Malcolm to map internal non-privileged user accounts to a corresponding user account on the host.malcolm profile runs all containers including those for log enrichment and indexing, while the hedgehog profile (named as a nod to Hedgehog Linux, Malcolmβs dedicated network sensor OS) runs only the containers required for live traffic analysis. When using the hedgehog profile, captured network artifacts must be forwarded to another Malcolm instance: its OpenSearch instance connection parameters (e.g., https://192.168.122.5:9200) and Logstash connection parameters (e.g., 192.168.122.5:5044) must be specified later on in the configuration. See idaholab/Malcolm#254 for the origin of this feature.tags field for logs processed by Malcolm. These tags may make it easier to identify or search for data during analysis.opensearch-remote vs elasticsearch-remote) and URL.opensearch-local (for Malcolm to maintain its own OpenSearch instance), opensearch-remote, or elasticsearch-remote. In the case of the -remote options, the user can also specify the corresponding URL for the remote instance.logstash container. The default is calculated based on the number of logical CPUs the system has. See Tuning and Profiling Logstash Performance, logstash.yml and Multiple Pipelines.nginx.env configuration file.500) or a percentage (e.g., 10%)arkime-history indices.arkime-history) indices in a warm index. This requires additional configuration as demonstrated in the Arkime documentation.none: no file extractioninteresting: extraction of files with mime types of common attack vectorsmapped: extraction of files with recognized mime typesknown: extraction of files for which any mime type can be determinedall: extract all filesnotcommtxt: extract all files except common plain text filesquarantined: preserve only flagged files in ./zeek-logs/extract_files/quarantineall: preserve flagged files in ./zeek-logs/extract_files/quarantine and all other extracted files in ./zeek-logs/extract_files/preservednone: preserve no extracted filesopenssl enc-compatible format (e.g., openssl enc -aes-256-cbc -d -in example.exe.encrypted -out example.exe).cronexpr-compatible syntax) indicating the refresh interval for generating the Zeek Intelligence Framework files.Intel::item_expiration Timeout
Intel::item_expiration timeout as used by the Zeek Intelligence Framework (default -1min, which disables item expiration).zeek-offline container starts up.01/01/2025) or relative interval (24 hours ago). Note that this value can be overridden per-feed by adding a since: value to each feedβs respective configuration YAML file.freq. Users probably want to select Y for this setting.local (use an embedded instance NetBox maintained by Malcolm), remote (use a remote instance of NetBox), or disabled (do not use NetBox).json and raw; users probably want to choose json.message, to match the field name specified above.message.miscbeat._malcolm_beats, which is used by Malcolm to recognize and parse metrics sent from Hedgehog Linux.0 to disable that listener. Other options for configuring how Malcolm accepts and processes syslog messages can be configured via environment variables in filebeat.env.not port 5044 and not port 5045 and not port 8005 and not port 8006 and not port 9200.enp0s25 or enp10s0,enp11s0).capture tool monitor live traffic on the network interface without using netsniff-ng or tcpdump to generate intermediate PCAP files. See Live Analysis for more information. If the sensor is capturing locally but not forwarding to a Malcolm aggregator, use netsniff-ng or tcpdump instead.ethtool to disable NIC hardware offloading features and adjust ring buffer sizes for capture interface(s) to improve performance; this should be enabled if the interface(s) are being used for capture only, otherwise select N. If unsure, users should probably answer N.Once the configuration questions have been completed as described above, users can click the βplayβ icon (β·) in the panel at the top of the desktop to start Malcolm. As authentication has not yet been configured, users will be prompted to do so. This authentication setup can be run again later by running ./scripts/auth_setup from the Malcolm installation directory.

The Configure Authentication dialog
As this is the first time setting up authentication, ensure the all option is selected and press OK.
Users will be prompted to do the following:
passwordSecret value in Arkimeβs config.ini file. Arkime uses this value to secure communication (specifically, the connection used when Arkime viewer retrieves a PCAP payload for display in its user interface) between Arkime viewers in instances of Malcolm and Hedgehog Linux. In other words, this value needs to be the same for the Malcolm instance and all of the instances of Hedgehog Linux forwarding Arkime sessions to that Malcolm instance. The corresponding value should be provided when running auth_setup on the Hedgehog Linux sensor.auth_setup operation below. After that process is complete, users may press OK and Malcolm will continue to start up.
As of Malcolm v25.12.0, the same base operating system is used for both Malcolm and Hedgehog Linux. All of the sections above under Malcolm Installation and Configuration also apply to Hedgehog Linux.
The following section outlines the Hedgehog-specific steps needed to establish communication between the Hedgehog Linux sensor and the Malcolm aggregator.
Follow the Malcolm guidelines above for Configuring Network Interfaces and Configuring Hostname, Time Sync, and SSH Access.
The first time Hedgehog Linux boots the Malcolm Configuration wizard will start automatically. This same configuration script can be run again later by running ./scripts/configure from the Malcolm installation directory, or clicking the Configure Malcolm π³ icon in the top panel.
The sections above for Configuring Malcolm and the Malcolm Configuration Menu Items are applicable for Hedgehog Linux, with the following notable exceptions:
opensearch-remote or elasticsearch-remote) of the Malcolm aggregatorhttps://malcolm.example.org:9200 or https://service.whatever.org/elasticsearch/):), and the Logstash port (5044). If the sensor is capturing locally but not forwarding to a Malcolm aggregator, explicitly set this to disabled.disabled.8005/tcp) for display in Arkime viewer and for downloading files (over port 8006/tcp) extracted and preserved by Zeek. Minimally, this list should include the IP address of the Malcolm aggregator. This is only automatically populated from Remote Malcolm Hostname or IP if its value is an IP address.--- Malcolm Configuration Menu ---
β¦
β βββ 18. Logstash Host (current: malcolm.home.arpa:5044)
β βββ 19. Malcolm Reachback ACL (current: ['192.168.122.1', '192.168.122.5', '10.9.0.215'])
β βββ 20. Primary Document Store (current: opensearch-remote)
β βββ 21. Primary OpenSearch/Elasticsearch URL (current: https://malcolm.home.arpa:9200)
β¦
βββ 30. Enable Arkime Analysis (current: Yes)
β βββ 31. Arkime WISE URL (current: https://malcolm.home.arpa/wise/)
β¦
βββ 55. NetBox Mode (current: Remote)
β βββ 56. NetBox Site Name (current: Remote Site ABC)
β¦
--- Malcolm Configuration Menu ---
β¦
βββ 6. Run Profile (current: hedgehog)
β¦
β βββ 8. Forward AIDE Results (current: Yes)
β βββ 9. Forward Audit Log (current: Yes)
β βββ 10. Forward CPU Utilization (current: Yes)
β βββ 11. Forward Disk Operation Statistics (current: Yes)
β βββ 12. Forward Disk Utilization (current: Yes)
β βββ 13. Forward Kernel Messages (current: Yes)
β βββ 14. Forward Memory Utilization (current: Yes)
β βββ 15. Forward Network Activity (current: Yes)
β βββ 16. Forward Systemd Journal Logs (current: Yes)
β βββ 17. Forward Thermal Readings (current: Yes)
β¦
The auth_setup script on Hedgehog Linux has a Receive client certifictes from Malcolm option corresponding to Malcolmβs Transfer self-signed client certificates to a remote log forwarder option described above. In order for a Hedgehog Linux to securely communicate with Malcolm, it needs the client certificates generated when users answered Y to (Re)generate self-signed certificates for a remote log forwarder during that setup. Malcolm can facilitate the secure transfer of these to a sensor running Hedgehog.
Select Receive client certificates from Malcolm, then press OK when prompted βRun auth_setup on Malcolm and select βTransfer self-signed client certificatesβ¦ββ.


Return to the Malcolm instance where auth_setup is running (or re-run it if needed) and press OK. Users will see a message with the title ssl-client-transmit that looks like this:

Note Malcolmβs IP address (192.168.122.5 in the screenshot above) and the single-use code phrase (2033-inside-century-simon in the screenshot above) and enter them on the Hedgehog:

After a few seconds a progress bar will update and show the files have been 100% transfered. They are automatically saved into the ~/Malcolm/filebeat/certs directory on the sensor.

Once the has been completed, users can click the βplayβ icon (β·) in the panel at the top of the desktop to start Malcolm under the Hedgehog run profile.
The easiest way to verify network traffic is being captured by the sensor and forwarded to Malcolm is through Malcolmβs Arkime Sessions interface.
If logged into the Malcolm desktop environment, click the Arkime icon (π¦) in the top panel. If connecting from another browser, connect to **https://
As Malcolm is using self-signed TLS certificates, users will likely have to confirm a browser exception to allow the self-signed certificates to proceed. Enter the credentials specified during the configure authentication process.
Arkimeβs sessions view will be displayed. Filter on the node field to view records from a specific Hedgehog Linux sensor. In the search bar, enter node == hedgehoghostname (replacing hedgehoghostname with the hostname configured for Hedgehog Linux). See the Search Queries in Arkime and OpenSearch cheat sheet for more search syntax hints.

Arkimeβs sessions view with a filter on node
Arkimeβs views button (indicated by the eyeball π icon) allows overlaying additional previously-specified filters onto the current sessions filters. For convenience, Malcolm provides several Arkime preconfigured views including filtering on the event.provider and event.dataset fields. This can be combined with the node filter described above to verify different network log types (e.g., Arkime sessions, Zeek logs, Suricata alerts, etc.) are all being captured and forwarded correctly.
