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 使用 block 和 reject 术语,其含义如下:
- 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-user 或 usbguard 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
选项(推荐)或 IPCAllowedUsers
和 IPCAllowedGroups
选项,来限制对 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 pageusbguard-daemon (8)
手册页usbguard-daemon.conf(5)
man page