![使用 udev 将 USB 闪存列入白名单](https://linux22.com/image/1388191/%E4%BD%BF%E7%94%A8%20udev%20%E5%B0%86%20USB%20%E9%97%AA%E5%AD%98%E5%88%97%E5%85%A5%E7%99%BD%E5%90%8D%E5%8D%95.png)
我想为 USB 闪存盘创建类似“白名单”的东西。我的意思是“拒绝所有不允许的东西”。
我知道我应该使用udev
规则:
- 添加
/etc/udev/rules.d/
规则以拒绝所有 USB 闪存驱动器 - 添加另一条具有更高数字的规则以允许我想要的操作
我只想处理 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 设备。其他所有内容都将被阻止。
免责声明:我是该项目的作者。