Usbguard: il “firewall” che chiude le porte USB

Il concetto di firewall è ben presente a tutti noi: un sistema tanto semplice quanto elegante, che consente di avere delle regole precise in base alle quali decidere ciò che sulla nostra rete può entrare\uscire e cosa no.

Quando si parla di firewall ci si riferisce al filtraggio di pacchetti network ma il concetto di whitelisting e blacklisting può tornare utile anche dove raramente si pensa di applicarlo: nei dispositivi USB.

Chiariamo subito ogni vostra perplessità: un filtro USB mira a prevenire attacchi di natura fisica in cui un avversario ha accesso fisico a un computer acceso con lo schermo bloccato.

Le probabilità di essere oggetto di un attacco del genere come persona privata sono astronomicamente basse ma, se parliamo di un contesto aziendale in cui, ad esempio, vi sono delle workstation fisse che il dipendente non porta con sè a casa e che non sono state spente ma soltanto sospese, esse saranno in balìa di qualunque altra persona frequenti i locali aziendali fuori dagli orari lavorativi.

Ora, la sicurezza fisica delle macchine è un tema complesso che include, come sempre, un approccio multi livello, tuttavia vogliamo parlarvi di un piccolo ma interessante pacchetto chiamato usbguard.

Prima di parlarvene, proviamo a connettere una normale chiavetta usb a una nostra macchina per mostrarvi cosa accade normalmente. L’ambiente testato è Arch Linux, Gnome 43.2, kernel 6.x:

Le prime righe mostrano cosa è avvenuto quando abbiamo inserito la chiavetta USB durante lo schermo bloccato che, 10 secondi dopo, abbiamo sbloccato.

Come si può notare, nonostante avessimo disabilitato l’auto-mount e l’auto-run degli eseguibili, la chiavetta è stata vista, interrogata in merito a che tipo di dispositivo si trattasse e essa ha risposto di essere un dispositivo di storage. Dopo qualche altra formalità e dopo aver negoziato le capability, essa è divenuta accessibile come nuovo dispositivo.

Anche se il filesystem non è stato montato e nulla è stato eseguito, tutto ciò non ci piace più di tanto.

Il motivo è che, nonostante tutto, è avvenuta una bella chiacchierata tra il dispositivo e il nostro computer e le cose che potevano prendere una brutta piega in questa fase erano già parecchie.

Cosa sarebbe accaduto, invece con usbguard? Vediamolo insieme.

Come implementare usbguard

Una volta installato (lo troverete molto probabilmente nei repository ufficiali della vostra distro) la prima cosa che vi servirà fare sarà generare una lista dei dispositivi attualmente connessi e impostarli tutti come dispositivi autorizzati.

IMPORTANTE: E’ bene essere sicuri di non invertire gli step che stiamo per elencare. Se si prova a far partire usbguard senza un rules.conf opportunamente riempito col primo dei due comandi, tastiera e mouse, entrambe le periferiche USB, non essendo esplicitamente autorizzate nel file, diverrebbero immediatamente inutilizzabili, anche dopo un riavvio. Semmai vi trovaste in questa situazione, potete uscirne facilmente tramite una chiavetta live della vostra distribuzione preferita e un chroot a seguire, ma la cosa potrebbe essere non banale per i meno esperti e, quindi, vi sconsigliamo di procedere se non siete pronti a sporcarvi le mani.

Tutto ciò si rende necessario anche nel caso in cui cambiaste tastiera, a meno di non disattivare prematuramente il servizio oppure connettere la nuova tastiera, in via temporanea, allo stesso tempo di quella vecchia, così da consentirvi di scrivere la nuova regola e aggiornare il rules.conf.

Bene, fatti i dovuti disclaimer, possiamo ora procedere, autorizzando tutti i dispositivi usb ora connessi (lista che includerà mouse e tastiera):

usbguard generate-policy > /etc/usbguard/rules.conf

In seguito, e solo in seguito, si potrà attivare e abilitare il servizio:

systemctl enable --now usbguard

Ed ecco che, in meno di un minuto, avete già terminato.

Se volete autorizzare un dispositivo:

usbguard list-devices
usbguard allow-device N -p

Dove al posto di N andrà il numero di riga del dispositivo che volete autorizzare e che otterrete dal primo comando. Lo switch -p indica che volete che l’autorizzazione sia permanente.

