跳转至内容

USBGuard

来自 ArchWiki
(从 Usbguard 重定向)

USBGuard 提供了一个 USB 设备白/黑名单机制。其灵感来源于 BadUSB 等漏洞利用。它利用了 Linux 内核中包含的设备阻止基础设施,并由一个守护进程和一些前端组成。

安装

安装 usbguard 包。

官方的 Qt 小程序已从 USBGuard 中移除,并被 usbguard-notifierAUR取代。一个非官方的、分叉的 Qt 小程序版本可作为 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 连接的惠普打印机的示例可能如下所示

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 包含一个核心守护进程、一个命令行接口、一个 DBUS 接口以及一个通过 libusbguard 提供的 API。

警告 在启动/启用守护进程之前,请务必进行配置,否则所有 USB 设备(包括键盘和鼠标)将立即被阻止!

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

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

CLI

可以通过 usbguard 使用 CLI。

有关更多信息,请参阅相应的 man 页。

允许蓝牙控制器

如果 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 是否已更改为默认允许 HID 设备?[1] (请在 Talk:USBGuard 中讨论)
警告 在启动/启用守护进程之前,请务必生成策略(参见 #Usage#Rules),否则所有 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 (一个反取证的紧急停止开关,它会等待 USB 端口发生变化,然后立即关闭计算机)
  • silk-guardian-dkmsAUR (未知 USB 设备的紧急停止开关 (DKMS))

参见