Правила udev разрешают использование USB-накопителя только одного производителя и модели, но не разрешают другие
Итак, мы работаем над созданием среды, в которой у нас есть безопасная система хранения на наших ноутбуках с Linux, чтобы наши ноутбуки с Linux могли подключать только определенный USB-накопитель: Kingston DataTraveler 2.0. Поставщик: Код модели это (из lsusb
): Bus 003 Device 003: ID 0951:1665 Kingston Technology
Я пытался заставить эти правила работать, но в среде 12.04 правила не работают. (Обратите внимание, что я сделал комментарии с #
предварительно добавленные строки, но их нет в файлах udev):
# If a device is NOT a Kingston drive, ignore it.
SUBSYSTEMS=="usb", DRIVERS=="usb", ATTRS{idVendor}!="0951", OPTIONS+="ignore_device"
# If a device is a Kingston drive, but is NOT the model we have, ignore it.
SUBSYSTEMS=="usb", DRIVERS=="usb", ATTRS{idVendor}=="0951", ATTRS{idProduct}!="1665", OPTIONS+="ignore_device"
# If a device is a Kingston drive and is the model we have, then run a script
SUBSYSTEMS=="usb", DRIVERS=="usb", ATTRS{idVendor}=="0951", ATTRS{idProduct}=="1665", RUN+="/lib/udev/syslog-authorized-device-connected.sh"
У меня проблема в том, что ни одно из этих правил не работает, и я понятия не имею, является ли это правильным подходом для этого.
Мысли?
2 ответа
Я сталкивался до того же проблемы с неэффективным ignore_device
, Я не мог понять, почему тогда я всегда иду с другими решениями.
Что ж,
ignore_device
удалено с помощью выпуска udev 148. См. информацию о выпуске или журнал измененийЕсли вы заметили, все темы, предлагающие его использование, старые (~ 2009 г.).
Быстрая альтернатива заключается в использовании:
ENV{UDISKS_PRESENTATION_HIDE}="1"
(Ubuntu 12.04). Для выпусков (>=12.10), которые включаютudisks2
использовать:ENV{UDISKS_IGNORE}="1"
,Ссылка: Archlinux Wiki: Udisks
Другие решения используют SYSFS. Или device/authorized
(как упомянул solsTiCe), device/remove
или же driver/unbind
, См. Использование только запоминающих устройств на выбранном USB-порту - как?
Сложность заключается в том, как запретить все хранилища, кроме только одной марки / модели. Таким образом, условие соответствия правила должно фильтровать один узел устройства, не более и не менее (без дочерних или родительских устройств). Вот почему я добавил KERNELS=="[1-9]*-[0-9]*"
KERNELS=="[1-9]*-[0-9]*", SUBSYSTEMS=="usb", DRIVERS=="usb", ATTRS{idVendor}!="0951", ENV{UDISKS_PRESENTATION_HIDE}="1"
KERNELS=="[1-9]*-[0-9]*", SUBSYSTEMS=="usb", DRIVERS=="usb", ATTRS{idVendor}=="0951", ATTRS{idProduct}!="1665", ENV{UDISKS_PRESENTATION_HIDE}="1"
Ну а UDisks скрывает только монтажный крючок. Это может быть лучше при использовании отвода драйвера SYSFS.
KERNELS=="[1-9]*-[0-9]*", SUBSYSTEMS=="usb", DRIVERS=="usb", ATTRS{idVendor}!="125f", ENV{IF_STORAGE_REMOVE_ME}="1"
KERNELS=="[1-9]*-[0-9]*", SUBSYSTEMS=="usb", DRIVERS=="usb", ATTRS{idVendor}=="125f", ATTRS{idProduct}!="c96a", ENV{IF_STORAGE_REMOVE_ME}="1"
ENV{IF_STORAGE_REMOVE_ME}=="1", DRIVERS=="usb-storage", DRIVER=="sd", RUN+="/bin/sh -c 'echo -n %k >/sys%p/driver/unbind'"
Ссылка: правило udev с несколькими атрибутами родительского устройства
ПРИМЕЧАНИЕ: устарел от ответа Sneetsher. Этот ответ оставлен здесь по наследственным причинам.
Итак, я решил это, и это была боль.
Я пересмотрел ограничения в моих правилах и изменил функциональность. По-видимому, 12.04 не соблюдает ignore_device
вариант. Итак, я импровизировал и написал сценарий размонтирования. Поскольку в этих системах есть только один функциональный порт USB, в итоге мы получим следующее, которое, я ЗНАЮ, может сломать другие вещи:
/etc/udev/rules.d/100-restrict-usb-devices.rules
# If a device is NOT a Kingston drive, ignore it.
ACTION=="add", ATTRS{idVendor}!="0951", OPTIONS+="ignore_device", RUN+="/usr/bin/logger UnauthorizedUSBConnected", RUN+="/lib/udev/unmount.sh"
# If a device is a Kingston drive, but is NOT the model we have, ignore it.
ACTION=="add", ATTRS{idVendor}=="0951", ATTRS{idProduct}!="1665", OPTIONS+="ignore_device", RUN+="/usr/bin/logger UnauthorizedUSBConnected", RUN+="/lib/udev/unmount.sh"
# If a device is a Kingston drive and is the model we have, then run a script
ACTION=="add", ATTRS{idVendor}=="0951", ATTRS{idProduct}=="1665", RUN+="/lib/udev/syslog-authorized-device-connected.sh", RUN+="/usr/bin/logger AuthorizedUSBConnected"
/lib/udev/unmount.sh
- Просто сценарий, который сначала проверяет существующие устройства, а затем проверяет все остальные устройства и отключает их, если и только если сценарий запускается. Поскольку все устройства будут sdb
, sdc
и т.д. есть способы заставить это работать для всего.
Мораль истории: система игнорирует ignore_device
вариант в 12.04. Должен все сценарий.:/