使用 udev 将 USB 闪存列入白名单

使用 udev 将 USB 闪存列入白名单

我想为 USB 闪存盘创建类似“白名单”的东西。我的意思是“拒绝所有不允许的东西”。

我知道我应该使用udev规则:

  1. 添加/etc/udev/rules.d/规则以拒绝所有 USB 闪存驱动器
  2. 添加另一条具有更高数字的规则以允许我想要的操作

我只想处理 USB 闪存驱动器。规则可以基于 USB 驱动器的任何信息。我​​的意思是供应商 ID、序列号。我的意思是我对这个案子没有任何期望。任何解决方案。

但我不知道应该在规则文件中写入什么。你能举个例子吗?

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

你可以尝试USB卫士。它在 UDev 和 Linux 内核 USB 授权框架之上实现了 USB 设备黑名单/白名单。您可以使用已经提出的 UDev 实现相同的功能,但 USBGuard 是专门用于该任务的工具,它具有规则语言以及一个(可选的) GUI 小程序。

由于 USB 闪存盘通常都有序列号,因此在 usbguard 中使用 VID:PID 和序列号进行白名单设置将会像这样:

allow 1234:5678 serial "123456" with-interface equals { 08:*:* }
allow 1234:5678 serial "abcdef" with-interface equals { 08:*:* }
block

这将允许(授权)仅使用大容量存储接口、VID:PID 或 1234:5678 以及 iSerial 值为“123456”或“abcdef”连接两个 USB 设备。其他所有内容都将被阻止。

免责声明:我是该项目的作者。

相关内容