3

Я хочу создать что-то вроде "белого списка" для флешек. Я имею в виду «отрицать все, что не разрешено».

Я знаю, что должен использовать правила udev :

  1. Добавьте в /etc/udev/rules.d/ правило, запрещающее каждую USB-флешку
  2. Добавьте другое правило с большим номером, чтобы разрешить то, что я хочу

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

Но я не знаю, что мне следует писать в файлы правил. Вы можете сделать пример?

UPD. Я создаю файл со следующим содержанием:

deck@crunch /etc/udev/rules.d $ cat 90-deny-usbflash.rules 
BUS=="usb", OPTIONS+="ignore_device"

Как я знаю, udev просматривает эту папку с помощью inotify поэтому изменения вступают в силу мгновенно. Но никаких изменений не произошло.

2 ответа2

3

Вы не сказали, было ли установлено другое программное обеспечение, которое автоматически монтирует все диски. Мое решение ниже предполагает, что вы этого не делаете. Если вы это сделаете, то ваша проблема в другом: вы должны указать, что это такое, чтобы кто-то мог подсказать, как его удалить или контролировать.

Вот пример правил udev для монтирования только разрешенных дисков (не проверено, но основано на аналогичных правилах, которые я использую):

#-- Skip if not an appropriate "sd" device
KERNEL!="sd[b-z]*", GOTO="99_exit"
SUBSYSTEM!="block", GOTO="99_exit"

#-- Handle 'remove' and 'change' events
SUBSYSTEMS=="usb", ACTION=="remove", RUN+="/usr/bin/pumount /dev/%k", GOTO="99_exit"
ACTION=="remove|change", GOTO="99_exit"

#-- Create useful environment variables
SUBSYSTEMS=="usb", ENV{ID_SERIAL}!="?*", IMPORT{builtin}="usb_id"
SUBSYSTEMS=="usb", ENV{ID_FS_LABEL}!="?*", IMPORT{program}="/sbin/blkid -o udev -p %N"

#-- Skip if this is not a filesystem (e.g. if this is the whole drive, not a formatted partition)
ENV{ID_FS_USAGE}!="filesystem", GOTO="99_exit"

#-- Mount only allowed drives:
SUBSYSTEMS=="usb", ACTION=="add", ENV{ID_FS_LABEL}=="something_allowed", RUN+="/usr/bin/sudo -u someuser /usr/bin/pmount -t vfat /dev/%k /media/some_name"
SUBSYSTEMS=="usb", ACTION=="add", ENV{ID_FS_LABEL}=="other_allowed", RUN+="/usr/bin/sudo -u someuser /usr/bin/pmount -t vfat /dev/%k /media/other_name"

#-- Exit
LABEL="99_exit"

Команда монтирования, которую вы используете, конечно, зависит от ваших предпочтений. Тот, который я показал, является только примером.

ОБНОВЛЕНИЕ: я понял из ваших комментариев, что у вас есть что-то установленное, что делает автомонтирование. В моей системе (Debian Wheezy) нет. Я попробовал предложенный вами grep и получил другой результат. В /lib/udev/rules.d/80-udisks.rules я нашел этот раздел кода:

# Mark devices that shouldn't be automounted / autoassembled etc.
#
# Deny all, then punch holes for what looks like physical drives
# (TODO: this heuristic might need some work)
#

ENV{UDISKS_PRESENTATION_NOPOLICY}="1"
KERNEL=="sd*|hd*|sr*|mmcblk*|mspblk*", ENV{DISKS_PRESENTATION_NOPOLICY}="0"

Это говорит о том, что, если бы у меня было установлено программное обеспечение для автоматического монтирования, оно могло бы управляться переменной среды UDISKS_PRESENTATION_NOPOLICY. Вы не указали свой дистрибутив, но он явно отличается.

1

Вы можете попробовать USBGuard. Он реализует черный / белый список устройств USB поверх UDev и инфраструктуры авторизации USB ядра Linux. Вы можете добиться того же, используя UDev, как уже предлагалось, но USBGuard - это специальный инструмент для этой работы, в котором есть язык правил и (необязательный) апплет GUI.

Так как флеш-накопители USB обычно имеют серийный номер, белый список, использующий VID:PID и серийный номер, будет выглядеть следующим образом в usbguard:

allow 1234:5678 serial "123456" with-interface equals { 08:*:* }
allow 1234:5678 serial "abcdef" with-interface equals { 08:*:* }
block

Это позволило бы (авторизовать) для подключения двух USB-устройств только с интерфейсом запоминающего устройства, VID:PID или 1234:5678 и значением iSerial либо "123456", либо "abcdef". Все остальное будет заблокировано.

Отказ от ответственности: я автор этого проекта.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .