На данном порту 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-концентратора)
Проверьте порт 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"
Создать правило 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/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'"
Перезагрузить правила udev
udevadm control --reload-rules
Использованная литература: