必须三层协同:禁用usb-storage/uas模块、用udev规则屏蔽接口类08/06/50、限制udisks2挂载权限并移出disk组;缺一不可,否则易被绕过。

彻底禁用所有USB存储介质(U盘、移动硬盘)的读写,在Linux上不能只靠单一手段——单禁模块、单写udev规则或单改权限,都容易被绕过。必须三层协同生效:内核层阻断模块加载、设备层拦截接口类识别、用户层切断挂载与块设备访问路径。
禁用 usb-storage 和 uas 内核模块
这是最底层、最有效的拦截点。这两个模块不加载,绝大多数U盘和移动硬盘连 /dev/sdX 节点都不会生成。
- 临时验证可用:
sudo modprobe -r usb-storage uas;若报“模块正被使用”,先sudo umount /dev/sdX* - 永久屏蔽(推荐):在
/etc/modprobe.d/blacklist.conf中添加:blacklist usb-storage blacklist uas install usb-storage /bin/false install uas /bin/false
- 关键一步:修改后必须更新 initramfs,否则重启无效:
sudo update-initramfs -u(Debian/Ubuntu)或sudo dracut --force(RHEL/Fedora)
用 udev 规则屏蔽 USB 接口类 08/06/50
即使模块没加载,某些设备仍可能触发内核事件或短暂生成 /dev/sdX。udev 可在设备接入瞬间撤销授权,比仅设 UDISKS_IGNORE 更彻底。
- 新建规则:
sudo nano /etc/udev/rules.d/99-disable-usb-storage.rules - 写入这条规则(直接禁用设备授权,覆盖所有标准大容量存储):
SUBSYSTEM=="usb", ATTR{bInterfaceClass}=="08", ATTR{bInterfaceSubClass}=="06", ATTR{bInterfaceProtocol}=="50", RUN+="/bin/sh -c 'echo 0 > /sys$DEVPATH/authorized'" - 重载规则:
sudo udevadm control --reload-rules && sudo udevadm trigger - 注意:别用
ATTRS{idVendor}或ATTRS{idProduct}匹配——这只能封特定型号,而08/06/50是USB大容量存储标准,覆盖更全
限制 udisks2 挂载权限与 disk 组访问
这是纵深防御的关键一环。防止设备被识别后仍被普通用户挂载,或通过 sudo dd if=/dev/sdX 直接读取原始数据。
- 确保
/etc/udisks2/udisks2.conf中有:[defaults] allow_user_mount=false
- 将目标用户从
disk组移出:sudo gpasswd -d username disk(否则仍可通过sudo访问块设备) - 检查
/etc/fstab,删除任何含/dev/sdX的自动挂载条目 - 若系统启用
udisks2,还需确认其未被 systemd 用户实例绕过(如systemctl --user stop udisks2并禁用)
真正难绕过的禁用,依赖三者同时生效:模块不加载 → 设备不授权 → 用户无权访问节点。最容易被忽略的是 initramfs 更新和 disk 组清理——前者导致重启后策略失效,后者让高级用户仍能绕过挂载限制直接读写设备。











