CIS Suricata IDS/IPS Benchmark

Security configuration benchmark for Suricata intrusion detection and prevention system

v1.0.0 03-2025

Overview

▶

This benchmark provides prescriptive guidance for establishing a secure configuration posture for Suricata IDS/IPS. It covers IPS mode activation, rule management, EVE JSON logging, protocol analysis, network variable definitions, stream engine tuning, and operational best practices.

14Recommendations
7Sections
2Profile Levels
SectionAreaFocus
1Installation & PermissionsProcess user, file ownership and permissions
2Detection & RulesIPS mode, rule sources, automatic updates
3Logging & OutputEVE JSON logging, log rotation
4Protocol AnalysisTLS/JA3, HTTP, DNS, SSH protocol detection
5Network VariablesHOME_NET definition, community-id correlation
6Engine TuningStream reassembly, defragmentation, memory caps
7Maintenance & OperationsVersion updates, live rule reloading

Profile Definitions

▶
ProfileDescriptionIntended Use
L1Level 1 — StandardEssential security for all Suricata deployments; minimal performance impact.
L2Level 2 — HardenedAdvanced hardening for PCI-DSS, HIPAA, or high-security environments.

1 — Installation & Permissions

▶

1.1 Process & File Security

▶
1.1.1 Ensure Suricata runs as a non-root user (Automated)
L1 Auto
Description

This recommendation verifies that Suricata runs as a non-root user on the Suricata intrusion detection/prevention system. Implementing this control strengthens the overall security configuration and reduces exposure to potential threats.

Rationale

Failure to implement this control may leave the Suricata intrusion detection/prevention system vulnerable to attack or non-compliant with organizational security policies. This control helps establish a consistent, hardened configuration baseline.

Audit
# Verify Suricata runs as non-root
ps -eo user,pid,comm | grep suricata
grep -E '^run-as' /etc/suricata/suricata.yaml
Remediation
# Configure Suricata to run as non-root
# In suricata.yaml:
# run-as:
#   user: suricata
#   group: suricata
useradd -r -s /usr/sbin/nologin suricata
chown -R suricata:suricata /var/log/suricata /var/lib/suricata
1.1.2 Ensure configuration file permissions are restricted (Automated)
L1 Auto
Description

This setting ensures that configuration file permissions are restricted on the Suricata intrusion detection/prevention system. Restricting this capability limits potential abuse and enforces the principle of least privilege across the environment.

Rationale

Unrestricted access to this capability could allow unauthorized users or processes to perform actions beyond their intended scope. Applying least-privilege principles to the Suricata intrusion detection/prevention system is essential for defense in depth.

Audit
# Check configuration file permissions
stat -c '%a %U %G' /etc/suricata/suricata.yaml
find /etc/suricata -type f -exec stat -c '%a %n' {} \;
Remediation
# Restrict configuration permissions
chmod 640 /etc/suricata/suricata.yaml
chown root:suricata /etc/suricata/suricata.yaml
chmod 750 /etc/suricata/

2 — Detection & Rules

▶

2.1 IPS Mode & Rule Management

▶
2.1.1 Ensure IPS mode is enabled (Automated)
L2 Auto
Description

This recommendation verifies that IPS mode is enabled on the Suricata intrusion detection/prevention system. Implementing this control strengthens the overall security configuration and reduces exposure to potential threats.

Rationale

Failure to implement this control may leave the Suricata intrusion detection/prevention system vulnerable to attack or non-compliant with organizational security policies. This control helps establish a consistent, hardened configuration baseline.

Audit
# Verify IPS mode is enabled
grep -A 5 'af-packet\|nfqueue\|ips-mode' /etc/suricata/suricata.yaml | head -20
suricata --build-info | grep NFQueue
Remediation
# Enable IPS mode with NFQueue
# In suricata.yaml:
# nfqueue:
#   mode: repeat
#   repeat-mark: 1
#   repeat-mask: 1
# Add iptables rules:
iptables -I FORWARD -j NFQUEUE --queue-num 0
iptables -I INPUT -j NFQUEUE --queue-num 0
2.1.2 Ensure rule sources are configured and auto-updated (Automated)
L1 Auto
Description

This recommendation verifies that rule sources are configured and auto-updated on the Suricata intrusion detection/prevention system. Implementing this control strengthens the overall security configuration and reduces exposure to potential threats.

Rationale

Failure to implement this control may leave the Suricata intrusion detection/prevention system vulnerable to attack or non-compliant with organizational security policies. This control helps establish a consistent, hardened configuration baseline.

