Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

4.12. 使用 USBGuard

USBGuard 软件框架通过实施基于设备属性的基本白名单和黑名单功能,提供对入侵 USB 设备的系统保护。要强制执行用户定义的策略,USBGuard 使用 Linux 内核 USB 设备授权功能。USBGuard 框架提供以下组件:
  • 带有进程间通信(IPC)接口的守护进程组件,用于动态交互和策略强制执行。
  • 与正在运行的 USBGuard 实例交互的命令行界面。
  • 编写 USB 设备授权策略的规则语言。
  • 用于与共享库中实施的守护进程交互的 C++ API。

4.12.1. 安装 USBGuard

要安装 usbguard 软件包,请以 root 用户身份输入以下命令:
~]# yum install usbguard
要创建初始规则集,请以 root 用户身份输入以下命令:
~]# usbguard generate-policy > /etc/usbguard/rules.conf
注意
要自定义 USBGuard 规则集,请编辑 /etc/usbguard/rules.conf 文件。详情请查看 usbguard-rules.conf (5) 手册页。另外,请参阅 第 4.12.3 节 “使用规则语言创建您自己的策略”
要启动 USBGuard 守护进程,请以 root 用户身份输入以下命令:
~]# systemctl start usbguard.service
~]# systemctl status usbguard
● usbguard.service - USBGuard daemon
   Loaded: loaded (/usr/lib/systemd/system/usbguard.service; disabled; vendor preset: disabled)
   Active: active (running) since Tue 2017-06-06 13:29:31 CEST; 9s ago
     Docs: man:usbguard-daemon(8)
 Main PID: 4984 (usbguard-daemon)
   CGroup: /system.slice/usbguard.service
           └─4984 /usr/sbin/usbguard-daemon -k -c /etc/usbguard/usbguard-daem...
要确保 USBGuard 在系统启动时自动启动,请以 root 用户身份运行以下命令:
~]# systemctl enable usbguard.service
Created symlink from /etc/systemd/system/basic.target.wants/usbguard.service to /usr/lib/systemd/system/usbguard.service.
要列出 USBGuard 识别的所有 USB 设备,请以 root 用户身份输入以下命令:
~]# usbguard list-devices
1: allow id 1d6b:0002 serial "0000:00:06.7" name "EHCI Host Controller" hash "JDOb0BiktYs2ct3mSQKopnOOV2h9MGYADwhT+oUtF2s=" parent-hash "4PHGcaDKWtPjKDwYpIRG722cB9SlGz9l9Iea93+Gt9c=" via-port "usb1" with-interface 09:00:00
...
6: block id 1b1c:1ab1 serial "000024937962" name "Voyager" hash "CrXgiaWIf2bZAU+5WkzOE7y0rdSO82XMzubn7HDb95Q=" parent-hash "JDOb0BiktYs2ct3mSQKopnOOV2h9MGYADwhT+oUtF2s=" via-port "1-3" with-interface 08:06:50
要授权设备与系统交互,请使用 allow-device 选项:
~]# usbguard allow-device 6
要取消授权并从系统中删除设备,请使用 reject-device 选项。要只取消授权设备,请使用带有 block-device 选项的 usbguard 命令:
~]# usbguard block-device 6
usbguard 使用 blockreject 术语,其含义如下:
  • block - 暂时不要与这个设备通信
  • reject - 忽略这个设备,就像不存在一样
要查看 usbguard 命令的所有选项,请使用 --help 指令输入它:
~]$ usbguard --help

4.12.2. 创建白名单列表和黑名单列表

usbguard-daemon.conf 文件由 usbguard 守护进程加载,在解析其命令行选项后,用于配置守护进程的运行时参数。要覆盖默认配置文件(/etc/usbguard/usbguard-daemon.conf),请使用 -c 命令行选项。详情请查看 usbguard-daemon (8) 手册页。
要创建白名单或黑色列表,请编辑 usbguard-daemon.conf 文件并使用以下选项:

usbguard 配置文件

RuleFile=<path>
usbguard 守护进程使用此文件从中加载策略规则集,并编写通过 IPC 接口接收的新规则。
IPCAllowedUsers=<username> [<username> ...]
守护进程将接受来自的 IPC 连接的用户名列表。
IPCAllowedGroups=<groupname> [<groupname> ...]
守护进程将接受来自的 IPC 连接的组名称列表。
IPCAccessControlFiles=<path>
保存 IPC 访问控制文件的目录的路径。
ImplicitPolicyTarget=<target>
如何对待策略中的任何规则都不匹配的设备。接受的值: allow、block、reject。
PresentDevicePolicy=<policy>
如何处理守护进程启动时已连接的设备:
  • Allow - 授权每个存在的设备
  • block - 取消授权每个存在的设备
  • reject - 删除每个存在的设备
  • keep - 只同步内部状态并保留它
  • apply-policy - 评估每个存在设备的规则集
PresentControllerPolicy=<policy>
如何处理守护进程启动时已连接的 USB 控制器:
  • Allow - 授权每个存在的设备
  • block - 取消授权每个存在的设备
  • reject - 删除每个存在的设备
  • keep - 只同步内部状态并保留它
  • apply-policy - 评估每个存在设备的规则集

