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


14

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

经过重新编程的USB固件带来的威胁只会在可预见的将来变得更糟。在这种情况下,我试图减轻它们的负担:我有一台内部连接USB外设(网卡,专用外设,键盘)和一个面向公众的USB端口的计算机,该USB端口仅用于文件传输。因此,我无法将其他USB模块完全列入黑名单。但我想“清理”该特定端口,以便插入其他设备类型将无济于事。

机箱是物理锁定的,因此只能从外部访问此特定的USB端口,并且与机箱进行干预或拼接到键盘电缆中应足够怀疑以触发物理安全响应;此外,我不希望大多数用户受到恶意软件的攻击,但是我希望不知不觉中重新刷新的USB驱动器的载体数量会增加(与以前的软启动扇区感染一样)。就安全性而言,用户携带恶意的“武器化” USB磁盘还是不知道它是否“受到感染”并不重要。

我知道完美的安全性在这里是行不通的,并且允许用户以任何方式与系统进行交互都是有风险的-但是,I,我需要在安全性和可用性之间取得平衡:计算机必须是客户端可用的。另外,我并不想以此来防御目标明确的攻击者。相反,我将其用作缓解技术之一,因此该系统并非易事。


2
嗯 我只是在学习东西,所以不确定是否有帮助,但是请查看是否相关:“ linux-usb.org/FAQ.html ”具体来说,滚动至“为什么我只能从多功能存储设备中看到一台设备“问题,并且存在”如果您不想为所有SCSI设备执行此操作,则可以告诉内核使用来扫描特定设备; echo> / proc / scsi / scsi“ scsi add-single-device 0 0 0 1“”
Sergiy Kolodyazhnyy 2014年

1
您只想将特定端口锁定到USB Mass Storage?
卡兹·沃尔夫

3
“有了物理访问,安全性的战斗就失败了。” 〜每个Security.SE用户。
卡兹·沃尔夫

1
@Piskvor我不确定,但是您可能会更愿意在security.stackexchange.com或其他更高级/面向专业的网站之一中找到答案。
Brian Z

2
也许会有所帮助:irongeek.com/…,尤其是3.2使用UDEV锁定Linux部分。
alci 2014年

Answers:


16

它似乎在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-storage驱动程序的usb端口内核名称

    /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'"
    

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

    实际上,电话会作为调制解调器安装到/dev/ttyACM0KERNELS ==“ 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
    

参考文献:


击败我...
Kaz Wolfe 2014年

@Waaaaaaat,是的,authorized它也可以工作,但是remove是一种更干净的方法,因为用户无论如何都要拔掉它。我已经检查了卸载的驱动器,它们仍然具有usb-storage作为父节点的驱动程序。我同意,在某些情况下usb-storage可能无法使用。顺便说一句,:)您消耗了太多评论(2分钟,1分钟),您可以编辑第一条评论(在<5分钟内)
user.dz 2014年

@Whaaaaaat:当我对此进行测试时,usb存储驱动程序在创建块设备之前就已加载;无需安装它们。
Piskvor在

@Piskvor这回答了您的问题吗?如果是这样,您应该将其标记为正确答案,并奖励您。
约翰·斯科特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.