Używaj urządzeń pamięci masowej tylko na wybranym porcie USB - jak to zrobić?

14

Na danym porcie USB chcę tylko akceptować możliwości pamięci masowej USB i nic więcej. Bez urządzeń HID, bez adapterów Bluetooth, bez konwerterów RS232, nic. Czy jest na to sposób, np. Używając udev? Zdaję sobie sprawę, że mogę napisać niestandardową regułę udev na tym sterownik dla danego urządzenia lub danego portu, ale mogę jakoś wykluczyć wszystkie inne sterowniki? Próbuję zezwolić tylko na jedną klasę urządzeń, a mianowicie pamięć masową USB; istnieją niezliczone różne modele urządzeń w tej klasie i nie wiem, które podłączą się do portu (klienci przyniosą własne, nie ma na to wpływu).

Zagrożenia ze strony przeprogramowanego oprogramowania USB będą się nasilać w dającej się przewidzieć przyszłości. Próbuję je złagodzić w tym przypadku: mam komputer z wewnętrznie podłączonymi urządzeniami peryferyjnymi USB (karta sieciowa, specjalistyczne urządzenia peryferyjne, klawiatura) i jednym portem USB od strony publicznej, który ma być używany tylko do przesyłania plików. Nie mogę więc całkowicie umieścić na czarnej liście innych modułów USB; ale chciałbym „zdezynfekować” ten konkretny port, aby podłączenie innego typu urządzenia nic nie zrobiło.

Obudowa jest fizycznie zablokowana, tak że tylko ten jeden konkretny port USB jest dostępny z zewnątrz, a wtrącanie się w obudowę lub podłączanie kabla klawiatury powinno być wystarczająco podejrzane, aby wywołać fizyczną reakcję bezpieczeństwa; Co więcej, nie spodziewam się, że większość użytkowników będzie aktywnie złośliwa, ale spodziewam się, że liczba nieświadomych nośników ponownie flashowanych napędów USB wzrośnie (tak jak miało to miejsce w przypadku infekcji dyskietek w sektorze rozruchowym). Jeśli chodzi o bezpieczeństwo, tak naprawdę nie ma znaczenia, czy użytkownik zabiera „uzbrojony” dysk USB ze złośliwą intencją, czy po prostu nie wie, że jest „zainfekowany”.

Wiem, że doskonałe bezpieczeństwo jest tutaj niemożliwe, a umożliwienie użytkownikowi interakcji z systemem w jakikolwiek sposób jest ryzykowne - ale niestety muszę zrównoważyć bezpieczeństwo z użytecznością: komputer musi obsługiwać klienta. Poza tym nie staram się tym bronić przed atakowanym, zdeterminowanym napastnikiem; raczej używam tego jako jednej z technik łagodzenia, aby system nie był nisko wiszący.

Piskvor opuścił budynek
źródło
2
Um. Właśnie się uczę, więc nie jestem pewien, czy to może pomóc, ale sprawdź, czy to jest istotne: „ linux-usb.org/FAQ.html ” W szczególności przewiń do „Dlaczego widzę tylko jedno urządzenie z mojego uniwersalnego urządzenia pamięci masowej „pytanie, a tam wiersz” Jeśli nie chcesz tego robić dla wszystkich urządzeń SCSI, możesz powiedzieć jądru, aby skanowało w poszukiwaniu określonego urządzenia za pomocą; echo> / proc / scsi / scsi ”scsi add-single-device 0 0 0 1 ""
Sergiy Kolodyazhnyy
1
Chcesz, aby konkretny port był zablokowany w pamięci masowej USB?
Kaz Wolfe
3
„Dzięki fizycznemu dostępowi przegrana jest bitwa o bezpieczeństwo”. ~ Każdy użytkownik Security.SE kiedykolwiek.
Kaz Wolfe
1
@Piskvor Nie jestem pewien, ale możesz mieć więcej szczęścia w znalezieniu odpowiedzi na security.stackexchange.com lub jednej z innych bardziej zaawansowanych / profesjonalnych stron.
Brian Z
2
Może to może pomóc: irongeek.com/… , szczególnie 3.2 Blokowanie Linuksa za pomocą sekcji UDEV.
alci

