USBGuard – zarządzanie urządzeniami USB

Przypomnijmy sobie scenę z Mr. Robot – Darlene, siostra głównego bohatera w celu włamania się do systemu więziennego rozrzuca przed wejściem popularne pendrive’y. Oczywiście każdy techniczny pracownik, a nawet osoba czytająca portale o zabarwieniu technicznym wie, że nie należy wpinać urządzeń USB nieznanego pochodzenia do komputera – a szczególnie do takiego, na którym nam zależy. […]

Przypomnijmy sobie scenę z Mr. Robot – Darlene, siostra głównego bohatera w celu włamania się do systemu więziennego rozrzuca przed wejściem popularne pendrive’y. Oczywiście każdy techniczny pracownik, a nawet osoba czytająca portale o zabarwieniu technicznym wie, że nie należy wpinać urządzeń USB nieznanego pochodzenia do komputera – a szczególnie do takiego, na którym nam zależy. Mimo że wiedza ta z pozoru jest oczywista, to w rzeczywistości użytkownicy udowadniają, że status najsłabszego ogniwa w łańcuchu bezpieczeństwa nie został im nadany bez powodu.

Atak Darlene nie powiódł się, gdyż będąc pod presją czasu, stworzyła złośliwe oprogramowanie niskiej jakości, które zostało wyłapane przez oprogramowanie antywirusowe.

Działania Darlene w ogóle nie doszłyby do skutku, gdyby systemy więzienne działały na systemie Linux z dobrze skonfigurowanym USBGuradem.

Czym zatem jest USBGuard?

USBGuard jest projektem mającym na celu implementacje polityk autoryzacji (pozwolenia na dostęp) urządzeń USB, jak i polityk użytkowania (tego, w jaki sposób zadane urządzenie może działać w systemie).

Sam USBGuard ma następujące możliwości:
Whitelistowanie – wypisanie, jakie urządzenia USB mogą się z systemem komunikować.
Blacklist – wpisy uniemożliwiające podłączanie się zadanemu typowi, producentowi urządzeń itd.
Notyfikowanie – USBGurad umożliwia wyzwolenie (trigger) żądanych akcji, gdy zajdzie interesujące nas wydarzenie (np. wpięcie). Jest to bardzo przydatne w celach audytowych, a także w celach wysyłania automatycznych powiadomień.

Jako ciekawostkę należy dodać fakt, iż USBGurad jest w wersji 0.7 – developerskiej. Mimo to został on umieszczony przez wiodących producentów Linuksa klasy Enterprsie.

Instalacja i konfiguracja

Na potrzeby tego artykułu użyjemy dystrybucji EuroLinux w wersji 7.4, identycznie sytuacja wyglądałaby w pozostałych dystrybucjach z rodziny Enterprise Linux (RHEL, Oracle Linux, CentOS). W repozytoriach w standardzie znajdziemy odpowiednią paczkę. W celu jej zainstalowania wraz z dependencjami używamy np. poczciwego menadżera pakietów yum.

yum install usbguard

W celu uruchomienia i włączenia usługi używamy podkomendy systemd – systemctl.

# systemctl enable usbguard
Created symlink from /etc/systemd/system/basic.target.wants/usbguard.service to /usr/lib/systemd/system/usbguard.service.

Istotne jest jednak, by wygenerować politykę przed uruchomieniem usługi. W przeciwnym razie USBGurad wyłączy część lub całość naszych urządzeń USB. Co więcej, nawet po zatrzymaniu usługi wciąż nie będziemy mieli do nich dostępu!

Teraz wygenerujemy domyślną politykę, która pozwoli nam na używanie urządzenia USB i bezpiecznego włączenia usługi.

# usbguard generate-policy > '/etc/usbgurad/rules.conf'

Mając teraz domyślną politykę pozwalającą nam na podłączenie tylko tych urządzeń, które są już wpięte, możemy bezpiecznie wystartować usługę.

Polityki USBGuard są oparte o język polityk. By o nim poczytać, możemy skorzystać ze strony projektu i jej dokumentacji lub użyć manuala systemowego.

man usbguard-rules.conf

Poniższe przykłady pozwolę sobie przedstawić przy pomocy mojej myszy i klawiatury. Specjalnie na rzecz tego artykułu chciałem, by nasza mysz i klawiatura była jednego producenta.

By zobaczyć podłączone urządzenia, użyjemy podkomendy list-devices. Wyciągnę część odpowiedzialną za mysz i klawiaturę.

# usbguard list-devices
...
32: allow id 1532:005c serial "" name "mysz" hash "psUe5vbM3XiaB5lJviw4t548LPb+Bymc5sSJrQ8tlrE=" parent-hash "jEP/6WzviqdJ5VSeTUY8PatCNBKeaREvo2OqdplND/o=" via-port "3-2" with-interface { 03:01:02 03:00:01 03:00:01 }
33: allow id 1532:011c serial "" name "klawiatura" hash "hVvzrMsshQc4yKXQYMmulQfk2U2HwDlYpaV7fgyYfaI=" parent-hash "jEP/6WzviqdJ5VSeTUY8PatCNBKeaREvo2OqdplND/o=" via-port "3-1" with-interface { 03:01:01 03:00:01 03:00:02 }