Audit
# Check rule sources and update configuration
suricata-update list-sources
ls -la /var/lib/suricata/rules/
grep 'default-rule-path' /etc/suricata/suricata.yaml
Remediation
# Configure rule sources and auto-update
suricata-update enable-source et/open
suricata-update enable-source oisf/trafficid
suricata-update
# Add cron for automatic updates:
# 0 3 * * * suricata-update && suricatasc -c reload-rules

3 — Logging & Output

▶

3.1 EVE JSON & Rotation

▶
3.1.1 Ensure EVE JSON logging is enabled with all event types (Automated)
L1 Auto
Description

This recommendation verifies that EVE JSON logging is enabled with all event types on the Suricata intrusion detection/prevention system. Implementing this control strengthens the overall security configuration and reduces exposure to potential threats.

Rationale

Failure to implement this control may leave the Suricata intrusion detection/prevention system vulnerable to attack or non-compliant with organizational security policies. This control helps establish a consistent, hardened configuration baseline.

Audit
# Verify EVE JSON logging is enabled
grep -A 20 'eve-log:' /etc/suricata/suricata.yaml | head -30
Remediation
# Enable EVE JSON logging
# In suricata.yaml:
# outputs:
#   - eve-log:
#       enabled: yes
#       filetype: regular
#       filename: eve.json
#       types:
#         - alert
#         - http
#         - dns
#         - tls
#         - files
#         - flow
3.1.2 Ensure log rotation is configured (Automated)
L1 Auto
Description

This recommendation verifies that log rotation is configured on the Suricata intrusion detection/prevention system. Implementing this control strengthens the overall security configuration and reduces exposure to potential threats.

Rationale

Failure to implement this control may leave the Suricata intrusion detection/prevention system vulnerable to attack or non-compliant with organizational security policies. This control helps establish a consistent, hardened configuration baseline.

