<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>IDS/IPS on My personal blog</title>
        <link>https://www.matteobianchi.eu/tags/ids/ips/</link>
        <description>Recent content in IDS/IPS on My personal blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en</language>
        <lastBuildDate>Sat, 12 Sep 2026 09:00:00 +0200</lastBuildDate><atom:link href="https://www.matteobianchi.eu/tags/ids/ips/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>SIEM e correlazione: dai log sparsi all&#39;allarme che conta</title>
        <link>https://www.matteobianchi.eu/p/siem-log-correlation/</link>
        <pubDate>Sat, 12 Sep 2026 09:00:00 +0200</pubDate>
        
        <guid>https://www.matteobianchi.eu/p/siem-log-correlation/</guid>
        <description>&lt;img src="https://www.matteobianchi.eu/p/siem-log-correlation/cover.png" alt="Featured image of post SIEM e correlazione: dai log sparsi all&#39;allarme che conta" /&gt;&lt;h2 id=&#34;perché-conta&#34;&gt;Perché conta
&lt;/h2&gt;&lt;p&gt;Ogni componente di sicurezza vede un frammento. L&amp;rsquo;&lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/ids-ips-suricata/&#34; &gt;IDS Suricata&lt;/a&gt;
vede un pacchetto sospetto; il &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/stateful-firewalls-nftables/&#34; &gt;firewall&lt;/a&gt; vede una
connessione bloccata; il server vede un login fallito; il DNS vede una query strana. Preso da solo,
ogni evento è rumore. L&amp;rsquo;attacco reale vive &lt;strong&gt;nella relazione&lt;/strong&gt; tra questi frammenti: un login da un
paese insolito, &lt;em&gt;seguito&lt;/em&gt; da una connessione verso un host mai visto, &lt;em&gt;seguita&lt;/em&gt; da un trasferimento
dati anomalo. Il SIEM (Security Information and Event Management) è il punto dove tutti i log
confluiscono, vengono resi comparabili, e correlati in storie che un essere umano può leggere.&lt;/p&gt;
&lt;h2 id=&#34;le-tre-fasi-raccogliere-normalizzare-correlare&#34;&gt;Le tre fasi: raccogliere, normalizzare, correlare
&lt;/h2&gt;&lt;pre class=&#34;mermaid&#34;&gt;
  flowchart LR
    F[Firewall] --&amp;gt; C[Collector]
    I[IDS/IPS] --&amp;gt; C
    S[Server / auth] --&amp;gt; C
    D[DNS] --&amp;gt; C
    C --&amp;gt; N[&amp;#34;Normalizzazione&amp;lt;br/&amp;gt;(schema comune)&amp;#34;]
    N --&amp;gt; R[&amp;#34;Motore di correlazione&amp;lt;br/&amp;gt;(regole)&amp;#34;]
    R --&amp;gt; A[Allarme prioritizzato]
    R --&amp;gt; St[(Storage ricercabile)]
&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Raccogliere&lt;/strong&gt;: convogliare log eterogenei (syslog, JSON, eventi Windows) in un punto unico.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Normalizzare&lt;/strong&gt;: mappare campi diversi su uno &lt;strong&gt;schema comune&lt;/strong&gt;. L&amp;rsquo;IP sorgente si chiama
&lt;code&gt;src_ip&lt;/code&gt; ovunque, non &lt;code&gt;source&lt;/code&gt;, &lt;code&gt;client&lt;/code&gt;, &lt;code&gt;ip.src&lt;/code&gt; a seconda del prodotto. Senza questo passo, la
correlazione è impossibile.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Correlare&lt;/strong&gt;: applicare regole che legano eventi di sorgenti diverse nel tempo.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La normalizzazione è la fase meno vistosa e la più importante: è ciò che permette di chiedere &amp;ldquo;tutti
gli eventi da questo IP&amp;rdquo; e ottenere firewall, IDS e auth insieme.&lt;/p&gt;
&lt;h2 id=&#34;perché-la-correlazione-cambia-tutto&#34;&gt;Perché la correlazione cambia tutto
&lt;/h2&gt;&lt;p&gt;Un singolo login fallito è normale. Cento login falliti su un account, &lt;em&gt;seguiti da uno riuscito&lt;/em&gt;,
&lt;em&gt;seguito&lt;/em&gt; da un accesso a dati sensibili, sono un attacco di brute force andato a segno. Nessuno dei
tre eventi, da solo, farebbe scattare nulla; la loro &lt;strong&gt;sequenza&lt;/strong&gt; sì.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;regola: brute force riuscito
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  QUANDO  &amp;gt;= 20 eventi &amp;#34;login fallito&amp;#34; (stesso account, finestra 5 min)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  SEGUITO DA  1 evento &amp;#34;login riuscito&amp;#34; (stesso account)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  ALLORA  allarme priorità ALTA, tecnica ATT&amp;amp;CK T1110
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;È la differenza tra guardare i pixel e vedere l&amp;rsquo;immagine. La correlazione temporale e per entità
(stesso utente, stesso host, stesso IP) è il cuore del valore di un SIEM.&lt;/p&gt;
&lt;h2 id=&#34;scrivere-detection-sigma-e-attck&#34;&gt;Scrivere detection: Sigma e ATT&amp;amp;CK
&lt;/h2&gt;&lt;p&gt;Le regole di detection si scrivono una volta e, idealmente, si eseguono su SIEM diversi. &lt;strong&gt;Sigma&lt;/strong&gt; è
un formato aperto che descrive la logica in YAML, indipendente dal prodotto, e si &lt;strong&gt;compila&lt;/strong&gt; verso
il linguaggio di query del SIEM specifico.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Login riuscito dopo molti fallimenti&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;logsource&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;category&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;authentication&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;detection&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;failures&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;event&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;login_failed&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;count&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;&amp;gt;=20&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;success&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;event&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;login_success&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;timeframe&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;5m&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;condition&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;failures followed by success&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;level&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;high&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;tags&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;attack.credential_access&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;attack.t1110       &lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Brute Force&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Legare ogni regola a una tecnica &lt;strong&gt;MITRE ATT&amp;amp;CK&lt;/strong&gt; (qui &lt;code&gt;T1110&lt;/code&gt;) dà due vantaggi: un linguaggio
condiviso tra chi scrive e chi risponde, e una mappa della &lt;strong&gt;copertura&lt;/strong&gt; — quali tecniche d&amp;rsquo;attacco
sapete rilevare e quali no.&lt;/p&gt;
&lt;h2 id=&#34;il-nemico-vero-i-falsi-positivi&#34;&gt;Il nemico vero: i falsi positivi
&lt;/h2&gt;&lt;p&gt;Un SIEM che grida a ogni evento diventa rumore che nessuno guarda — ed è così che gli attacchi reali
passano inosservati, sepolti sotto mille allarmi innocui. Il lavoro continuo di un SIEM non è
scrivere regole, ma &lt;strong&gt;affinare&lt;/strong&gt; quelle che ci sono: ridurre i falsi positivi con contesto
(whitelist di host noti, soglie tarate sul traffico reale, arricchimento con threat intelligence).
Una regola che genera 500 allarmi al giorno, di cui 2 veri, è peggio di nessuna regola: addestra
l&amp;rsquo;analista a ignorarla.&lt;/p&gt;
&lt;h2 id=&#34;lab&#34;&gt;Lab
&lt;/h2&gt;&lt;p&gt;Con uno stack SIEM da laboratorio (Wazuh, o Elastic Security, o un semplice Loki/OpenSearch):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Convogliate i log di un firewall (nftables), di Suricata e dell&amp;rsquo;autenticazione (auth.log) in un
collector unico.&lt;/li&gt;
&lt;li&gt;Verificate la normalizzazione: cercate un IP e controllate di vedere eventi da tutte e tre le
fonti con campi coerenti.&lt;/li&gt;
&lt;li&gt;Scrivete una regola di correlazione &amp;ldquo;brute force riuscito&amp;rdquo; come sopra.&lt;/li&gt;
&lt;li&gt;Simulate l&amp;rsquo;attacco (molti login falliti via Hydra in laboratorio, poi uno riuscito) e verificate
che scatti &lt;strong&gt;un solo&lt;/strong&gt; allarme correlato, non venti.&lt;/li&gt;
&lt;/ol&gt;


&lt;details&gt;
&lt;summary&gt;&lt;strong&gt;Domanda:&lt;/strong&gt; se ho già un IDS che genera allarmi, perché aggiungere un SIEM sopra?&lt;/summary&gt;
&lt;p&gt;Perché l&#39;IDS vede solo la rete, e solo un evento alla volta. Suricata vi dice &#34;pacchetto sospetto
da X&#34;: non sa se quel pacchetto è arrivato &lt;em&gt;dopo&lt;/em&gt; un login anomalo, né se lo stesso X sta anche
fallendo autenticazioni su un altro server. Il SIEM esiste proprio per unire la vista di rete
dell&#39;IDS con quella di host, autenticazione e applicazioni, e per &lt;em&gt;mettere in relazione&lt;/em&gt; eventi
che nessuna singola sonda può collegare. In più, concentra in un posto la ricerca forense (&#34;cosa ha
fatto questo IP nelle ultime 24 ore, ovunque?&#34;) e la misura della copertura rispetto ad ATT&amp;CK.
L&#39;IDS è una sorgente eccellente &lt;em&gt;per&lt;/em&gt; il SIEM, non un suo sostituto: uno vede i pacchetti,
l&#39;altro vede la storia.&lt;/p&gt;
&lt;/details&gt;


&lt;h2 id=&#34;conclusione&#34;&gt;Conclusione
&lt;/h2&gt;&lt;p&gt;Un SIEM trasforma log sparsi e incomparabili in una vista unica e, soprattutto, correlata: è il
luogo dove i frammenti visti da IDS, firewall, server e DNS diventano la storia di un attacco. Le
tre fasi — raccogliere, normalizzare, correlare — culminano nel punto che conta: legare eventi
innocui in un allarme che ha senso. Il formato Sigma e la mappa ATT&amp;amp;CK rendono le detection
portabili e misurabili; e il lavoro infinito è tenere bassi i falsi positivi, perché un allarme
ignorato è peggio di nessun allarme.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>IDS e IPS con Suricata</title>
        <link>https://www.matteobianchi.eu/p/ids-ips-suricata/</link>
        <pubDate>Tue, 25 Aug 2026 09:00:00 +0200</pubDate>
        
        <guid>https://www.matteobianchi.eu/p/ids-ips-suricata/</guid>
        <description>&lt;img src="https://www.matteobianchi.eu/p/ids-ips-suricata/cover.png" alt="Featured image of post IDS e IPS con Suricata" /&gt;&lt;h2 id=&#34;perché-conta&#34;&gt;Perché conta
&lt;/h2&gt;&lt;p&gt;Il &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/stateful-firewalls-nftables/&#34; &gt;firewall&lt;/a&gt; decide &lt;strong&gt;chi&lt;/strong&gt; può parlare con
chi. Ma una connessione permessa — un HTTP verso il server web in DMZ — può trasportare un
exploit. Il firewall non lo vede: per lui è traffico sulla porta 443, consentito. Serve qualcosa
che ispezioni il &lt;strong&gt;contenuto&lt;/strong&gt; e riconosca gli schemi di un attacco. Questo è un IDS/IPS, e
Suricata è lo strumento open source di riferimento.&lt;/p&gt;
&lt;h2 id=&#34;ids-o-ips-dovè-sulla-rete&#34;&gt;IDS o IPS: dov&amp;rsquo;è sulla rete
&lt;/h2&gt;&lt;p&gt;La stessa macchina fa due mestieri diversi a seconda di dove la mettete.&lt;/p&gt;
&lt;pre class=&#34;mermaid&#34;&gt;
  flowchart LR
    subgraph IDS[&amp;#34;Modalità IDS — osserva&amp;#34;]
        T1[Traffico] --&amp;gt; SW[Switch&amp;lt;br/&amp;gt;port mirror] -.copia.-&amp;gt; S1[Suricata]
        T1 --&amp;gt; Dest1[Destinazione]
        S1 --&amp;gt; Alert1[Allarme]
    end
    subgraph IPS[&amp;#34;Modalità IPS — blocca&amp;#34;]
        T2[Traffico] --&amp;gt; S2[Suricata&amp;lt;br/&amp;gt;inline] --&amp;gt; Dest2[Destinazione]
        S2 --&amp;gt; Drop[Scarta i pacchetti malevoli]
    end
&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;IDS (Intrusion Detection System)&lt;/strong&gt;: Suricata riceve una &lt;strong&gt;copia&lt;/strong&gt; del traffico (da una porta
mirror dello switch) e genera allarmi. Non è nel percorso dei pacchetti: non può rallentare né
bloccare nulla. Se va in crash, la rete non si ferma.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IPS (Intrusion Prevention System)&lt;/strong&gt;: Suricata è &lt;strong&gt;inline&lt;/strong&gt;, cioè in mezzo al traffico. Può
scartare i pacchetti malevoli, ma ogni pacchetto ci passa attraverso: diventa un punto di
rallentamento e di possibile guasto.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La scelta è un compromesso tra sicurezza e rischio operativo. Spesso si parte in IDS per
&amp;ldquo;ascoltare&amp;rdquo;, e si passa a IPS solo sulle regole di cui ci si fida.&lt;/p&gt;
&lt;h2 id=&#34;installare-suricata-nel-lab&#34;&gt;Installare Suricata nel lab
&lt;/h2&gt;&lt;p&gt;Nel lab containerlab si aggiunge un nodo con Suricata. In IDS ascolta un&amp;rsquo;interfaccia; in IPS si
mette tra due interfacce con &lt;code&gt;nfqueue&lt;/code&gt; e una regola nftables che devia il traffico.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# IDS: ascolta eth1 e logga in formato EVE (JSON)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;suricata -i eth1 -l /var/log/suricata
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# aggiornare le regole (Emerging Threats Open)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;suricata-update
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Gli allarmi finiscono in &lt;code&gt;/var/log/suricata/eve.json&lt;/code&gt;, una riga JSON per evento, pronta per essere
letta da strumenti come EveBox o inviata a un sistema di log centralizzato — il tema del capitolo
sull&amp;rsquo;osservabilità.&lt;/p&gt;
&lt;h2 id=&#34;anatomia-di-una-regola&#34;&gt;Anatomia di una regola
&lt;/h2&gt;&lt;p&gt;Una regola Suricata ha due parti: l&amp;rsquo;&lt;strong&gt;header&lt;/strong&gt; (azione, protocollo, chi verso chi) e le
&lt;strong&gt;opzioni&lt;/strong&gt; tra parentesi (cosa cercare, come segnalarlo).&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;alert tcp any any -&amp;gt; 10.0.1.10 80 (msg:&amp;#34;Possibile SQL injection UNION SELECT&amp;#34;; \
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    content:&amp;#34;UNION&amp;#34;; nocase; content:&amp;#34;SELECT&amp;#34;; nocase; distance:0; \
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    flow:established,to_server; classtype:web-application-attack; sid:1000001; rev:1;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Letta a pezzi:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;alert tcp any any -&amp;gt; 10.0.1.10 80&lt;/code&gt;: genera un &lt;strong&gt;allarme&lt;/strong&gt; per il traffico TCP da chiunque verso
il server web (porta 80). In IPS, &lt;code&gt;alert&lt;/code&gt; diventa &lt;code&gt;drop&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;content:&amp;quot;UNION&amp;quot;; nocase;&lt;/code&gt;: cerca la stringa &lt;code&gt;UNION&lt;/code&gt; nel payload, ignorando maiuscole/minuscole.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;distance:0;&lt;/code&gt; sul secondo &lt;code&gt;content&lt;/code&gt;: &lt;code&gt;SELECT&lt;/code&gt; deve comparire dopo &lt;code&gt;UNION&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;flow:established,to_server;&lt;/code&gt;: solo su connessioni già stabilite, nei pacchetti verso il server.
Riduce i falsi positivi.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sid:1000001;&lt;/code&gt;: l&amp;rsquo;identificativo univoco della regola. I sid locali partono da 1000000.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Il formato è lo stesso di Snort, quindi gran parte delle regole è interscambiabile.&lt;/p&gt;
&lt;h2 id=&#34;riconoscere-gli-attacchi-dei-capitoli-precedenti&#34;&gt;Riconoscere gli attacchi dei capitoli precedenti
&lt;/h2&gt;&lt;p&gt;Suricata non vede l&amp;rsquo;ARP spoofing del &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/layer2-attacks-arp-spoofing/&#34; &gt;capitolo 02&lt;/a&gt;
con una regola sul contenuto — ARP è a livello 2 — ma ha un modulo dedicato che segnala quando lo
stesso IP cambia MAC di continuo. Lo scan &lt;code&gt;nmap -sS&lt;/code&gt; invece si riconosce dalla frequenza:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;alert tcp any any -&amp;gt; $HOME_NET any (msg:&amp;#34;Possibile port scan SYN&amp;#34;; \
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    flags:S; flow:to_server; \
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    threshold:type both,track by_src,count 30,seconds 5; \
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    classtype:attempted-recon; sid:1000002; rev:1;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;threshold&lt;/code&gt; è la chiave: non allarma su un singolo SYN (normale), ma su &lt;strong&gt;30 SYN in 5 secondi
dalla stessa sorgente&lt;/strong&gt;, che è lo schema di uno scan. Senza soglia, una regola così genererebbe
migliaia di falsi positivi.&lt;/p&gt;
&lt;h2 id=&#34;il-problema-vero-i-falsi-positivi&#34;&gt;Il problema vero: i falsi positivi
&lt;/h2&gt;&lt;p&gt;Un IDS che allarma su tutto è un IDS che nessuno guarda. La gestione di un IDS non è scrivere
regole, è &lt;strong&gt;ridurre il rumore&lt;/strong&gt;: alzare le soglie, limitare le regole al traffico che conta,
disattivare quelle che non si applicano alla propria rete. Un ruleset Emerging Threats completo ha
decine di migliaia di regole: attivarle tutte ciecamente seppellisce gli allarmi veri sotto quelli
inutili.&lt;/p&gt;
&lt;h2 id=&#34;lab&#34;&gt;Lab
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;Avviate Suricata in IDS sul nodo che riceve il traffico.&lt;/li&gt;
&lt;li&gt;Dal nodo &lt;code&gt;attacker&lt;/code&gt;, lanciate &lt;code&gt;nmap -sS&lt;/code&gt; contro un altro nodo.&lt;/li&gt;
&lt;li&gt;Aggiungete la regola &lt;code&gt;sid:1000002&lt;/code&gt; in un file &lt;code&gt;local.rules&lt;/code&gt;, ricaricate e ripetete lo scan.&lt;/li&gt;
&lt;li&gt;Leggete &lt;code&gt;eve.json&lt;/code&gt; e trovate l&amp;rsquo;evento di tipo &lt;code&gt;alert&lt;/code&gt; generato dallo scan:
&lt;code&gt;jq &#39;select(.event_type==&amp;quot;alert&amp;quot;) | .alert.signature&#39; /var/log/suricata/eve.json&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;


&lt;details&gt;
&lt;summary&gt;&lt;strong&gt;Domanda:&lt;/strong&gt; perché in IDS Suricata non può bloccare lo scan che rileva?&lt;/summary&gt;
&lt;p&gt;Perché in modalità IDS riceve solo una &lt;em&gt;copia&lt;/em&gt; del traffico da una porta mirror: i pacchetti
veri hanno già raggiunto la destinazione quando Suricata li analizza. Può solo generare un allarme
a posteriori. Per bloccare serve la modalità IPS, dove Suricata è inline e ogni pacchetto deve
attraversarlo prima di proseguire: solo lì &lt;code&gt;drop&lt;/code&gt; ha effetto. Il prezzo è che Suricata
diventa un punto critico: se si satura o va in crash, blocca tutto il traffico.&lt;/p&gt;
&lt;/details&gt;


&lt;h2 id=&#34;conclusione&#34;&gt;Conclusione
&lt;/h2&gt;&lt;p&gt;Un IDS/IPS è il secondo strato della difesa in profondità: vede ciò che il firewall lascia
passare. Ma vale solo quanto le sue regole e la cura con cui si combatte il rumore. Un IDS
installato e dimenticato produce allarmi che nessuno legge.&lt;/p&gt;
&lt;p&gt;Fin qui abbiamo lavorato su pacchetti in chiaro. Dal prossimo capitolo saliamo all&amp;rsquo;applicazione,
dove entra la crittografia: come TLS protegge una connessione, e perché nemmeno un IPS inline può
leggere dentro un flusso cifrato correttamente.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Prossimo nella serie:&lt;/strong&gt; &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/tls-deep-dive/&#34; &gt;06 · TLS 1.3 in profondità&lt;/a&gt; ·
&lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/network-security-roadmap/&#34; &gt;Torna alla roadmap&lt;/a&gt;&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
