USBGuard
USBGuard 提供了一种 USB 设备的白名单/黑名单机制。其灵感来源于 BadUSB 等漏洞。它利用 Linux 内核中包含的设备阻止基础设施,由一个守护进程和一些前端组成。
安装
安装 usbguard 软件包,或 usbguard-gitAUR 以获取开发版本。
官方的 Qt 小程序已从 USBGuard 移除,并被 usbguard-notifierAUR 替代。Qt 小程序的非官方 fork 版本以 usbguard-qtAUR 的形式提供。
配置
主配置文件位于 /etc/usbguard/usbguard-daemon.conf
。
如果您想通过 IPC 控制守护进程,请务必将您的用户名添加到 IPCAllowedUsers
或将您的组添加到 IPCAllowedGroups
以使规则持久化。在大多数情况下,您需要这样做。
默认情况下,PresentDevicePolicy
设置为 apply-policy
,以便 USBGuard 为每个连接的设备评估规则集。这是最安全的设置,即使守护进程重启也能确保安全。或者,可以将该键设置为 allow
,以便阻止所有新连接的设备,但保持守护进程之前连接的设备不变。要临时允许新设备,请使用 usbguard set-parameter ImplicitPolicyTarget allow
。
使用键 ImplicitPolicyTarget
,您可以配置设备的默认处理方式(如果没有规则匹配)。这里最安全的选择是 block
。
有关配置的深入文档,请参阅注释非常完善的配置文件。
规则
要根据您的需要配置 USBGuard,您可以编辑 /etc/usbguard/rules.conf
。但是,通常不需要手动编辑规则。您可以通过以 root 身份执行 usbguard generate-policy > /etc/usbguard/rules.conf
,根据当前连接的 USB 设备生成规则集。
规则语法在 此处 进行了正式解释。一个通过 USB 连接的 hp 打印机的示例可能如下所示
allow id 03f0:0c17 serial "00CNFD234631" name "hp LaserJet 2020" hash "a0ef07fceb6fb77698f79a44a450121m" parent-hash "69d19c1a5733a31e7e6d9530e6k434a6" with-interface { 07:01:03 07:01:02 07:01:01 }
规则以策略开头。allow
将设备列入白名单,block
阻止设备立即被处理,而 reject
从系统中移除设备。然后是一组属性及其选项,如下详述。
属性 | 描述 |
---|---|
id usb-device-id | 匹配 USB 设备 ID。 |
id [operator] { usb-device-id ... } | 匹配一组 USB 设备 ID。 |
hash "value" | 匹配从设备属性值和 USB 描述符数据计算出的哈希值。哈希值由 USBGuard 为每个设备计算。 |
hash [operator] { "value" ... } | 匹配一组设备哈希值。 |
parent-hash "value" | 匹配父设备的哈希值。 |
parent-hash [operator] { "value" ... } | 匹配一组父设备哈希值。 |
name "device-name" | 匹配 USB 设备名称属性。 |
name [operator] { "device-name" ... } | 匹配一组 USB 设备名称。 |
serial "serial-number" | 匹配 USB iSerial 设备属性。 |
serial [operator] { "serial-number" ... } | 匹配一组 USB iSerial 设备属性。 |
via-port "port-id" | 匹配设备连接的 USB 端口。请注意,某些系统的端口编号不稳定,会在系统重启或某些内核模块重新加载后发生变化(也可能在其他情况下)。如果您想确保设备通过特定父设备连接,请使用 parent-hash 属性。 |
via-port [operator] { "port-id" ... } | 匹配一组 USB 端口。 |
with-interface interface-type | 匹配 USB 设备提供的接口类型。 |
with-interface [operator] { interface-type interface-type ... } | 将一组接口类型与 USB 设备提供的一组接口进行匹配。 |
使用
USBGuard 具有核心守护进程、CLI、DBUS 接口和通过 libusbguard 提供的 API。
如果您想使用 Qt GUI 或其他通过 DBUS 通信的程序(包括 GNOME 集成),启用 并 启动 usbguard-dbus.service
。
如果您只想通过 API(使用 CLI 工具或另一个使用 libusbguard 的软件)进行通信,启用 并 启动 usbguard.service
。
CLI
CLI 可通过 usbguard
访问。
有关更多信息,请参阅相关的手册页。
允许蓝牙控制器
如果 USBGuard 设置为默认阻止所有 USB 设备,它也会默认阻止 btusb
控制器,因为它们使用 USB 总线进行通信。由于许多主板的蓝牙卡都是 btusb
控制器,因此可能不明显蓝牙被 USBGuard 阻止。要使蓝牙工作,您需要设置 USBGuard 以允许这些 btusb
控制器。
使用 lsusb
(usbutils 的一部分)查找并显示系统中 USB 总线的信息。这应该显示类似这样的内容
$ lsusb
Bus 001 Device 001: ID 0000:0001 Linux Foundation 2.0 root hub Bus 001 Device 002: ID 0000:0002 Intel Corp. Bluetooth 9460/9560 Jefferson Peak (JfP) Bus 002 Device 001: ID 0000:0003 Linux Foundation 3.0 root hub
我们对蓝牙设备感兴趣。记下其 ID(在本例中为 0000:0002
,但这可能会有所不同),并将 USBGuard 设置为允许此 ID
# usbguard allow-device -p 0000:0002
GNOME 集成
GNOME 自 3.36 版本以来 就内置了 USBGuard 支持。它需要 polkit 规则配置来授予 GNOME 访问权限,以及 dconf 修改以始终阻止设备,因为默认设置为允许,并且仅在锁屏时阻止。
授予 GNOME 访问 USBGuard 守护进程的权限
通过创建以下文件,授权在分配了 wheel
组的用户下运行的 GNOME Shell 访问 USBGuard
/etc/polkit-1/rules.d/70-allow-usbguard.rules
// Allow users in wheel group to communicate with USBGuard polkit.addRule(function(action, subject) { if ((action.id == "org.usbguard.Policy1.listRules" || action.id == "org.usbguard.Policy1.appendRule" || action.id == "org.usbguard.Policy1.removeRule" || action.id == "org.usbguard.Devices1.applyDevicePolicy" || action.id == "org.usbguard.Devices1.listDevices" || action.id == "org.usbguard1.getParameter" || action.id == "org.usbguard1.setParameter") && subject.active == true && subject.local == true && subject.isInGroup("wheel")) { return polkit.Result.YES; } });
polkit 守护进程本身会自动拾取对 polkit 规则的更改。
开启 GNOME USB 保护
如果 USBGuard 服务存在并且启用了此设置,则 USB 设备将按照 usb-protection-level 设置中配置的方式受到保护。通过运行以下命令启用它
$ gsettings set org.gnome.desktop.privacy usb-protection true
默认阻止所有 USB 设备
如果设置为 lockscreen
,则仅当出现锁屏界面时才会拒绝新的 USB 设备;如果设置为 always
,则始终拒绝所有新的 USB 设备。通过运行以下命令拒绝所有新的 USB 设备
$ gsettings set org.gnome.desktop.privacy usb-protection-level always
相关项目
- usbkill-gitAUR(一种反取证的 kill-switch,它等待您的 USB 端口上的更改,然后立即关闭您的计算机)
- silk-guardian-dkmsAUR(未知 usb 设备的 kill switch (DKMS))