Хочу создать что-то вроде "белого списка" для USB-флешек. То есть "запретить все, что не разрешено".
Я знаю, что мне следует использовать udev
правила:
- Добавьте
/etc/udev/rules.d/
правило, запрещающее использование любого USB-флеш-накопителя - Добавьте еще одно правило с большим номером, чтобы разрешить то, что я хочу
Я хочу иметь дело только с 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". Все остальное будет заблокировано.
Отказ от ответственности: я являюсь автором этого проекта.