Алгоритм создания белого списка USB-флеш-накопителей состоит из 2 этапов:
Вариант 1:
- Запрет монтирования всех USB-флеш-накопителей
- Разрешение монтирования некоторых устройств
Вариант 2:
- Разрешение монтирования некоторых устройств
- Запрет монтирования всех иных USB-флеш-накопителей
Первый этап – запрет автомонтирования
Вариант с параметром UDISKS_IGNORE
Для отключения автомонтирования USB-флеш-накопителей нужно будет создать правило для udev.
Создаем файл /etc/udev/rules.d/99-usb.rules
nano /etc/udev/rules.d/99-usb.rules
со следующим содержанием:
ENV{ID_USB_DRIVER}=="usb-storage",ENV{UDISKS_IGNORE}="1"
Флаг ENV{UDISKS_IGNORE}
отвечает за «Игнорировать ли устройство». “0” – false, “1” — true
Для того, чтобы новое правило вступило в силу, нужно ввести команду обновления правил udev
sudo udevadm control --reload-rules
После этого, можете проверить и подключить USB-флеш-накопитель, как результат, он не откроется.
Вариант с изменением параметра authorized
Для отключения автомонтирования USB-флеш-накопителей нужно будет создать правило для udev и исполняемый скрипт запрета монтирования USB-флеш-накопителей.
Создадим скрипт:
nano /usr/bin/remove_usb.sh
#!/bin/bash
var=$1
var2=$(echo $1 | sed 's/.*usb[[:digit:]]//' | sed 's/[a-z].*//'| sed 's/[0-9]-[0-9].//')
echo 0 > '/sys/bus/usb/devices'$var2'authorized'
Измените права на скрипт:
chmod +x /usr/bin/remove_usb.sh
Параметр authorized
отвечает за монтирование USB-флеш-накопителя в момент подключения к ПК.
Создаем файл /etc/udev/rules.d/99-usb.rules
nano /etc/udev/rules.d/99-usb.rules
со следующим содержанием:
ENV{ID_USB_DRIVER}=="usb-storage",RUN+="/bin/sh -c '/usr/bin/remove_usb.sh $devpath'"
Для того, чтобы новое правило вступило в силу, нужно ввести команду обновления правил udev
sudo udevadm control --reload-rules
После этого, можете проверить и подключить USB-флеш-накопитель, как результат, он не откроется.
Примеры выбора устройств по определенным свойствам
Для создания белого списка USB-флеш-накопителей, нужно знать атрибуты накопителя.
1) Определяем нашу флешку:
ls -l /dev/sd* brw-rw---- 1 root disk 8, 0 июн 30 12:59 /dev/sda brw-rw---- 1 root disk 8, 1 июл 22 12:59 /dev/sda1 brw-rw---- 1 root disk 8, 2 июл 22 12:59 /dev/sda2 brw-rw---- 1 root disk 8, 3 июн 30 12:59 /dev/sda3 brw-rw---- 1 root disk 8, 16 июл 22 13:43/dev/sdb # нужная нам строка brw-rw---- 1 root disk 8, 17 июн 30 13:43 /dev/sdb1
2) Смотрим атрибуты:
udevadm info -a -p /sys/block/sdb #символы после sd* вводите в соответствии с вашим выводом $ ls -l /dev/sd*
Вариант составления белого списка по первому варианту
Выборка разрешения доступа по трем параметрам:
— серийному номеру устройства
— модели
— максимальному потребления тока
Для их определения выполним команды по очереди:
udevadm info -a -p /sys/block/sdb | grep serial udevadm info -a -p /sys/block/sdb | grep model udevadm info -a -p /sys/block/sdb | grep bMaxPower
в выводе мы увидим серийный номер, модель и значение максимального потребления тока:
ATTRS{serial}=="04GS1F3LBIBDWU05"
ATTRS{model}=="Silicon-Power8G "
ATTRS{bMaxPower}=="200mA"
Запишем эти значения в файл правил в качестве разрешающих
Конечный вариант файла /etc/udev/rules.d/99-usb.rules:
ENV{ID_USB_DRIVER}=="usb-storage",ENV{UDISKS_IGNORE}="1" ATTRS{serial}=="04GS1F3LBIBDWU05",ENV{UDISKS_IGNORE}="0" ATTRS{model}=="Silicon-Power8G ",ENV{UDISKS_IGNORE}="0" ATTRS{bMaxPower}=="200mA",ENV{UDISKS_IGNORE}="0"
Здесь:
1 - блокируем все usb-накопители 0 - разрешаем накопитель по определенным свойствам.
Для того чтобы новое правило вступило в силу, нужно ввести команду обновления правил udev
sudo udevadm control --reload-rules
Полный список атрибутов, по которым можно осуществить выборку, находится в выводе команды:
udevadm info -a -p /sys/block/sdb
Вариант составления списка по второму варианту
Выборка по серийному номеру устройства
ATTRS{serial}=="0DM97KDQ", GOTO="dont_remove_usb"
Выборка по названию модели. Точное название смотрите в выводе команды
udevadm info -a -p /sys/block/sdb
ATTRS{model}=="Transcend 16GB ", GOTO="dont_remove_usb"
Для удобства, когда полный список параметров устройства известен, можно производить отбор по конкретному параметру:
udevadm info -a -p /sys/block/sdb | grep "ATTRS{serial}"
udevadm info -a -p /sys/block/sdb | grep "ATTRS{model}"
Конечный вариант файла /etc/udev/rules.d/99-usb.rules:
ACTION!="add", GOTO="dont_remove_usb" ENV{ID_USB_DRIVER}!="usb-storage", GOTO="dont_remove_usb" ATTRS{model}=="Transcend 16GB ", GOTO="dont_remove_usb" ATTRS{serial}=="0DM97KDQ", GOTO="dont_remove_usb" ENV{ID_USB_DRIVER}=="usb-storage", RUN+="/bin/sh -c '/usr/bin/remove_usb.sh $devpath'" LABEL="dont_remove_usb"
Логика данного правила отлична от первого варианта. В 1 варианте происходило блокирование сразу всех usb флеш-накопителей и лишь потом разграничение на белый список шло. В данном варианте сначала происходит разграничение на белый список. Только потом добавление устройства в черный список. Такое действие связано с тем, что параметр authorized
появляется в момент монтирования и если его изменить в 0, то далее он становится недоступен. Соответственно, сначала требуется проверить подходит флешка под белый список и если да, то разрешить ей монтирование.
Для того, чтобы новое правило вступило в силу, нужно ввести команду обновления правил udev
sudo udevadm control --reload-rules
Полный список атрибутов, по которым можно осуществить выборку, находится в выводе команды:
udevadm info -a -p /sys/block/sdb