授权(或不授权)您的 USB 设备连接到系统

版权 (C) 2007 Inaky Perez-Gonzalez <inaky@linux.intel.com> 英特尔公司

此功能允许您控制是否可以在系统中使用 USB 设备。 此功能允许您实现对 USB 设备的锁定,完全由用户空间控制。

目前,当 USB 设备连接时,它会被配置,并且其接口会立即提供给用户。 通过此修改,只有在 root 用户授权配置设备后,才可以使用它。

用法

授权设备连接

$ echo 1 > /sys/bus/usb/devices/DEVICE/authorized

取消授权设备

$ echo 0 > /sys/bus/usb/devices/DEVICE/authorized

设置连接到 hostX 的新设备默认为取消授权(即:锁定)

$ echo 0 > /sys/bus/usb/devices/usbX/authorized_default

移除锁定

$ echo 1 > /sys/bus/usb/devices/usbX/authorized_default

默认情况下,所有 USB 设备都已授权。 将“2”写入 authorized_default 属性会导致内核默认仅授权连接到内部 USB 端口的设备。

示例系统锁定(较弱)

假设您要实现一个锁定,以便只能连接 XYZ 类型的设备(例如,它是带有可见 USB 端口的自助服务终端机)

boot up
rc.local ->

 for host in /sys/bus/usb/devices/usb*
 do
    echo 0 > $host/authorized_default
 done

为新的 USB 设备挂钩一个脚本到 udev

if device_is_my_type $DEV
then
  echo 1 > $device_path/authorized
done

现在,device_is_my_type() 是锁定的核心所在。 仅仅检查类、类型和协议是否匹配某些内容是您能做的最糟糕的安全验证(或者对于想要破坏它的人来说是最好的)。 如果您需要安全的东西,请使用加密和证书身份验证或类似的东西。 存储密钥的简单方法可以是

function device_is_my_type()
{
  echo 1 > authorized          # temporarily authorize it
                               # FIXME: make sure none can mount it
  mount DEVICENODE /mntpoint
  sum=$(md5sum /mntpoint/.signature)
  if [ $sum = $(cat /etc/lockdown/keysum) ]
  then
       echo "We are good, connected"
       umount /mntpoint
       # Other stuff so others can use it
  else
       echo 0 > authorized
  fi
}

当然,这很弱,您需要使用 PKI 进行真正的证书验证,这样您就不依赖于共享密钥等等,但您明白了。 任何可以访问设备小工具包的人都可以伪造描述符和设备信息。 不要相信这一点。 不客气。

接口授权

有一种类似的方法可以允许或拒绝特定的 USB 接口。 这允许仅阻止 USB 设备的一个子集。

授权接口

$ echo 1 > /sys/bus/usb/devices/INTERFACE/authorized

取消授权接口

$ echo 0 > /sys/bus/usb/devices/INTERFACE/authorized

也可以更改特定 USB 总线上新接口的默认值。

默认允许接口

$ echo 1 > /sys/bus/usb/devices/usbX/interface_authorized_default

默认拒绝接口

$ echo 0 > /sys/bus/usb/devices/usbX/interface_authorized_default

默认情况下,interface_authorized_default 位为 1。因此,默认情况下所有接口都将被授权。

注意

如果取消授权的接口将被授权,则必须通过将 INTERFACE 写入 /sys/bus/usb/drivers_probe 来手动触发驱动程序探测

对于需要多个接口的驱动程序,应首先授权所有需要的接口。 之后,应探测驱动程序。 这避免了副作用。