Правила 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. Должен все сценарий.:/

Другие вопросы по тегам