udev 规则仅允许一个供应商和型号的 USB 驱动器,而不允许其他驱动器

udev 规则仅允许一个供应商和型号的 USB 驱动器,而不允许其他驱动器

因此,我们正在努力在这里建立一个环境,在我们的 Linux 笔记本电脑上设置一个安全存储,这样我们的 Linux 笔记本电脑只能连接特定的 USB 驱动器:金士顿 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"

我的问题是这些规则都不起作用,而且我不知道这是否是正确的方法。

有什么想法吗?

答案1

我以前也遇到过同样的问题,但效果并不好ignore_device。我不知道为什么,所以总是选择其他解决方案。

  • 嗯,ignore_deviceudev 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 规则

答案2

注意: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- 只是一个脚本,首先检查当前存在的设备,然后检查所有其他驱动器设备,并且只有在脚本运行时才卸载。由于所有设备都是sdbsdc等,因此有办法让它适用于所有设备。


故事的寓意是:系统ignore_device在 12.04 中忽略了该选项。必须编写脚本。:/

相关内容