Contents
Suricata
SURICATA IDS/IPS is an open source IDS that monitors communications on the network and detects suspicious traffic.
The basic mechanism is signature-based, so it can detect predefined unauthorized communications. Suricata is also characterized by its ability to provide protection as well as detection.
1.advance preparation
①Activate the EPEL repository on your system
| 
					 1  | 
						# dnf -y install epel-release  | 
					
②System Update
| 
					 1  | 
						# dnf update -y  | 
					
2. Suricata Installation and Configuration
①Suricata install
| 
					 1 2 3 4 5  | 
						# dnf -y install suricata Check Version # suricata -V This is Suricata version 7.0.7 RELEASE  | 
					
②Determine interface and IP address where Suricata will inspect network packets
| 
					 1 2 3  | 
						# ip --brief add lo               UNKNOWN        127.0.0.1/8 ens160           UP             192.168.11.83/24  | 
					
③Edit configuration file
| 
					 1 2 3 4 5 6 7 8  | 
						# vi /etc/suricata/suricata.yaml # Line 15 : In the "vars" section, define the network HOME_NET: "[192.168.11.0/24]" # Per Line 622 : Set interface name in "af-packet" section af-packet:     - interface: ens160  | 
					
| 
					 1 2 3 4 5  | 
						# vi /etc/sysconfig/suricata # Line 8 :Specify interface # Add options to be passed to the daemon OPTIONS="-i ens160 --user suricata "  | 
					
④Suricata rules update
| 
					 1 2 3 4 5 6 7  | 
						# suricata-update ---------------------------------------------- 6/11/2024 -- 11:20:04 - <Info> -- Writing rules to /var/lib/suricata/rules/suricata.rules: total: 54040; enabled: 40395; added: 54040; removed 0; modified: 0 6/11/2024 -- 11:20:04 - <Info> -- Writing /var/lib/suricata/rules/classification.config 6/11/2024 -- 11:20:05 - <Info> -- Testing with suricata -T. 6/11/2024 -- 11:20:40 - <Info> -- Done.  | 
					
⑤Activate Suricata
| 
					 1 2  | 
						# systemctl enable --now suricata Created symlink /etc/systemd/system/multiuser.target.wants/suricata.service → /usr/lib/systemd/system/suricata.service.  | 
					
⑥Confirm Suricata startup
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19  | 
						# systemctl status suricata ● suricata.service - Suricata Intrusion Detection Service      Loaded: loaded (/usr/lib/systemd/system/suricata.service; enabled; preset: disabled)     Drop-In: /usr/lib/systemd/system/service.d              └─10-timeout-abort.conf      Active: active (running) since Wed 2024-11-06 11:21:12 JST; 9s ago  Invocation: 67e90c53b4a54a7bbef8d8cff8caa9e4        Docs: man:suricata(1)     Process: 5690 ExecStartPre=/bin/rm -f /var/run/suricata.pid (code=exited, status=0/SUCCESS)    Main PID: 5692 (Suricata-Main)       Tasks: 1 (limit: 4589)      Memory: 189.2M (peak: 189.4M)         CPU: 9.262s      CGroup: /system.slice/suricata.service              └─5692 /sbin/suricata -c /etc/suricata/suricata.yaml --pidfile /var/run/suricata.pid -i ens160> Nov 06 11:21:12 Lepard systemd[1]: Starting suricata.service - Suricata Intrusion Detection Service... Nov 06 11:21:12 Lepard systemd[1]: Started suricata.service - Suricata Intrusion Detection Service. Nov 06 11:21:12 Lepard suricata[5692]: i: suricata: This is Suricata version 7.0.7 RELEASE running in SYSTE>  | 
					
