第 12 章 保护系统免受USB设备的入侵

USB设备可能加载了间谍软件、恶意软件或木马程序,从而窃取你的数据或破坏你的系统。作为Red Hat Enterprise Linux的管理员,你可以用USBGuard来防止这种USB攻击。

12.1. USBGuard

使用USBGuard软件框架,您可以通过使用基于内核中USB设备授权功能的允许和禁止设备的基本列表来保护您的系统免受USB设备的入侵。

USBGuard框架提供了以下组件。

  • 具有进程间通信(IPC)接口的系统服务组件,用于动态交互和策略执行。
  • 与正在运行的usbguard系统服务进行交互的命令行界面。
  • 编写USB设备授权策略的规则语言
  • 用于与共享库中实现的系统服务组件交互的C++ API。

usbguard系统服务配置文件(/etc/usbguard/usbguard-daemon.conf)包括授权用户和组使用 IPC 接口的选项。

重要

系统服务提供USBGuard公共IPC接口。在 Red Hat Enterprise Linux 中,默认情况下,这个界面的访问只限于 root 用户。

考虑设置IPCAccessControlFiles选项(推荐)或IPCAllowedUsersIPCAllowedGroups选项来限制对IPC接口的访问。

确保您不要未配置访问控制列表 (ACL),因为这将 IPC 接口暴露给所有本地用户,并允许他们操纵 USB 设备的授权状态和修改 USBGuard 策略。

12.2. 安装USBGuard

使用此步骤安装并启动USBGuard框架。

流程

  1. 安装usbguard软件包。

    # yum install usbguard
  2. 创建一个初始规则集。

    # usbguard generate-policy > /etc/usbguard/rules.conf
  3. 启动usbguard守护进程并确保它在启动时自动启动。

    # systemctl enable --now usbguard

验证步骤

  1. 确认usbguard服务正在运行。

    # systemctl status usbguard
    ● usbguard.service - USBGuard daemon
       Loaded: loaded (/usr/lib/systemd/system/usbguard.service; enabled; vendor preset: disabled)
       Active: active (running) since Thu 2019-11-07 09:44:07 CET; 3min 16s ago
         Docs: man:usbguard-daemon(8)
     Main PID: 6122 (usbguard-daemon)
        Tasks: 3 (limit: 11493)
       Memory: 1.2M
       CGroup: /system.slice/usbguard.service
               └─6122 /usr/sbin/usbguard-daemon -f -s -c /etc/usbguard/usbguard-daemon.conf
    
    Nov 07 09:44:06 localhost.localdomain systemd[1]: Starting USBGuard daemon...
    Nov 07 09:44:07 localhost.localdomain systemd[1]: Started USBGuard daemon.
  2. 列出USBGuard 识别的 USB 设备。

    # usbguard list-devices
    4: allow id 1d6b:0002 serial "0000:02:00.0" name "xHCI Host Controller" hash...

其它资源

  • usbguard(1)andusbguard-daemon.conf(5)man pages

12.3. 使用CLI阻止和授权USB设备。

本程序概述了如何使用usbguard命令授权和禁止USB设备。

先决条件

  • usbguard 服务已安装并运行。

流程

  1. 列出USBGuard 识别的 USB 设备。

    # 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
  2. 授权设备6与系统交互。

    # usbguard allow-device 6
  3. 解除授权并移除设备6:

    # usbguard reject-device 6
  4. 解除授权并保留设备6

    # usbguard block-device 6
注意

USBGuard使用的阻塞拒绝术语具有以下含义。

  • 阻止:暂时不要与该设备进行交互。
  • 拒绝:忽略这个设备,好像它不存在一样。

其它资源

  • 列出usbguard命令的所有选项。

    $ usbguard --help
  • usbguard(1)man page

12.4. 永久封堵并授权USB设备。

您可以使用-p选项永久封堵并授权USB设备。这将为当前策略添加一个特定设备的规则。

先决条件

  • usbguard 服务已安装并运行。

