This is a follow-up to my last post in which I set up Suricata as an IPS. This article demonstrates how to effectively work with the Suricata engine—specifically, how I analyze its log output, silence unnecessary alerts, and promote specific detection rules to prevention rules.
1. Performance and Rule Management Setup
LibTCMalloc Integration
To enhance Suricata’s performance and stability, I integrate Google’s TCMalloc library to achieve memory usage improvements.
- Install the library:
apt-get install libtcmalloc-minimal4
- Edit the Systemd service (
systemctl edit suricata
) to preload the library:
# /etc/systemd/system/suricata.service.d/override.conf
[Service]
Environment="LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libtcmalloc_minimal.so.4"
Rule Update Path Management
I correct the Debian setup where the default rule path conflicts with the update path. I align the configuration to use the dedicated data directory (/var/lib/suricata/rules
) for updates, simplifying maintenance.
- Edit /etc/suricata/suricata.yaml to point the default rule path:default-rule-path: /var/lib/suricata/rules
- I ensure that
update.yaml
is configured correctly, and remove all initial rules from /etc/suricata/rules
to avoid duplicate-rules
warnings.
2. Alert Analysis and Rule Tuning (Observability in Practice)
By default, Suricata operates as an IDS (Intrusion Detection System). The critical first step is analyzing the generated alerts (fast.log
) to separate actual threats from alert noise.
Initial Alert Frequency Analysis
The following command provides a crucial initial overview by counting unique alert messages and sorting them by frequency. This step is essential to understand the top sources of load and noise.
# awk '{$1=""; $2=""; $3=""}1' fast.log | sed 's_\[\*\*\].*__g' | sed 's_ group [0-9]*__g' | sort | uniq -c | sort -h
# Log Analysis (Excerpt showing frequency)
[..]
100 GPL RPC portmap listing UDP 111
103 SURICATA STREAM 3way handshake excessive different SYN/ACKs
176 ET SCAN Suspicious inbound to PostgreSQL port 5432
216 ET SCAN Suspicious inbound to mySQL port 3306
223 SURICATA UDPv4 invalid checksum
236 SURICATA STREAM Last ACK with wrong seq
241 GPL ICMP_INFO PING speedera
325 ET SCAN Suspicious inbound to MSSQL port 1433
...
12872 GPL ICMP_INFO PING *NIX
The Decision to Silence Noise
Alerts like the simple GPL ICMP_INFO PING *NIX
often provide no actionable security value and must be disabled to prevent log flooding. I disable logging of ping probes by identifying the specific Signature IDs (SIDs) and adding them to a custom disable.conf
file.
Code-Snippet
# /etc/suricata/disable.conf (Excerpt for ICMP PINGs)
# Disabled ping logging
2100366
...
2100480
3. Promotion to IPS: Hardening the Drop Policy
For the system to transition from passive detection to active prevention (IPS), specific detection rules must be promoted to drop rules.
I promote the ET DROP Dshield Block Listed Source
rule, as it targets known hostile IPs, by adding its SID to drop.conf
.
# /etc/suricata/drop.conf
# Rules matching SIDs in this file will be converted to drop rules.
2402000 # SID for 'ET DROP Dshield Block Listed Source'
After running suricata-update
, the engine confirms the change: -- Dropped 1 rules.
Verifying the Drop (Active Defense Check)
I verify the success of the active drop policy by specifically filtering for dropped packets in the logs.
# Command to output only dropped packets, showing the specific rule that triggered the block:
# awk '/Drop/{...}' fast.log | sort | uniq -c | sort -hr
# Example Output:
6505 IP dropped due to fail2ban detection
638 ET DROP Dshield Block Listed Source
4. Advanced Rule Tuning: Leveraging Variables and Custom Logic
My advice is to use the variables whenever possible. By ensuring that network variables ($HOME_NET
, $SMTP_SERVERS
, etc.) correctly reflect your environment, you maximize the accuracy of existing rules. This prevents false positives and improves performance.
Enhancing Accuracy with Custom Rules
It’s crucial not just to disable bad rules, but to write custom rules that leverage these network variables for precise defense.
Example: Traffic Segregation Rule
To save resources, I would write a custom rule that only inspects for a vulnerability (e.g., a specific HTTP exploit) when the traffic comes from the external network and is destined for the correct server type.
# Example: Only check for sensitive SQL traffic if it comes from the EXTERNAL net.
# This prevents wasting resources checking internal-to-internal traffic.
# alert tcp $EXTERNAL_NET any -> $SQL_SERVERS 3306 (msg:"ET Custom: External Access to SQL Port"; ...)
This ensures that network resources are conserved by avoiding redundant checks on internal traffic.
5. Modern Analysis: Migrating from Bash to Structured Data
While the Bash pipeline is functional, high-traffic environments quickly overwhelm it. For modern Observability and SecOps analysis, the logs must be processed as structured data.
Migrating to EVE JSON
Suricata can output events in the EVE JSON format, which is ideal for ingestion into systems like Elasticsearch (ELK) or Splunk. This eliminates the slow and unreliable Bash parsing of fast.log
.
Configuration Change (in suricata.yaml
):
To migrate from the legacy fast.log
format, you simply need to enable the EVE logger in your configuration.
# Output module setup in suricata.yaml
outputs:
- eve-log:
enabled: yes
file: eve.json
# Other settings (e.g., adding flow/metadata fields)
Python for High-Performance Analysis
Instead of relying on slow awk
and sed
pipelines, I recommend using Python for high-performance log analysis. Python’s built-in json
library is optimized to read and aggregate large eve.json
files far more efficiently. This elevates the analysis layer of the architecture to a production standard.
Sources / See Also
- Suricata Documentation. High-performance AF_PACKET IPS mode configuration and usage.
https://docs.suricata.io/en/latest/install/af-packet.html
- Suricata Documentation. Working with Suricata-Update (Ruleset Management).
https://suricata-update.readthedocs.io/en/latest/update.html
- Suricata Documentation. EVE JSON Output for Structured Logging.
https://docs.suricata.io/en/latest/output/eve/eve-json-format.html
- Google Development. Google Perftools (TCMalloc) Documentation.
https://github.com/google/gperftools
- Emerging Threats (Proofpoint). Information on the Emerging Threats Open Ruleset.
https://www.proofpoint.com/us/security-awareness/blog/emerging-threats
- Elastic Stack (ELK) Documentation for Log Analysis.
https://www.elastic.co/what-is/elk-stack
- Linux Manpage: ethtool (Network Offload Configuration).
https://man7.org/linux/man-pages/man8/ethtool.8.html