授權(或不授權)您的 USB 裝置連線到系統¶
版權所有 (C) 2007 Inaky Perez-Gonzalez <inaky@linux.intel.com> Intel Corporation
此功能允許您控制 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 做真正的證書驗證,這樣您就不依賴共享金鑰等,但您懂這個意思。任何可以訪問裝置 gadget 套件的人都可以偽造描述符和裝置資訊。不要相信那些。不客氣。
介面授權¶
有一種類似的方法來允許或拒絕特定的 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 來手動觸發驅動程式探測。
對於需要多個介面的驅動程式,應首先授權所有必需的介面。之後才應探測驅動程式。這可以避免副作用。