Suricata è un IPS (Intrusion Prevention System), un sistema per la prevenzione delle intrusioni in rete. Il software analizza tutto il traffico che attraversa il firewall alla ricerca di attacchi noti e anomalie.
Quando un attacco o un’anomalia sono stati rilevati, il sistema può decidere se bloccare il traffico o limitarsi a salvare l’evento sul log
In questo tutorial installeremo Suricata IDS insieme ad Elastic Stack su un server Ubuntu 22.04. I vari componenti dello stack sono:
Elasticsearch: per archiviare, indicizzare, correlare e ricercare gli eventi di sicurezza dal server.
Kibana: per visualizzare i log archiviati in Elasticsearch.
Filebeat: per analizzare il file di registro eve.json di Suricata e inviare ogni evento a Elasticsearch per l’elaborazione.
Suricata: per scansionare il traffico di rete alla ricerca di eventi sospetti ed eliminare i pacchetti non validi.
PREREQUISITI
Ubuntu Server 22.04 Installato
Password di root del server con accesso SSH attivo
AGGIORNAMENTO DEL SISTEMA
Prima di procedere con l’installazione di Suricata eseguire i comandi in sequenaza per l’aggiornamento del sistema:
0 1 2 |
sudo apt update sudo apt list --upgradable sudo apt upgrade |
Dopo aver effettuato l’aggiornamento installare tutte le dipendenze necessarie con i seguenti comandi:
0 1 2 |
sudo apt install libpcre2-dev libpcre3 libpcre3-dbg libpcre3-dev build-essential autoconf automake libtool libpcap-dev libnet1-dev libyaml-0-2 libyaml-dev zlib1g zlib1g-dev libcap-ng-dev libcap-ng0 make libmagic-dev libjansson-dev libjansson4 pkg-config libnspr4-dev libnss3-dev liblz4-dev rustc cargo python3-pip python3-distutils sudo apt install libnetfilter-queue-dev libnetfilter-queue1 libnfnetlink-dev libnfnetlink0 |
INSTALLAZIONE DI SURICATA
Prima di scaricare il pacchetto di installazione di Suricata andare sul sito ufficiale e verificare l’ultima versione
Individuare l’ultima versione stabile quindi cliccare sul pacchetto tar.gz con il tasto destro e copiare il link del download come mostrato nell’immagine sovrastante
ATTENZIONE: durante la stesura del seguente articolo l’ultima versione stabile di Suricata è la 7.0.2 del 19 Ottobre 2023
Dalla console SSH del server procedere al download del pacchetto di installazione con il comando:
0 |
wget https://www.openinfosecfoundation.org/download/suricata-7.0.2.tar.gz |
Dpo aver scaircato il file compresso scompattarlo con il seguente comando:
0 |
sudo tar xzf suricata-7.0.2.tar.gz |
Posizionarsi nella cartella appena scompattata con il comando:
0 |
cd suricata-7.0.2 |
Quindi avviare la configurazione con il comando:
0 |
./configure --enable-nfqueue --prefix=/usr --sysconfdir=/etc --localstatedir=/var |
Se è andato tutto a buon fine dovremmo vedere il seguente output:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Host: x86_64-pc-linux-gnu Compiler: gcc (exec name) / g++ (real) GCC Protect enabled: no GCC march native enabled: yes GCC Profile enabled: no Position Independent Executable enabled: no CFLAGS -g -O2 -fPIC -std=c11 -march=native -I${srcdir}/../rust/gen -I${srcdir}/../rust/dist PCAP_CFLAGS -I/usr/include SECCFLAGS To build and install run 'make' and 'make install'. You can run 'make install-conf' if you want to install initial configuration files to /etc/suricata/. Running 'make install-full' will install configuration and rules and provide you a ready-to-run suricata. To install Suricata into /usr/bin/suricata, have the config in /etc/suricata and use /var/log/suricata as log dir, use: ./configure --prefix=/usr/ --sysconfdir=/etc/ --localstatedir=/var/ |
Procedere con l’installazione si Suricata con il comando:
0 |
make |
NOTA BENE: l’esecuziione di questo comando durerà circa 10 minuti.
Quindi eseguire il comando:
0 |
make install-full |
Se è andato tutto a buon fine dovremmo vedere il seguente output:
0 1 2 3 4 5 6 7 8 9 10 11 12 |
You can now start suricata by running as root something like: /usr/bin/suricata -c /etc/suricata/suricata.yaml -i eth0 If a library like libhtp.so is not found, you can run suricata with: LD_LIBRARY_PATH=/usr/lib /usr/bin/suricata -c /etc/suricata/suricata.yaml -i eth0 The Emerging Threats Open rules are now installed. Rules can be updated and managed with the suricata-update tool. For more information please see: https://docs.suricata.io/en/latest/rule-management/index.html make[1]: Leaving directory '/root/suricata-7.0.2' |
CONFIGURAZIONE DI SURICATA
La prima configurazione da fare è quella relativa all’interfaccia di rete e alle rete modificando il file suricata.yaml con il comando:
0 |
sudo nano /etc/suricata/suricata.yaml |
Individuare las seguenti righe:
0 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 |
## ## Step 1: Inform Suricata about your network ## . . . HOME_NET: "[192.168.0.0/16,10.0.0.0/8,172.16.0.0/12]" ## ## Step 2: Select outputs to enable ## . . . -sip . . . community-id: false ## ## Step 3: Configure common capture settings ## . . . af-packet: - interface: eth0 ## ## Step 4: App Layer Protocol configuration ## . . . sip: #enabled: yes |
Quindi modificare come di seguito:
0 1 2 3 4 5 6 7 8 9 10 |
HOME_NET: "[192.168.100.0/24]" sip: enabled: no community-id: true af-packet: - interface: ens160 # -sip |
NOTA BENE: in corrispondenza del valore HOME_NET inserire la propria subnet di rete e in corrispondenza di -interface: inserire il nome dell’interfaccia di rete
Salvare e chiudere il file di configurazione
ATTENZIONE: per verificare il nome dell’interfaccia di rete eseguire il comando:
0 |
netstat -i |
Dovremmo visualizzare il seguente output con i nomi delle interfacce di rete presenti sul server:
0 1 2 3 |
Kernel Interface table Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg ens160 1500 154740 0 7534 0 98036 0 0 0 BMRU lo 65536 238 0 0 0 238 0 0 0 LRU |
Aggiornare Suricata con il comando:
0 |
suricata-update |
Quindi verificare il file di configurazione con il comando:
0 |
suricata -T -c /etc/suricata/suricata.yaml -v |
Se è tutto ok dovremmo vedere un output come di seguito:
0 1 2 3 4 5 6 7 8 9 10 11 |
Notice: suricata: This is Suricata version 7.0.2 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: 1 rule files processed. 36039 rules successfully loaded, 0 rules failed Info: threshold-config: Threshold config parsed: 0 rule(s) found Info: detect: 36042 signatures processed. 1242 are IP-only rules, 4915 are inspecting packet payload, 29673 inspect application layer, 108 are decoder event only Notice: suricata: Configuration provided was successfully loaded. Exiting. |
A questo punto verificare che il servizio si Suricata parta con il seguente comando:
0 |
suricata -c /etc/suricata/suricata.yaml -i ETHERNET |
NOTA BENE: al posto di ETHERNET inserire il nome dell’interfaccia di rete. Nel mio caso è ens160
Se il servizio è paritito correttamante dovremmo vedere il seguente output:
0 1 |
i: suricata: This is Suricata version 7.0.2 RELEASE running in SYSTEM mode i: threads: Threads created -> W: 2 FM: 1 FR: 1 Engine started. |
Per stoppare il servizio premere CTRL-C
Se il servizio è stato toppato dovremmo vedere il seguente output:
0 1 |
i: suricata: Signal Received. Stopping engine. i: device: ens160: packets: 142, drops: 0 (0.00%), invalid chksum: 0 |
AUTOMAZIONE DEL SERVIZIO SURICATA
Per fare in modo che il servizio di Suricata parta in automatico all’avvio del server proceder ecome segue.
La prima cosa da fare è craere un servizio systemd per far si che Suricata si avvii automaticamante all’avvio del Server Ubuntu.
Eseguire il comando:
0 |
nano /etc/systemd/system/suricata.service |
Quindi aggiungere all’interno del file le seguenti righe:
0 1 2 3 4 5 6 7 8 |
[Unit] Description=Suricata IDS/IPS After=network.target [Service] ExecStart=/usr/bin/suricata -c /etc/suricata/suricata.yaml -i ETHERNET [Install] WantedBy=default.target |
Salvare e chiudere il file di configurazione.
NOTA BENE: al posto di ETHERNET inserire il nome dell’interfaccia di rete. Nel mio caso è ens160
Abilitare Suricata con il comando:
0 |
systemctl enable suricata |
Dovremmo vedere il seguente output:
0 |
Created symlink /etc/systemd/system/default.target.wants/suricata.service → /etc/systemd/system/suricata.service. |
Avviare Suricata con il comando:
0 |
systemctl start suricata |
Quindi verificare lo stato di Suricata con il comando:
0 |
systemctl status suricata |
Se è tutto OK dovremmo vedere una schermata come quella sovrastante
INSTALLAZIONE DI ELASTISEARCH E DI KIBANA
Il primo passaggio nell’installazione di Elasticsearch prevede l’aggiunta della chiave Elastic GPG al server con il comando:
0 |
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg |
Creare un repository per il pacchetto Elasticsearch creando il file /etc/apt/sources.list.d/elastic-7.x.list con il comando:
0 |
echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-7.x.list |
Quindi aggiornare il repository con il comando:
0 |
sudo apt update |
Installare Elasticsearch e Kibana con il comando:
0 |
sudo apt install elasticsearch kibana |
CONFIGURAZIONE DI ELASTISEARCH
Procedere con la configurazione di Elasticsearch editando il file /etc/elasticsearch/elasticsearch.yml con il seguente comando:
0 |
sudo nano /etc/elasticsearch/elasticsearch.yml |
Elasticsearch accetta solo connessioni locali per impostazione predefinita. Dobbiamo cambiarlo in modo che Kibana possa accedervi tramite l’indirizzo IP privato.
Individuare queste righe all’interno del file di configurazione:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 |
# ---------------------------------- Network ----------------------------------- # # By default Elasticsearch is only accessible on localhost. Set a different # address here to expose this node on the network: # #network.host: 192.168.0.1 # # By default Elasticsearch listens for HTTP traffic on the first free port it # finds starting at 9200. Set a specific HTTP port here: # #http.port: 9200 # # For more information, consult the network module documentation. # |
Quindi modificarle come segue:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# ---------------------------------- Network ----------------------------------- # # By default Elasticsearch is only accessible on localhost. Set a different # address here to expose this node on the network: # #network.host: 192.168.0.1 network.bind_host: ["127.0.0.1", "INDIRIZZO IP PRIVATO"] # # By default Elasticsearch listens for HTTP traffic on the first free port it # finds starting at 9200. Set a specific HTTP port here: # #http.port: 9200 # # For more information, consult the network module documentation. # |
ATTENZIONE: al posto di INDIRIZZO IP PRIVATO inserire l’IP privato del server Ubuntu. Nel mio caso 192.168.100.236
Il passaggio successivo consiste nell’attivare alcune funzionalità di sicurezza e assicurarsi che Elastic sia configurato per l’esecuzione su un singolo nodo.
Per fare questo, aggiungere le seguenti righe alla fine del file di configurazione.
0 1 |
discovery.type: single-node xpack.security.enabled: true |
Se abbiamo fatto tutto correttamante dovremmo vedere una schermata come mostrato nell’immagine sovrastante
Salvare e chiudere il file di configurazione
ATTENZIONE: Se si intende utilizzare più nodi di Elastisearch non inserire la prima riga all’interno del file di configurazione.
Procedere con il reload del servizio daemon con il comando:
0 |
sudo systemctl daemon-reload |
Quindi abilitare il servizio di Elasticsearch con il comando:
0 |
sudo systemctl enable elasticsearch |
Avviare il servizio di Elastisearch con il comando:
0 |
sudo systemctl start elasticsearch |
Verificare lo stato del servizio di Elasticsearch con il comando:
0 |
sudo systemctl status elasticsearch |
Se è tutto corretto dovremmo vedere una schermata come nell’immagine sovrastante
Dopo aver abilitato l’impostazione di sicurezza di Elasticsearch, il passaggio successivo è quello di generare alcune password per le utenze predefinito.
Elasticsearch viene fornito con un’utilità per la creazione di password in /usr/share/elasticsearch/bin/elasticsearch-setup-passwords che può generare password casuali.
Poisizionarsi nella cartella /usr/share/elasticsearch/bin con il comando:
0 |
cd /usr/share/elasticsearch/bin |
Quindi creare le password con il comando:
0 |
sudo ./elasticsearch-setup-passwords auto |
Dovremmo vedere il seguente output:
0 1 2 |
Initiating the setup of passwords for reserved users elastic,apm_system,kibana,kibana_system,logstash_system,beats_system,remote_monitoring_user. The passwords will be randomly generated and printed to the console. Please confirm that you would like to continue [y/N] |
Premere Y per proseguire
Se è andato tutto a buon fine dovremmo vedere il seguente output con tutte le password generate:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Changed password for user apm_system PASSWORD apm_system = N9kFOZBuTWK6DD7xoOnI Changed password for user kibana_system PASSWORD kibana_system = yQLoBczVHoRbkzHgMK6J Changed password for user kibana PASSWORD kibana = yQLoBczVHoRbkzHgMK6J Changed password for user logstash_system PASSWORD logstash_system = hWYXTBzXPseFX7v7fTQZ Changed password for user beats_system PASSWORD beats_system = XEe6dLcNrIdlb2Gz8ZCd Changed password for user remote_monitoring_user PASSWORD remote_monitoring_user = KpQPcnKn1UATTuaazYvZ Changed password for user elastic PASSWORD elastic = vjmGXRn787hXhF5PTuE5 |
ATTENZIONE: Segnare le password in un luogo sicuro perchè è possibile eseguire l’utility una sola volta
CONFIGURAZIONE DI KIBANA
Il primo passo nella configurazione di Kibana è abilitare la funzione di sicurezza di xpack generando chiavi segrete.
Kibana utilizza queste chiavi segrete per archiviare i dati in Elasticsearch. È possibile accedere all’utilità per generare chiavi segrete dalla directory /usr/share/kibana/bin.
Posizionarsi nella cartella /usr/share/kibana/bin/ con il comando:
0 |
cd /usr/share/kibana/bin/ |
Quindi generare le password con il comando:
0 |
sudo ./kibana-encryption-keys generate -q --force |
Dovremmo visualizzare il seguente output:
0 1 2 |
xpack.encryptedSavedObjects.encryptionKey: c90032031bff5c3417f736f3c375399a xpack.reporting.encryptionKey: 6201fb0aa057e41c94068335c1f8e02a xpack.security.encryptionKey: 71badf0c0c436fad6fa5267a34156a16 |
Copiare questo output quindi editare il file kibana.yml con il comando:
0 |
sudo nano /etc/kibana/kibana.yml |
Copiare l’output al fondo del file di configurazione
Se è tutto corretto dovremmo vedere una schermata come quella sovrastante
Kibana deve essere configurato in modo che sia accessibile dall’indirizzo IP privato del server.
Cercare la riga #server.host: “localhost” nel file e aggiungere la riga server.host: “INDIRIZZO IP PRIVATO”
Al posto di INDIRIZZO IP PRIVATO inserire l’ip privato del server Ubuntu. nel mio caso l’IP è sempre lo stesso e quindi 192.168.100.236
Salvare e chiudere il file di configurazione
Il passaggio successivo è quello di creare un nome utente e una password che Kibana possa utilizzare per l’autenticazione.
E’ possibile farlo modificando direttamente il file di configurazione di Kibana, ma ciò può causare un problema di sicurezza.
Il metodo sicuro prevede l’uso dell’applicazione kibana-keystore.
Eseguire i seguenti comandi per impostare un nome utente:
0 1 |
cd /usr/share/kibana/bin sudo ./kibana-keystore add elasticsearch.username |
Al seguente Output inserire lo username kibana_system
0 |
Enter value for elasticsearch.username: ************* |
Quindi premere Invio
Eseguire nuovamente il comando per impostare la password.
Assicurarsi di utilizzare la password creata in precedenza per Kibana_System.
Nel mio caso la password è yQLoBczVHoRbkzHgMK6J
Eseguire il comando:
0 |
sudo ./kibana-keystore add elasticsearch.password |
Al seguente Output inserire la password yQLoBczVHoRbkzHgMK6J
0 |
Enter value for elasticsearch.password: ******************** |
Dopo aver tewrminato la configurazione di Kibana avviare ed abilitare il servizio con il comando:
0 |
sudo systemctl enable kibana --now |
Quindi verificare lo stato di Kibana con il comando:
0 |
sudo systemctl status kibana |
Se abbiamo fatto tutto correttamante dovremmo vedere una schermata come quella sovrastante
INSTALLAZIONE E CONFIGURAZIONE DI FILEBEAT
Adesso procedere con l’installazione di Filebeat sul server Suricata.
Aggiungere la chiave Elastic GPG con il comando:
0 |
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg |
Quindi creare il repository di Elastisearch con il comando:
0 |
echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-7.x.list |
Aggiornare il repository con il comando:
0 |
sudo apt update |
Installare Filebeat con il comando:
0 |
sudo apt install filebeat |
Configurare Filebeat editando il file di configurazione /etc/filebeat/filebeat.yml con il seguente comando:
0 |
sudo nano /etc/filebeat/filebeat.yml |
Quindi individuare nella sezione Kibana la riga #host: “localhost:5601”
Aggiungere sotto questa riga la riga:
0 |
host: "INDIRIZZO_IP_PRIVATO:5601" |
Nel mio caso la riga sarà host: “192.168.100.236:5601”
Adesso scorrere il file di configurazione fino alla sezione Elasticsearch Output
Quindi editare i valori come di seguito:
0 1 2 |
hosts: ["INDIRIZZO_IP_PRIVATO:9200"] username: "elastic" password: "PASSWORD" |
ATTENZIONE: la password dell’utente elastic è quella generata in precedenza
Nel mio caso i parametri da inserire saranno i seguenti:
hosts: [“192.168.100.236:9200”]
username: “elastic”
password: “vjmGXRn787hXhF5PTuE5”
Salvare e chiudere il file di configurazione
Abilitare il modulo Suricata integrato di Filebeat con il comando:
0 |
sudo filebeat modules enable suricata |
Il passaggio finale nella configurazione di Filebeat consiste nel caricare la dashboard e le pipeline SIEM in Elasticsearch utilizzando il comando filebeat setup
0 |
sudo filebeat setup |
ATTENZIONE: questa operazione richiederà diversi minuti
Se è andato tutto a buon fine dovremmo vedere il seguente output:
0 1 2 3 4 5 6 7 |
Index setup finished. Loading dashboards (Kibana must be running and reachable) Loaded dashboards Setting up ML using setup --machine-learning is going to be removed in 8.0.0. Please use the ML app instead. See more: https://www.elastic.co/guide/en/machine-learning/current/index.html It is not possble to load ML jobs into an Elasticsearch 8.0.0 or newer using the Beat. Loaded machine learning job configurations Loaded Ingest pipelines |
ACCESSO ALLA DASHBOARD DI KIBANA
A questo punto è possibile richiamare da un qualsiasi browser l’indirizzo
http://IP-SERVER-UBUNTU:5601
Accedere con le credenziali generate in precedenza per l’utente elastic.
USER: elastic
PASSWORD: vjmGXRn787hXhF5PTuE5
Cliccare Login
Nel campo Search Elastic cercare dashboard suricata overview quindi selezionare [Filebeat Suricata] Events Overview Dashboard come mostrato nell’immagine sovrastante
Questa è la dashboard degli eventi e degli alerts di Suricata
Sono Raffaele Chiatto, un appassionato di informatica a 360 gradi.
Tutto è iniziato nel 1996, quando ho scoperto il mondo dell'informatica grazie a Windows 95, e da quel momento non ho più smesso di esplorare e imparare.
Ogni giorno mi dedico con curiosità e passione a scoprire le nuove frontiere di questo settore in continua evoluzione.
Dovresti editare i file filebeat.yml e impostare setup.ilm.overwrite in true
appena eseguo il comando: sudo filebeat setup mi da errore: Overwriting ILM policy is disabled. Set
setup.ilm.overwrite: true
for enabling.