Odpowiedzi:

16

Wydaje się, że działa dla mnie w Ubuntu 14.04 z 2 kluczami flash i telefonem z Androidem jako pamięcią i adapterem sieciowym USB i kamerą internetową jako innym typem. (Nie mogłem przetestować umieszczenia hubu USB)

  1. Sprawdź port USB (który jest urządzeniem nadrzędnym dla podłączonego urządzenia)

    $ udevadm info --name=/dev/sdc --attribute-walk
    
      looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0':
        KERNELS=="2-1.2:1.0"
        SUBSYSTEMS=="usb"
        DRIVERS=="usb-storage"
        ATTRS{bInterfaceClass}=="08"
        ATTRS{bInterfaceSubClass}=="06"
        ATTRS{bInterfaceProtocol}=="50"
        ATTRS{bNumEndpoints}=="02"
        ATTRS{supports_autosuspend}=="1"
        ATTRS{bAlternateSetting}==" 0"
        ATTRS{bInterfaceNumber}=="00"
    
  2. Utwórz regułę udev, dopasowując nazwę jądra portu USB bez usb-storagesterownika

    /etc/udev/rules.d/90-remove-non-storage.rules

    Zezwól dowolnemu urządzeniu, które ma pamięć jako 1. interfejs (dozwolone urządzenia kompozytowe)

    KERNELS=="2-1.2:1.0", DRIVERS!="usb-storage", RUN+="/bin/sh -c 'echo 1 > /sys/bus/usb/drivers/hub/2-1\:1.0/port2/device/remove'"
    

    Zablokuj dowolne urządzenie, które nie ma interfejsu pamięci masowej (odrzucone urządzenia kompozytowe)

    W rzeczywistości telefon jest montowany jako modem do /dev/ttyACM0KERNELS == "2-1.2: 1.1". Nie pozwoli to na zamontowanie telefonów (urządzeń kompozytowych) tylko na zwykłych urządzeniach pamięci masowej.

    KERNELS=="2-1.2:1.[0-9]*", DRIVERS!="usb-storage", RUN+="/bin/sh -c 'echo 1 > /sys/bus/usb/drivers/hub/2-1\:1.0/port2/device/remove'"
    

    Blokuj tylko interfejsy, które nie są pamięcią masową (urządzenia kompozytowe są dozwolone tylko jako pamięć masowa)

    Po kilku poszukiwaniach sposobu na wyłączenie tylko niedozwolonych interfejsów. Rozpoznawanie sterowników wydaje się działać. Mój telefon może służyć tylko jako pamięć masowa, nie tworzy się /dev/ttyACM0.

    KERNELS=="2-1.2:1.[0-9]*", DRIVERS!="usb-storage", RUN+="/bin/sh -c 'echo -n %k >/sys%p/driver/unbind'"
    
  3. Przeładuj reguły udev

    udevadm control --reload-rules
    

Bibliografia:

user.dz
źródło
Pobij mnie do tego ...
Kaz Wolfe
@ Whaaaaaat, tak, authorizedteż działa, ale removejest czystszym sposobem, ponieważ użytkownik i tak je odłączy. Sprawdziłem odmontowane dyski, nadal mają one usb-storagesterownik dla węzła nadrzędnego. Zgadzam się, są przypadki, w których usb-storagenie można ich użyć. BTW, :) zużywasz zbyt wiele komentarzy (2min, 1min), możesz edytować 1. (w <5min)
user.dz
@Whaaaaaat: Kiedy to testowałem, sterownik pamięci USB został załadowany tuż przed utworzeniem urządzeń blokowych; ich montaż nie był konieczny.
Piskvor opuścił budynek
@Piskvor Czy to odpowiedziało na twoje pytanie? Jeśli tak, należy zaznaczyć to jako poprawną odpowiedź i przyznać nagrodę.
John Scott,