Check Log
| 
					 1 2 3 4 5 6 7 8 9 10 11  | 
						# tail /var/log/suricata/suricata.log [5692 - Suricata-Main] 2024-11-06 11:21:13 Info: conf: Running in live mode, activating unix socket [5692 - Suricata-Main] 2024-11-06 11:21:13 Info: logopenfile: fast output device (regular) initialized: fast.log [5692 - Suricata-Main] 2024-11-06 11:21:13 Info: logopenfile: eve-log output device (regular) initialized: eve.json [5692 - Suricata-Main] 2024-11-06 11:21:13 Info: logopenfile: stats output device (regular) initialized: stats.log [5692 - Suricata-Main] 2024-11-06 11:21:27 Info: detect: 1 rule files processed. 40395 rules successfully loaded, 0 rules failed, 0 [5692 - Suricata-Main] 2024-11-06 11:21:27 Info: threshold-config: Threshold config parsed: 0 rule(s) found [5692 - Suricata-Main] 2024-11-06 11:21:27 Info: detect: 40398 signatures processed. 1241 are IP-only rules, 4136 are inspecting packet payload, 34811 inspect application layer, 108 are decoder event only [5692 - Suricata-Main] 2024-11-06 11:21:50 Info: runmodes: ens160: creating 2 threads [5692 - Suricata-Main] 2024-11-06 11:21:50 Info: unix-manager: unix socket '/var/run/suricata/suricata-command.socket' [5692 - Suricata-Main] 2024-11-06 11:21:50 Notice: threads: Threads created -> W: 2 FM: 1 FR: 1   Engine started.  | 
					
Check the stats.log file for statistics (updated every 8 seconds by default)
| 
					 1  | 
						# tail -f /var/log/suricata/stats.log  | 
					
A more advanced output, EVE JSON, can be generated with the following command
| 
					 1  | 
						# tail -f /var/log/suricata/eve.json  | 
					
3. Suricata Testing
①Run ping test with curl utility
| 
					 1 2  | 
						# curl http://testmynids.org/uid/index.html uid=0(root) gid=0(root) groups=0(root)  | 
					
②Check the alert log to see if it has been logged
| 
					 1 2  | 
						# cat /var/log/suricata/fast.log 11/06/2024-11:26:37.715961  [**] [1:2100498:7] GPL ATTACK_RESPONSE id check returned root [**] [Classification: Potentially Bad Traffic] [Priority: 2] {TCP} 54.239.168.42:80 -> 192.168.11.83:51592  | 
					
4. Setting Suricata Rules
①Display of rule sets packaged in Suricata
| 
					 1 2 3 4 5 6  | 
						# ls -al /var/lib/suricata/rules/ total 31296 drwxr-s--- 2 root     suricata       57 Nov  6 11:20 . drwxrws--- 4 suricata suricata       33 Nov  6 11:20 .. -rw-r--r-- 1 root     suricata     3228 Nov  6 11:20 classification.config -rw-r--r-- 1 root     suricata 32041969 Nov  6 11:20 suricata.rules  | 
					
