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

14

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

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

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

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

Писквор покинул здание
источник
2
Um. Я просто изучаю материал, поэтому не уверен, что это может помочь, но посмотрите, имеет ли это значение: " linux-usb.org/FAQ.html " В частности, прокрутите до пункта "Почему я вижу только одно устройство с моего многоцелевого устройства хранения" «Вопрос и строка». Если вы не хотите делать это для всех устройств SCSI, вы можете указать ядру сканировать определенное устройство, используя: echo> / proc / scsi / scsi "scsi add-single-device 0 0 0 1 ""
Сергей Колодяжный
1
Вы хотите, чтобы определенный порт был заблокирован для USB Mass Storage?
Каз Вулф
3
«С физическим доступом битва за безопасность проиграна». ~ Каждый пользователь Security.SE когда-либо.
Каз Вулф
1
@Piskvor Я не уверен, но вам, возможно, повезет, если вы найдете ответ на security.stackexchange.com или на одном из более продвинутых / профессиональных сайтов.
Брайан З,
2
Может быть, это поможет: irongeek.com/… , особенно 3.2 Блокировка Linux с помощью раздела UDEV.
Alci

Ответы:

16

Похоже, у меня работает в 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подключается как модем к 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
    

Ссылки:

user.dz
источник
Обыграй меня ...
Каз Вулф,
@Whaaaaaat, да, authorizedтоже работает, но removeэто более чистый способ, так как пользователь все равно отключит его. Я проверил несмонтированные диски, они все еще имеют в usb-storageкачестве драйвера для родительского узла. Я согласен, есть некоторые случаи, когда usb-storageне могут быть использованы. Кстати, :) вы потребляете слишком много комментариев (2 минуты, 1 минута), вы можете отредактировать 1-й (за <5
минут
@Whaaaaaat: Когда я тестировал это, драйвер usb-хранилища был загружен прямо перед созданием блочных устройств; монтаж их не был необходим.
Писквор покинул здание
@Piskvor Это ответило на ваш вопрос? Если это так, вы должны пометить это как правильный ответ и присудить награду.
Джон Скотт