Как использовать запоминающие устройства только на выбранном USB-порту?

Как использовать запоминающие устройства только на выбранном USB-порту?

На данном порту USB я хочу принимать только возможности USB Mass Storage и ничего больше. Никаких устройств HID, никаких адаптеров Bluetooth, никаких преобразователей RS232, ничего. Есть ли способ сделать это, например, с помощью udev? Я знаю, что могу написать пользовательское правило udev длявключаядрайвер для данного устройства или данного порта, но могу ли я как-тоисключатьвсе остальные водители? Я пытаюсь разрешить только одинсортустройств, а именно USB Mass Storage; в этом классе существует множество различных моделей устройств, и я не знаю, какие из них будут подключаться к порту (клиенты привезут свои собственные, я не могу на это повлиять).

Угрозы от перепрограммированной прошивки USBв обозримом будущем только ухудшатся. Я пытаюсь смягчить их для этого варианта использования: у меня есть компьютер с внутренними подключенными USB-периферийными устройствами (сетевая карта, специализированные периферийные устройства, клавиатура) и один публичный USB-порт, который должен использоваться только для передачи файлов. Поэтому я не могу внести в черный список все остальные USB-модули; но я хотел бы «очистить» этот конкретный порт, чтобы подключение другого типа устройства не приводило ни к чему.

Корпус физически заблокирован, так что только этот один конкретный порт USB доступен снаружи, и вмешательство в корпус или подключение к кабелю клавиатуры должно быть достаточно подозрительным, чтобы вызвать физическое реагирование службы безопасности; более того, я не ожидаю, что большинство пользователей будут активно злонамеренными, но я ожидаю, что число невольных носителей перепрошитых USB-накопителей увеличится (как это было с заражением загрузочных секторов дискет в былые времена). Что касается безопасности, то на самом деле не имеет значения, приносит ли пользователь «вооруженный» USB-диск со злым умыслом или просто не знает, что он «заражён».

Я понимаю, что идеальная безопасность здесь невозможна, и что разрешить пользователю взаимодействовать с системой влюбойспособ рискованный - но увы, мне нужно сбалансировать безопасность с удобством использования: компьютер должен быть пригоден для использования клиентом. Кроме того, я не пытаюсь защититься от целенаправленного, решительного злоумышленника с помощью этого; скорее, я использую это как один из методов смягчения, так что система не является легкодоступной.

решение1

Кажется, у меня это работает в Ubuntu 14.04 с двумя флэш-клавишами и телефоном Android в качестве хранилища, а также сетевым USB-адаптером и веб-камерой в качестве другого типа.(Я не смог проверить установку USB-концентратора)

  1. Проверьте порт USB (который является родительским устройством для подключенного устройства)

    $ 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. Создать правило udev, соответствующее имени ядра порта USB без usb-storageдрайвера

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

    Разрешить любое устройство, имеющее хранилище в качестве первого интерфейса(Разрешены составные устройства)

    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'"
    

    Блокировать любые устройства, не имеющие интерфейса хранения данных. (Композитные устройства отклонены)

    На самом деле, телефон монтируется как модем к /dev/ttyACM0KERNELS=="2-1.2:1.1". Это не позволит монтировать телефоны (составные устройства), будут монтироваться только простые устройства хранения данных.

    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'"
    

    Блокировать только те интерфейсы, которые не являются хранилищем (Композитные устройства разрешены только в качестве хранилища)

    После некоторых поисков способа отключить только неразрешенные интерфейсы. Отвязка драйвера, похоже, работает. Мой телефон можно использовать только как хранилище, он не создает /dev/ttyACM0.

    KERNELS=="2-1.2:1.[0-9]*", DRIVERS!="usb-storage", RUN+="/bin/sh -c 'echo -n %k >/sys%p/driver/unbind'"
    
  3. Перезагрузить правила udev

    udevadm control --reload-rules
    

Использованная литература:

Связанный контент