Per rimuovere, bloccare e per altri dettagli (è possibile stabilire diversi criteri, ad esempio permettere o vietare solo dispositivi storage), vi rimandiamo alla doc RedHat.

Tutte queste regole andranno a finire nel file /etc/usbguard/rules.conf di volta in volta e nessuno ovviamente vi impedisce di modificarlo a mano, aiutandovi con l’output di usbguard generate-policy ma, come abbiamo visto, ciò non dovrebbe rivelarsi necessario.

Prestate anche attenzione nel caso facciate un rsync da un computer all’altro, in quanto le periferiche USB saranno diverse e, quindi, se sincronizzate anche la cartella /etc e vi dimenticate di aggiornare le regole, non potrete più interagire con mouse e tastiera non appena attiverete la protezione avviando il servizio (di nuovo, situazione di facile risoluzione tramite live usb, ma ovviamente perdereste tempo).

Cosa cambia

E adesso? Che succederà, d’ora in poi, quando connetteremo un nuovo dispositivo non esplicitamente autorizzato da noi?

Per scoprirlo, andiamo a ripetere l’esperimento di sopra e inseriamo la stessa chiavetta USB di prima:

Come si può notare, sebbene qualche scambio di info sia comunque avvenuto, la “chiacchierata” tra dispositivo USB e computer è stata tagliata abbastanza rapidamente. Purtroppo, per sapere se il device è autorizzato o no, non ci si può esimere dal leggerne quantomeno il serial number, il product e il manufacturer. E’ comunque un miglioramento rispetto alla situazione di partenza e, come al solito, il prezzo da pagare per la sicurezza è l’inconvenienza.

Se voleste, infatti, tagliare anche questo minimo di comunicazione, dovreste optare per soluzioni più drastiche come un kernel customizzato, compilato senza supporto USB, con tutto ciò che ne deriva.

Ora che avete avuto un assaggio di come funzionano le cose, comunque, potete dare un occhiata alla pagine di ArchWiki, a questo articolo di RedHat o alla pagina del progetto. Vi rimandiamo anche a questa presentazione.

Considerazioni

Chiariamo subito che usbguard non è stato pensato per proteggervi da tutti gli attacchi, tantomeno da quelli di di tipo elettrico e che nessun sistema è infallibile. In più, le porte USB non sono l’unico problema in caso di accesso fisico, sebbene le più versatili da usare.

Riconosciamo anche che l’utente medio difficilmente avrà come preoccupazione che un estraneo possa mettere le mani sul suo computer per effettuare un attacco tramite protocollo USB. E’ molto più probabile, infatti, che in una situazione del genere il dispositivo venga sottratto interamente (es. ladri in casa) e, quindi, conterà molto di più la protezione dei dati a freddo (ad esempio la crittografia del disco).

In ambiti più promiscui, però, o in ambito aziendale, l’esigenza di avere il controllo su quali dispositivi si possono connettere tramite USB torna sicuramente utile e vi abbiamo mostrato una soluzione rapida e ben integrata: essa infatti si interfaccia con una feature del kernel già presente da anni e consente anche di mettere in atto eventuali policy aziendali che impediscano di utilizzare dispositivi USB personali (si, vi sono anche delle buone ragioni per farlo).

La sicurezza fisica totale, come detto, è complessa se non quasi impossibile da ottenere e non basterà il solo tassello appena illustrato per ottenere una protezione soddisfacente, tuttavia abbiamo appena visto che il tempo per configurare questa ulteriore misura di sicurezza è stato trascurabile e, quindi, anche se siete un normale utente domestico e non andate Bond di cognome, ci domandiamo: perchè no?

Appassionato di Linux e della cultura open-source da vent’anni, continuo a fare del mio meglio per diffondere tale filosofia e soprattutto condividere la conoscenza.

C’è sempre qualcuno da qualche parte nel mondo che sta avendo un problema che tu hai già risolto e, condividendo la soluzione, puoi fare la differenza.

Se quel qualcuno sei tu, chiedi pure alla community. La trovi ovunque, ad esempio su reddit.com/r/italyinformatica, reddit.com/r/fedora, reddit.com/r/debian, reddit.com/r/ubuntu, reddit.com/r/archlinux, reddit.com/r/linux, sui forum specifici delle distro oppure sulle loro wiki.

Perchè nessun problema andrebbe risolto più di una volta.

[https://it.linkedin.com/in/john-toscano]

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *