USBGuard

出自 ArchWiki

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。

警告: 确保在启动/启用守护进程之前实际配置它,否则包括键盘和鼠标在内的所有 USB 设备将立即被阻止!

如果您想使用 Qt GUI 或其他通过 DBUS 通信的程序(包括 GNOME 集成),启用启动 usbguard-dbus.service

如果您只想通过 API(使用 CLI 工具或另一个使用 libusbguard 的软件)进行通信,启用启动 usbguard.service

CLI

CLI 可通过 usbguard 访问。

有关更多信息,请参阅相关的手册页。

允许蓝牙控制器

如果 USBGuard 设置为默认阻止所有 USB 设备,它也会默认阻止 btusb 控制器,因为它们使用 USB 总线进行通信。由于许多主板的蓝牙卡都是 btusb 控制器,因此可能不明显蓝牙被 USBGuard 阻止。要使蓝牙工作,您需要设置 USBGuard 以允许这些 btusb 控制器。

使用 lsusbusbutils 的一部分)查找并显示系统中 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 集成

GNOME3.36 版本以来 就内置了 USBGuard 支持。它需要 polkit 规则配置来授予 GNOME 访问权限,以及 dconf 修改以始终阻止设备,因为默认设置为允许,并且仅在锁屏时阻止。

此文章或章节的真实性存疑。

原因: 此警告是否仍然正确,或者 GNOME 是否已更改为默认允许 HID 设备?[1](在 Talk:USBGuard 中讨论)
警告: 确保首先实际生成策略(参见 #使用#规则),否则所有 USB 设备(包括键盘和鼠标输入)将立即被阻止!

授予 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))

参见