例 4.5. usbguard 配置

以下配置文件订购 usbguard 守护进程从 /etc/usbguard/rules.conf 文件中加载规则,它只允许 usbguard 组中的用户使用 IPC 接口:
RuleFile=/etc/usbguard/rules.conf
IPCAccessControlFiles=/etc/usbguard/IPCAccessControl.d/
要指定 IPC 访问控制列表(ACL),请使用 usbguard add-userusbguard remove-user 命令。如需了解更多详细信息,请参阅 usbguard (1)。在本例中,要允许 usbguard 组中的用户修改 USB 设备授权状态、列出 USB 设备、侦听异常事件以及列出 USB 授权策略,请以 root 用户身份输入以下命令:
~]# usbguard add-user -g usbguard --devices=modify,list,listen --policy=list --exceptions=listen
重要
守护进程提供 USBGuard 公共 IPC 接口。在 Red Hat Enterprise Linux 中,对此接口的访问默认仅限于 root 用户。考虑设置 IPCAccessControlFiles 选项(推荐)或 IPCAllowedUsersIPCAllowedGroups 选项,来限制对 IPC 接口的访问。不要将 ACL 保留为未配置,因为这会向所有本地用户公开 IPC 接口,并允许他们操作 USB 设备的授权状态并修改 USBGuard 策略。
如需更多信息,请参阅 usbguard-daemon.conf (5) 手册页中的 IPC 访问控制部分。

4.12.3. 使用规则语言创建您自己的策略

usbguard 守护进程决定是否根据一组规则定义的策略授权 USB 设备。当 USB 设备插入系统时,守护进程会按顺序扫描现有规则,并在找到匹配规则时,根据规则目标授权(allows)、取消授权(阻止)或删除(拒绝)设备。如果没有找到匹配的规则,则决定基于隐式默认目标。这个隐式默认为阻止设备,直到用户做出决定。
规则语言 grammar 如下:
rule ::= target device_id device_attributes conditions.

target ::= "allow" | "block" | "reject".

device_id ::= "*:*" | vendor_id ":*" | vendor_id ":" product_id.

device_attributes ::= device_attributes | attribute.
device_attributes ::= .

conditions ::= conditions | condition.
conditions ::= .
有关规则语言(如 target、设备规格或设备属性)的详情,请查看 usbguard-rules.conf (5) 手册页。

例 4.6. usbguard 示例策略

允许 USB mass 存储设备以及阻止所有其他设备
这个策略会阻止任何不仅仅是一个大容量存储设备的设备。USB 闪存磁盘中带有隐藏键盘接口的设备被阻止。只有具有单个大容量存储接口的设备才能与操作系统交互。该策略由一个规则组成:
allow with-interface equals { 08:*:* }
阻塞是隐式的,因为没有块规则。隐式阻止对桌面用户很有用,因为侦听 USBGuard 事件的桌面小程序可以询问用户是否为设备选择了隐式目标。
允许通过特定端口连接特定的 Yubikey 设备
拒绝该端口上的所有其他操作。
allow 1050:0011 name "Yubico Yubikey II" serial "0001234567" via-port "1-2" hash "044b5e168d40ee0245478416caf3d998"
reject via-port "1-2"
拒绝具有可疑接口组合的设备
实施键盘或网络接口的 USB 闪存磁盘非常可疑。以下一组规则形成了一个策略,它允许 USB 闪存磁盘,并使用额外的可疑接口明确拒绝设备。
allow with-interface equals { 08:*:* }
reject with-interface all-of { 08:*:* 03:00:* }
reject with-interface all-of { 08:*:* 03:01:* }
reject with-interface all-of { 08:*:* e0:*:* }
reject with-interface all-of { 08:*:* 02:*:* }
注意
黑名单是错误的方法,您不应该只将一组设备列入黑名单,并允许其余设备。上面的策略假定阻止是隐式默认值。拒绝一组设备被视为"bad"是一种良好的方法,如何将系统暴露限制尽可能多。
允许只使用键盘的 USB 设备
只有已经允许使用键盘接口的 USB 设备时,以下规则才允许键盘 USB 设备。
allow with-interface one-of { 03:00:01 03:01:01 } if !allowed-matches(with-interface one-of { 03:00:01 03:01:01 })
使用 usbguard generate-policy 命令生成初始策略后,编辑 /etc/usbguard/rules.conf 来自定义 USBGuard 策略规则。
~]$ usbguard generate-policy > rules.conf
~]$ vim rules.conf
要安装更新的策略并使您的更改有效,请使用以下命令:
~]# install -m 0600 -o root -g root rules.conf /etc/usbguard/rules.conf

4.12.4. 其它资源

有关 USBGuard 的更多信息,请参阅以下文档:
  • usbguard (1) 手册页
  • usbguard-rules.conf(5) man page
  • usbguard-daemon (8) 手册页
  • usbguard-daemon.conf(5) man page