②Index list of sources providing rule sets
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99  | 
						# suricata-update list-sources Name: et/open   Vendor: Proofpoint   Summary: Emerging Threats Open Ruleset   License: MIT Name: et/pro   Vendor: Proofpoint   Summary: Emerging Threats Pro Ruleset   License: Commercial   Replaces: et/open   Parameters: secret-code   Subscription: https://www.proofpoint.com/us/threat-insight/et-pro-ruleset Name: etnetera/aggressive   Vendor: Etnetera a.s.   Summary: Etnetera aggressive IP blacklist   License: MIT Name: malsilo/win-malware   Vendor: malsilo   Summary: Commodity malware rules   License: MIT Name: oisf/trafficid   Vendor: OISF   Summary: Suricata Traffic ID ruleset   License: MIT Name: pawpatrules   Vendor: pawpatrules   Summary: PAW Patrules is a collection of rules for IDPS / NSM Suricata engine   License: CC-BY-SA-4.0 Name: scwx/enhanced   Vendor: Secureworks   Summary: Secureworks suricata-enhanced ruleset   License: Commercial   Parameters: secret-code   Subscription: https://www.secureworks.com/contact/ (Please reference CTU Countermeasures) Name: scwx/malware   Vendor: Secureworks   Summary: Secureworks suricata-malware ruleset   License: Commercial   Parameters: secret-code   Subscription: https://www.secureworks.com/contact/ (Please reference CTU Countermeasures) Name: scwx/security   Vendor: Secureworks   Summary: Secureworks suricata-security ruleset   License: Commercial   Parameters: secret-code   Subscription: https://www.secureworks.com/contact/ (Please reference CTU Countermeasures) Name: sslbl/ja3-fingerprints   Vendor: Abuse.ch   Summary: Abuse.ch Suricata JA3 Fingerprint Ruleset   License: Non-Commercial Name: sslbl/ssl-fp-blacklist   Vendor: Abuse.ch   Summary: Abuse.ch SSL Blacklist   License: Non-Commercial Name: stamus/lateral   Vendor: Stamus Networks   Summary: Lateral movement rules   License: GPL-3.0-only Name: stamus/nrd-14-open   Vendor: Stamus Networks   Summary: Newly Registered Domains Open only - 14 day list, complete   License: Commercial   Parameters: secret-code   Subscription: https://www.stamus-networks.com/stamus-labs/subscribe-to-threat-intel-feed Name: stamus/nrd-30-open   Vendor: Stamus Networks   Summary: Newly Registered Domains Open only - 30 day list, complete   License: Commercial   Parameters: secret-code   Subscription: https://www.stamus-networks.com/stamus-labs/subscribe-to-threat-intel-feed Name: stamus/nrd-entropy-14-open   Vendor: Stamus Networks   Summary: Newly Registered Domains Open only - 14 day list, high entropy   License: Commercial   Parameters: secret-code   Subscription: https://www.stamus-networks.com/stamus-labs/subscribe-to-threat-intel-feed Name: stamus/nrd-entropy-30-open   Vendor: Stamus Networks   Summary: Newly Registered Domains Open only - 30 day list, high entropy   License: Commercial   Parameters: secret-code   Subscription: https://www.stamus-networks.com/stamus-labs/subscribe-to-threat-intel-feed Name: stamus/nrd-phishing-14-open   Vendor: Stamus Networks   Summary: Newly Registered Domains Open only - 14 day list, phishing   License: Commercial   Parameters: secret-code   Subscription: https://www.stamus-networks.com/stamus-labs/subscribe-to-threat-intel-feed Name: stamus/nrd-phishing-30-open   Vendor: Stamus Networks   Summary: Newly Registered Domains Open only - 30 day list, phishing   License: Commercial   Parameters: secret-code   Subscription: https://www.stamus-networks.com/stamus-labs/subscribe-to-threat-intel-feed Name: tgreen/hunting   Vendor: tgreen   Summary: Threat hunting rules   License: GPLv3  | 
					
③Enable source (if tgreen/hunting is enabled)
| 
					 1 2 3 4 5 6 7 8 9 10  | 
						# suricata-update enable-source tgreen/hunting 6/11/2024 -- 11:31:54 - <Info> -- Using data-directory /var/lib/suricata. 6/11/2024 -- 11:31:54 - <Info> -- Using Suricata configuration /etc/suricata/suricata.yaml 6/11/2024 -- 11:31:54 - <Info> -- Using /usr/share/suricata/rules for Suricata provided rules. 6/11/2024 -- 11:31:54 - <Info> -- Found Suricata version 7.0.7 at /usr/sbin/suricata. 6/11/2024 -- 11:31:54 - <Warning> -- Source index does not exist, will use bundled one. 6/11/2024 -- 11:31:54 - <Warning> -- Please run suricata-update update-sources. 6/11/2024 -- 11:31:54 - <Info> -- Creating directory /var/lib/suricata/update/sources 6/11/2024 -- 11:31:54 - <Info> -- Enabling default source et/open 6/11/2024 -- 11:31:54 - <Info> -- Source tgreen/hunting enabled  | 
					
Perform update
| 
					 1  | 
						# suricata-update  | 
					
Restart Suricata service
| 
					 1  | 
						# systemctl restart suricata  | 
					
5. Creating Suricata Custom Rules
①Create files containing customer rules
| 
					 1 2 3  | 
						# vi /etc/suricata/rules/local.rules Include the following information alert icmp any any -> $HOME_NET any (msg:"ICMP Ping"; sid:1; rev:1;)  | 
					