W ramach eksperymentu proponuję zamienić, oczywiście w ramach możliwości, klawiaturę z myszą portami USB. Okaże się, że w takim wypadku żadne z nich nie zadziała. Przy pomocy 3 klawiatury pozwolę sobie wypisać listę podłączonych urządzeń.

# usbguard list-devices
...
34: block id 1532:011c serial "" name "klawiatura" hash "hVvzrMsshQc4yKXQYMmulQfk2U2HwDlYpaV7fgyYfaI=" parent-hash "jEP/6WzviqdJ5VSeTUY8PatCNBKeaREvo2OqdplND/o=" via-port "3-2" with-interface { 03:01:01 03:00:01 03:00:02 }
35: block id 1532:005c serial "" name "mysz" hash "psUe5vbM3XiaB5lJviw4t548LPb+Bymc5sSJrQ8tlrE=" parent-hash "jEP/6WzviqdJ5VSeTUY8PatCNBKeaREvo2OqdplND/o=" via-port "3-1" with-interface { 03:01:02 03:00:01 03:00:01 }

Jak widać porty i interfejsy zamieniły się miejscami.

Spójrzmy do manuala i przeczytajmy nasz plik polityk. Pozwolę sobie wyciągnąć tylko moją mysz i klawiaturę.

# cat /etc/usbguard/rules.conf
allow id 1532:011c serial "" name "klawiatura" hash "hVvzrMsshQc4yKXQYMmulQfk2U2HwDlYpaV7fgyYfaI=" parent-hash "jEP/6WzviqdJ5VSeTUY8PatCNBKeaREvo2OqdplND/o=" via-port "3-1" with-interface { 03:01:01 03:00:01 03:00:02 }
allow id 1532:005c serial "" name "mysz" hash "psUe5vbM3XiaB5lJviw4t548LPb+Bymc5sSJrQ8tlrE=" parent-hash "jEP/6WzviqdJ5VSeTUY8PatCNBKeaREvo2OqdplND/o=" via-port "3-2" with-interface { 03:01:02 03:00:01 03:00:01 }

Po usunięciu via-port, with-interface oraz parent-hash otrzymamy.

allow id 1532:011c serial "" name "klawiatura" hash "hVvzrMsshQc4yKXQYMmulQfk2U2HwDlYpaV7fgyYfaI="
allow id 1532:005c serial "" name "mysz" hash "psUe5vbM3XiaB5lJviw4t548LPb+Bymc5sSJrQ8tlrE="

Po restarcie usługi jesteśmy w stanie wpiąć naszą mysz i klawiaturę do dowolnego portu USB.

Blacklist

Lista, którą obecnie stosujemy, jest tzw. białą listą. Wszystkie urządzenia są blokowane, dopóki się na niej nie znajdą.

Innym typem listowania jest listowanie czarnolistowe. W tym wypadku domyślną polityką jest zezwolenie, dopóki coś nie znajdzie się na liście blokującej.

W celu zmiany domyślnej polityki edytujemy plik /etc/usbguard/usbguard-daemon.conf i zmieniamy w nim parametr ImplicitPolicyTarget

+ ImplicitPolicyTarget=allow
- ImplicitPolicyTarget=block

Możemy teraz zmienić naszą politykę dotyczącą myszy oraz klawiatury na blokującą, co da nam:

block id 1532:011c serial "" name "klawiatura" hash "hVvzrMsshQc4yKXQYMmulQfk2U2HwDlYpaV7fgyYfaI="
block id 1532:005c serial "" name "mysz" hash "psUe5vbM3XiaB5lJviw4t548LPb+Bymc5sSJrQ8tlrE="

Po restarcie usługi i ponownym wpięciu urządzeń nie będziemy mieli do nich dostępu :) Z kolei wszystkie inne urządzenia będą działać bez zarzutu.

Chciałbym jednak przypomnieć, że stosowanie blacklist jest z reguły bardziej uciążliwe i mniej skuteczne niż stosowanie whitelist.

Podsumowanie

Bezpieczeństwo naszych danych leży nie tylko w rękach administratorów, ale przede wszystkim użytkowników. Nie mniej administratorzy mogą mitygować zagrożenia przy pomocy dostępnych środków. Jednym z takich środków jest przedstawiony USBGuard, który co prawda nie uchroni nas przed USB Killerem (urządzeniem mającym uszkodzić komputer, albo przynajmniej „wypalić” port USB), ale utrudnia atak przez urządzenia USB, a także wynoszenie danych z firmy przy pomocy nieautoryzowanych nośników.

blank Autorzy

Artykuły na blogu są pisane przez osoby z zespołu EuroLinux. 80% treści zawdzięczamy naszym developerom, pozostałą część przygotowuje dział sprzedaży lub marketingu. Dokładamy starań, żeby treści były jak najlepsze merytorycznie i językowo, ale nie jesteśmy nieomylni. Jeśli zauważysz coś wartego poprawienia lub wyjaśnienia, będziemy wdzięczni za wiadomość.