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

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

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

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

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

1 ответ

Решение

Похоже, что у меня работает в Ubuntu 14.04 с 2 флеш-клавишами и телефоном 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

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

    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/ttyACM0 as KERNELS=="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
    

Рекомендации:

Другие вопросы по тегам