Белый список для USB-флешек с использованием udev

Белый список для USB-флешек с использованием udev

Хочу создать что-то вроде "белого списка" для USB-флешек. То есть "запретить все, что не разрешено".

Я знаю, что мне следует использовать 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, поэтому изменения должны вступить в силу мгновенно. Но никаких изменений не произошло.

решение1

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

Вот пример правил 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. Вы не указали свой дистрибутив, но он, по-видимому, отличается.

решение2

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

Поскольку 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". Все остальное будет заблокировано.

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

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