Audit
# Check log rotation configuration
cat /etc/logrotate.d/suricata
ls -la /var/log/suricata/
Remediation
# Configure log rotation
cat > /etc/logrotate.d/suricata <<'EOF'
/var/log/suricata/*.log /var/log/suricata/*.json {
    daily
    rotate 30
    compress
    delaycompress
    missingok
    notifempty
    postrotate
        systemctl reload suricata
    endscript
}
EOF

4 — Protocol Analysis

▶

4.1 Application Layer Detection

▶
4.1.1 Ensure TLS inspection with JA3 fingerprinting is enabled (Automated)
L1 Auto
Description

This recommendation verifies that TLS inspection with JA3 fingerprinting is enabled on the Suricata intrusion detection/prevention system. Implementing this control strengthens the overall security configuration and reduces exposure to potential threats.

Rationale

Failure to implement this control may leave the Suricata intrusion detection/prevention system vulnerable to attack or non-compliant with organizational security policies. This control helps establish a consistent, hardened configuration baseline.

Audit
# Verify TLS inspection settings
grep -A 15 'app-layer:' /etc/suricata/suricata.yaml | grep -A 10 'tls:'
Remediation
# Configure TLS protocol detection
# In suricata.yaml:
# app-layer:
#   protocols:
#     tls:
#       enabled: yes
#       detection-ports:
#         dp: 443
#       ja3-fingerprints: auto
4.1.2 Ensure critical protocol parsers are enabled (Automated)
L1 Auto
Description

This recommendation verifies that critical protocol parsers are enabled on the Suricata intrusion detection/prevention system. Implementing this control strengthens the overall security configuration and reduces exposure to potential threats.

Rationale

Failure to implement this control may leave the Suricata intrusion detection/prevention system vulnerable to attack or non-compliant with organizational security policies. This control helps establish a consistent, hardened configuration baseline.

Audit
# Check protocol detection settings
grep -A 30 'app-layer:' /etc/suricata/suricata.yaml | grep -E 'enabled|detection-ports'
Remediation
# Enable critical protocol parsers
# In suricata.yaml under app-layer.protocols:
# http:
#   enabled: yes
# dns:
#   enabled: yes
# smtp:
#   enabled: yes
# ssh:
#   enabled: yes
# ftp:
#   enabled: yes

5 — Network Variables

▶

5.1 Address Groups & Correlation

▶
5.1.1 Ensure HOME_NET is properly defined (Automated)
L1 Auto
Description

This recommendation verifies that HOME_NET is properly defined on the Suricata intrusion detection/prevention system. Implementing this control strengthens the overall security configuration and reduces exposure to potential threats.

Rationale

Failure to implement this control may leave the Suricata intrusion detection/prevention system vulnerable to attack or non-compliant with organizational security policies. This control helps establish a consistent, hardened configuration baseline.

Audit
# Verify HOME_NET is properly defined
grep 'HOME_NET\|EXTERNAL_NET' /etc/suricata/suricata.yaml | head -5
Remediation
# Define HOME_NET accurately
# In suricata.yaml:
# vars:
#   address-groups:
#     HOME_NET: '[10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16]'
#     EXTERNAL_NET: '!$HOME_NET'
5.1.2 Ensure community-id is enabled for log correlation (Automated)
L1 Auto
Description

This recommendation verifies that community-id is enabled for log correlation on the Suricata intrusion detection/prevention system. Implementing this control strengthens the overall security configuration and reduces exposure to potential threats.

Rationale

Failure to implement this control may leave the Suricata intrusion detection/prevention system vulnerable to attack or non-compliant with organizational security policies. This control helps establish a consistent, hardened configuration baseline.

Audit
# Check if community-id is enabled for correlation
grep 'community-id' /etc/suricata/suricata.yaml
Remediation
# Enable community-id for log correlation
# In suricata.yaml:
# outputs:
#   - eve-log:
#       community-id: true
#       community-id-seed: 0

6 — Engine Tuning

▶

6.1 Stream & Defrag

▶
6.1.1 Ensure stream engine checksum validation is enabled (Automated)
L1 Auto
Description

This recommendation verifies that stream engine checksum validation is enabled on the Suricata intrusion detection/prevention system. Implementing this control strengthens the overall security configuration and reduces exposure to potential threats.

Rationale

Failure to implement this control may leave the Suricata intrusion detection/prevention system vulnerable to attack or non-compliant with organizational security policies. This control helps establish a consistent, hardened configuration baseline.

Audit
# Verify stream engine settings
grep -A 20 'stream:' /etc/suricata/suricata.yaml | head -25
Remediation
# Configure stream engine for security
# In suricata.yaml:
# stream:
#   memcap: 256mb
#   checksum-validation: yes
#   reassembly:
#     memcap: 512mb
#     depth: 1mb
#     toserver-chunk-size: 2560
#     toclient-chunk-size: 2560
6.1.2 Ensure defrag engine is properly configured (Automated)
L2 Auto
Description

This recommendation verifies that defrag engine is properly configured on the Suricata intrusion detection/prevention system. Implementing this control strengthens the overall security configuration and reduces exposure to potential threats.

Rationale

Failure to implement this control may leave the Suricata intrusion detection/prevention system vulnerable to attack or non-compliant with organizational security policies. This control helps establish a consistent, hardened configuration baseline.

Audit
# Check defrag engine settings
grep -A 10 'defrag:' /etc/suricata/suricata.yaml
Remediation
# Configure defrag engine
# In suricata.yaml:
# defrag:
#   memcap: 64mb
#   hash-size: 65536
#   trackers: 65535
#   max-frags: 65535
#   prealloc: yes
#   timeout: 60

7 — Maintenance & Operations

▶

7.1 Updates & Reloading

▶
7.1.1 Ensure Suricata is running the latest stable version (Manual)
L1 Manual
Description

This recommendation verifies that Suricata is running the latest stable version on the Suricata intrusion detection/prevention system. Implementing this control strengthens the overall security configuration and reduces exposure to potential threats.

Rationale

Failure to implement this control may leave the Suricata intrusion detection/prevention system vulnerable to attack or non-compliant with organizational security policies. This control helps establish a consistent, hardened configuration baseline.

Audit
# Check Suricata version
suricata --build-info | head -5
suricata -V
Remediation
# Update Suricata to latest stable
apt-get update && apt-get install --only-upgrade suricata
# Or from PPA:
add-apt-repository ppa:oisf/suricata-stable
apt-get update && apt-get install suricata
7.1.2 Ensure live rule reloading is configured (Automated)
L1 Auto
Description

This recommendation verifies that live rule reloading is configured on the Suricata intrusion detection/prevention system. Implementing this control strengthens the overall security configuration and reduces exposure to potential threats.

Rationale

Failure to implement this control may leave the Suricata intrusion detection/prevention system vulnerable to attack or non-compliant with organizational security policies. This control helps establish a consistent, hardened configuration baseline.

Audit
# Verify rule reload without restart
suricatasc -c reload-rules
suricatasc -c uptime
Remediation
# Configure live rule reloading
# Ensure unix-command socket is enabled:
# In suricata.yaml:
# unix-command:
#   enabled: yes
#   filename: /var/run/suricata/suricata-command.socket
# Reload rules without restart:
suricatasc -c reload-rules