②Edit configuration file (define new rule paths)
| 
					 1 2 3 4 5 6 7 8  | 
						# vi /etc/suricata/suricata.yaml # Added around line 2170 default-rule-path: /var/lib/suricata/rules rule-files:   - suricata.rules   - /etc/suricata/rules/local.rules  | 
					
③Testing the configuration file
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13  | 
						# suricata -T -c /etc/suricata/suricata.yaml -v Notice: suricata: This is Suricata version 7.0.7 RELEASE running in SYSTEM mode Info: cpu: CPUs/cores online: 2 Info: suricata: Running suricata under test mode Info: suricata: Setting engine mode to IDS mode by default Info: exception-policy: master exception-policy set to: auto Info: logopenfile: fast output device (regular) initialized: fast.log Info: logopenfile: eve-log output device (regular) initialized: eve.json Info: logopenfile: stats output device (regular) initialized: stats.log Info: detect: 2 rule files processed. 40639 rules successfully loaded, 0 rules failed, 0 Info: threshold-config: Threshold config parsed: 0 rule(s) found Info: detect: 40642 signatures processed. 1242 are IP-only rules, 4247 are inspecting packet payload, 34943 inspect application layer, 108 are decoder event only Notice: suricata: Configuration provided was successfully loaded. Exiting.  | 
					
Restart Suricat service
| 
					 1  | 
						# systemctl restart suricata  | 
					
④Testing the application of Custom Rules
Ping another device on the same local network to see if it was logged
| 
					 1 2 3 4  | 
						# cat /var/log/suricata/fast.log 11/06/2024-11:39:52.870863  [**] [1:1:1] ICMP Ping [**] [Classification: (null)] [Priority: 3] {ICMP} 192.168.11.45:8 -> 192.168.11.83:0 11/06/2024-11:39:52.870922  [**] [1:1:1] ICMP Ping [**] [Classification: (null)] [Priority: 3] {ICMP} 192.168.11.83:0 -> 192.168.11.45:0  | 
					
To get logs in JSON format, install jq on your system
| 
					 1  | 
						# dnf install jq  | 
					
| 
					 1  | 
						# systemctl restart suricata  | 
					
Execute the following command to ping another device on the same local network
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68  | 
						# tail -f /var/log/suricata/eve.json | jq 'select(.event_type=="alert")' When ping is executed, the following is displayed in the console {   "timestamp": "2024-11-06T11:49:41.028824+0900",   "flow_id": 1531173917804799,   "in_iface": "ens160",   "event_type": "alert",   "src_ip": "192.168.11.45",   "src_port": 0,   "dest_ip": "192.168.11.83",   "dest_port": 0,   "proto": "ICMP",   "icmp_type": 8,   "icmp_code": 0,   "pkt_src": "wire/pcap",   "alert": {     "action": "allowed",     "gid": 1,     "signature_id": 1,     "rev": 1,     "signature": "ICMP Ping",     "category": "",     "severity": 3   },   "direction": "to_server",   "flow": {     "pkts_toserver": 1,     "pkts_toclient": 0,     "bytes_toserver": 98,     "bytes_toclient": 0,     "start": "2024-11-06T11:49:41.028824+0900",     "src_ip": "192.168.11.45",     "dest_ip": "192.168.11.83"   } } {   "timestamp": "2024-11-06T11:49:41.028873+0900",   "flow_id": 1531173917804799,   "in_iface": "ens160",   "event_type": "alert",   "src_ip": "192.168.11.83",   "src_port": 0,   "dest_ip": "192.168.11.45",   "dest_port": 0,   "proto": "ICMP",   "icmp_type": 0,   "icmp_code": 0,   "pkt_src": "wire/pcap",   "alert": {     "action": "allowed",     "gid": 1,     "signature_id": 1,     "rev": 1,     "signature": "ICMP Ping",     "category": "",     "severity": 3   },   "direction": "to_client",   "flow": {     "pkts_toserver": 1,     "pkts_toclient": 1,     "bytes_toserver": 98,     "bytes_toclient": 98,     "start": "2024-11-06T11:49:41.028824+0900",     "src_ip": "192.168.11.45",     "dest_ip": "192.168.11.83"   } }  | 
					