流程

  1. 配置SELinux,允许usbguard守护进程编写规则。

    1. 显示与usbguard相关的语义布尔。

      # semanage boolean -l | grep usbguard
      usbguard_daemon_write_conf     (off  ,  off)  Allow usbguard to daemon write conf
      usbguard_daemon_write_rules    (on   ,   on)  Allow usbguard to daemon write rules
    2. 可选:如果usbguard_daemon_write_rules布尔值被关闭,则将其打开。

      # semanage boolean -m --on usbguard_daemon_write_rules
  2. 列出USBGuard 识别的 USB 设备。

    # 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
  3. 永久授权设备6与系统交互。

    # usbguard allow-device 6 -p
  4. 永久性地解除授权并移除设备6:

    # usbguard reject-device 6 -p
  5. 永久解除授权并保留该装置6:

    # usbguard block-device 6 -p
注意

USBGuard使用的术语blockreject具有以下含义。

  • 阻止:暂时不要与该设备进行交互。
  • 拒绝:忽略这个设备,好像它不存在一样。

验证

  1. 检查USBGuard规则是否包含您所做的更改。

    # usbguard list-rules

其它资源

  • 列出usbguard命令的所有选项。

    $ usbguard --help
  • usbguard(1)man page

12.5. 为USB设备创建自定义策略

以下程序包含为USB设备创建规则集的步骤,该规则集反映了您的场景要求。

先决条件

  • usbguard 服务已安装并运行。
  • /etc/usbguard/rules.conf 文件包含了由usbguard generate-policy 命令生成的初始规则集。

流程

  1. 创建一个授权当前连接的USB设备的策略,并将生成的规则存储到rule.conf文件中。

    # usbguard generate-policy --no-hashes > ./rules.conf

    --no-hashes 选项不会为设备生成哈希属性。在配置设置中避免使用哈希属性,因为它们可能不会持久化。

  2. 用你选择的文本编辑器编辑rule.conf文件,例如。

    # vi ./rules.conf
  3. 根据需要添加、删除或编辑规则。例如,以下规则只允许具有单一大容量存储接口的设备与系统交互。

    allow with-interface equals { 08:*:* }

    请参阅usbguard-rules.conf(5)man 页面,了解详细的规则语言描述和更多的例子。

  4. 安装更新后的政策。

    # install -m 0600 -o root -g root rules.conf /etc/usbguard/rules.conf
  5. 重新启动usbguard守护进程来应用你的更改。

    # systemctl restart usbguard

验证步骤

  1. 检查您的自定义规则是否在活动策略中,例如。

    # usbguard list-rules
    ...
    4: allow with-interface 08:*:*
    ...

其它资源

  • usbguard-rules.conf(5)man page

12.6. 为USB设备创建结构化的自定义策略

您可以在/etc/usbguard/rules.d/目录下的多个.conf文件中组织您的自定义USBGuard策略。然后usbguard-daemon将主规则.conf文件与目录内的.conf文件按字母顺序合并。

先决条件

  • usbguard 服务已安装并运行。

流程

  1. 创建一个授权当前连接的USB设备的策略,并将生成的规则存储到一个新的.conf文件中,例如。 政策.conf.

    # usbguard generate-policy --no-hashes > ./policy.conf

    --no-hashes 选项不会为设备生成哈希属性。在配置设置中避免使用哈希属性,因为它们可能不会持久化。

  2. 显示 policy.conf文件,例如用你选择的文本编辑器。

    # vi ./policy.conf
    ...
    allow id 04f2:0833 serial "" name "USB Keyboard" via-port "7-2" with-interface { 03:01:01 03:00:00 } with-connect-type "unknown"
    ...
  3. 将选定的行移动到一个单独的.conf文件中。

    注意

    文件名开头的两位数字指定了守护进程读取配置文件的顺序。

    例如,将键盘的规则复制到一个新的.conf文件中。

    # grep "USB Keyboard" ./policy.conf > ./10keyboards.conf
  4. 将新策略安装到/etc/usbguard/rules.d/目录中。

    # install -m 0600 -o root -g root 10keyboards.conf /etc/usbguard/rules.d/10keyboards.conf
  5. 将剩下的行移到主规则.conf文件中。

    # grep -v "USB Keyboard" ./policy.conf > ./rules.conf
  6. 安装其余规则。

    # install -m 0600 -o root -g root rules.conf /etc/usbguard/rules.conf
  7. 重新启动usbguard守护进程来应用你的更改。

    # systemctl restart usbguard

