仅在选定的USB端口上使用大容量存储设备 – 如何使用?

在给定的USB端口上,我只想接受USB大容量存储function,而不是其他任何function。 没有HID设备,没有蓝牙适配器,没有RS232转换器,什么都没有。 有没有办法做到这一点,例如使用udev? 我知道我可以编写一个自定义udev规则来包含给定设备或给定端口的驱动程序,但是我可以以某种方式排除所有其他驱动程序吗? 我试图只允许一设备,即USB Mass Storage; 这个类中有无数不同的设备型号,我不知道哪个会连接到端口(客户端会自带,我没办法影响这个)。

重新编程的USB固件的威胁只会在可预见的未来变得更糟。 我试图为这个用例缓解它们:我有一台带有内部连接USB外围设备的计算机(网卡,专用外围设备,键盘)和一个面向公众的USB端口,它只能用于文件传输。 所以,我不能完全将其他USB模块列入黑名单; 但是我想“清理”那个特定的端口,这样插入不同的设备类型就什么也不做了。

shell是物理锁定的,因此只能从外部访问这一个特定的USB端口,并且插入shell或拼接到键盘电缆应该足够可疑以触发物理安全响应; 此外,我不认为大多数用户会主动恶意,但我预计重新闪存的USB驱动器的不知情载体的数量会增加(就像以前的软盘引导扇区感染一样)。 就安全性而言,用户是否带有恶意意图的“武器化”USB磁盘,或者只是不知道它被“感染”并不重要。

我知道完美的安全性在这里是不可行的,并允许用户以任何方式与系统交互是有风险的 – 但是,我需要平衡安全性与可用性:计算机需要客户端可用。 而且,我并不是想用这个来防御目标明确的攻击者; 相反,我正在使用它作为缓解技术之一,因此系统不是低调的结果。

它似乎适用于Ubuntu 14.04,带有2个闪存键和Android手机作为存储,usb网络适配器和网络摄像头作为其他类型。 (我无法测试放置USB集线器)

  1. 检查USB端口(这是插入设备的父设备)

    $ udevadm info --name=/dev/sdc --attribute-walk looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0': KERNELS=="2-1.2:1.0" SUBSYSTEMS=="usb" DRIVERS=="usb-storage" ATTRS{bInterfaceClass}=="08" ATTRS{bInterfaceSubClass}=="06" ATTRS{bInterfaceProtocol}=="50" ATTRS{bNumEndpoints}=="02" ATTRS{supports_autosuspend}=="1" ATTRS{bAlternateSetting}==" 0" ATTRS{bInterfaceNumber}=="00" 
  2. 创建udev规则,匹配usb端口内核名称而不使用usb-storage驱动程序

    /etc/udev/rules.d/90-remove-non-storage.rules

    允许任何具有存储作为第一个接口的设备(允许使用复合设备)

     KERNELS=="2-1.2:1.0", DRIVERS!="usb-storage", RUN+="/bin/sh -c 'echo 1 > /sys/bus/usb/drivers/hub/2-1\:1.0/port2/device/remove'" 

    阻止任何具有非存储接口的设备(拒绝复合设备)

    实际上,Phone作为调制解调器安装到/dev/ttyACM0如KERNELS ==“2-1.2:1.1”。 这不会让手机(复合设备)只挂载简单的存储设备。

     KERNELS=="2-1.2:1.[0-9]*", DRIVERS!="usb-storage", RUN+="/bin/sh -c 'echo 1 > /sys/bus/usb/drivers/hub/2-1\:1.0/port2/device/remove'" 

    仅阻止非存储的接口 (允许复合设备仅作为存储)

    经过一番搜索后,只能禁用非允许的接口。 驱动程序取消绑定似乎工作。 我的手机只能用作存储,它不会创建/dev/ttyACM0

     KERNELS=="2-1.2:1.[0-9]*", DRIVERS!="usb-storage", RUN+="/bin/sh -c 'echo -n %k >/sys%p/driver/unbind'" 
  3. 重新加载udev规则

     udevadm control --reload-rules 

参考文献:

  • udev – Linux动态设备管理
  • 第13章动态内核设备:使用udev进行管理
  • 启动时禁用特定的PCI设备
  • 手动驱动程序绑定和解除绑定
  • sysfs描述以及如何使用