Note
此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。
- Original:
Authorizing (or not) your USB devices to connect to the system
- 翻译:
白钶凡 Kefan Bai <baikefan@leap-io-kernel.com>
- 校译:
允许或禁止 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 设备都是授权的。向 authorized_default 属性写入
2 会使内核默认只授权连接到内部 USB 端口的设备。
系统锁定示例(简化版)¶
假设你想做一个锁定机制,只允许 XYZ 类型的设备接入(例如一台带有外露 USB 端口的自助终端):
启动系统
rc.local ->
for host in /sys/bus/usb/devices/usb*
do
echo 0 > $host/authorized_default
done
为 udev 配置一个脚本,用于处理新插入的 USB 设备:
if device_is_my_type $DEV
then
echo 1 > $device_path/authorized
fi
锁定方案是否可靠,关键全在 device_is_my_type() 的实现。仅仅检查
class、type 和 protocol 是否匹配,几乎是最差的一种安全校验方式;对想绕过
它的人来说,这种做法反而最容易伪造。如果你真要做安全控制,就该使用加密、
证书认证之类的机制。把 USB 存储设备当作“钥匙”的一个简单示例可以写成:
function device_is_my_type()
{
echo 1 > authorized # 暂时授权它
# FIXME: 确保没人能挂载它
mount DEVICENODE /mntpoint
sum=$(md5sum /mntpoint/.signature)
if [ $sum = $(cat /etc/lockdown/keysum) ]
then
echo "验证通过,已连接"
umount /mntpoint
# 再做一些额外处理,让其他人也能使用它
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来手动触发驱动探测。
对于需要多个接口的驱动程序,应先授权所有必需接口,然后再触发驱动探测。 这样做可以避免副作用。