验证步骤

  1. 显示所有活动的USBGuard规则。

    # usbguard list-rules
    ...
    15: allow id 04f2:0833 serial "" name "USB Keyboard" hash "kxM/iddRe/WSCocgiuQlVs6Dn0VEza7KiHoDeTz0fyg=" parent-hash "2i6ZBJfTl5BakXF7Gba84/Cp1gslnNc1DM6vWQpie3s=" via-port "7-2" with-interface { 03:01:01 03:00:00 } with-connect-type "unknown"
    ...
  2. 显示rules.conf文件的内容以及/etc/usbguard/rules.d/目录下的所有.conf文件。

    # cat /etc/usbguard/rules.conf /etc/usbguard/rules.d/*.conf
  3. 验证活动规则是否包含文件中的所有规则,并且顺序正确。

其它资源

  • usbguard-rules.conf(5)man page

12.7. 授权用户和组使用 USBGuard IPC 接口。

使用此过程可授权特定用户或组使用 USBGuard 公共 IPC 接口。默认情况下,只有root用户可以使用这个界面。

先决条件

  • usbguard 服务已安装并运行。
  • /etc/usbguard/rules.conf 文件包含了由usbguard generate-policy 命令生成的初始规则集。

流程

  1. 用你选择的文本编辑器编辑/etc/usbguard/usbguard-daemon.conf文件。

    # vi /etc/usbguard/usbguard-daemon.conf
  2. 例如,添加一行规则,允许轮组中的所有用户使用IPC接口,并保存文件。

    IPCAllowGroups=wheel
  3. 您也可以使用usbguard命令添加用户或组。例如,下面的命令使joesec用户能够完全访问DeviceExceptions部分。此外,joesec还可以列出当前的政策并监听政策信号。

    # usbguard add-user joesec --devices ALL --policy list,list listen --exceptions ALL

    要删除joesec用户的权限,请使用usbguard remove-user joesec命令。

  4. 重新启动usbguard守护进程来应用你的更改。

    # systemctl restart usbguard

其它资源

  • usbguard(1)andusbguard-rules.conf(5)man pages

12.8. 将USBguard授权事件记录到Linux审计日志中。

使用以下步骤将 USBguard 授权事件的日志记录集成到标准的 Linux 审计日志中。默认情况下,usbguard守护进程将事件记录到/var/log/usbguard/usbguard-audit.log文件中。

先决条件

  • usbguard 服务已安装并运行。
  • auditd 服务正在运行。

流程

  1. 用你选择的文本编辑器编辑usbguard-daemon.conf文件。

    # vi /etc/usbguard/usbguard-daemon.conf
  2. AuditBackend 选项从 FileAudit 改为 LinuxAudit

    AuditBackend=LinuxAudit
  3. 重新启动usbguard守护进程以应用配置更改。

    # systemctl restart usbguard

验证步骤

  1. 例如,查询审计守护进程日志,查看USB授权事件。

    # ausearch -ts recent -m USER_DEVICE

其它资源

  • usbguard-daemon.conf(5)man page

12.9. 其它资源

  • usbguard(1)usbguard-rules.conf(5)usbguard-daemon(8)usbguard-daemon.conf(5)的手册页。
  • USBGuard主页

为了尽快向用户提供最新的信息,本文档可能会包括由机器自动从英文原文翻译的内容。如需更多信息,请参阅此说明。