USBGUARD项目编译环境配置
# USBGUARD项目编译环境配置
# 1. 主要目录结构
kylin@kylinV10:/data$ (项目搭建在根目录下的data目录里)
data
│
├── tq_usb
│ ├── thirdparty(三方库目录)
│ │ ├── build.sh
│ │ ├── libhv_new(libhv 第三方库)
│ │ ├── libqb
│ │ ├── libsodium
│ │ ├── libxml2-master
│ │ ├── openssl-1.0.2g
│ │ ├── protobuf
│ │ ├── util-linux-smxa
│ │ └── xz-5.2.5(lzma 第三方库)
│ ├── make_package(制作安装包的目录)
│ │ ├── 安装注意事项.txt
│ │ ├── config.json
│ │ ├── copy_file.sh(拷贝文件脚本)
│ │ ├── Packager.py(制作安装包的脚本)
│ │ └── res
│ ├── usbdesktop(编译桌面程序)
│ │ ├── build.sh
│ │ ├── run.sh
│ ├── power_reg(编译注册程序)
│ ├── tqFireWall(编译防火墙拦截)
│ │ ├── command(要编译)
│ │ ├── kernelmod(要编译)
│ │ └── usermod(不用编译)
│ ├── usbguard
│ │ ├── autogen.sh
│ │ └── init_build.sh
├── lost+found
├── root
└── usershare
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 2. 编译项目前的配置
运行第三方库脚本安装前的前置条件:
sudo apt -y install libdbus-1-dev
sudo apt -y install libpolkit-gobject-1-dev
sudo apt -y install libglib2.0-dev
2
3
# 3. 运行三方库的脚本
在 /data/tq_usb/thirdparty
路径下找到build.sh
脚本
建议现在每个三方库目录里面创建一个 do_build 目录,已经有 do_build 目录的就不用管,如果没有 do_build 目录执行脚本会报找不到第三方库的问题!
cd /data/tq_usb/thirdparty
执行以下命令
# 最新版可以一键编译
./build.sh x86_64 kylin
# kylin x86_64 环境用以下命令
./build.sh x86_64 kylin findmnt
./build.sh x86_64 kylin ssl
./build.sh x86_64 kylin lzma
./build.sh x86_64 kylin xml2
./build.sh x86_64 kylin qb
./build.sh x86_64 kylin protobuf
./build.sh x86_64 kylin sodium
./build.sh x86_64 kylin hv
# kylin aarch64 环境用以下命令
./build.sh aarch64 kylin findmnt
./build.sh aarch64 kylin ssl
./build.sh aarch64 kylin lzma
./build.sh aarch64 kylin lzma
./build.sh aarch64 kylin xml2
./build.sh aarch64 kylin qb
./build.sh aarch64 kylin protobuf
./build.sh aarch64 kylin sodium
./build.sh aarch64 kylin hv
# UOS mips 环境用以下命令
./build.sh mips kylin findmnt
./build.sh mips kylin ssl
./build.sh mips kylin lzma
./build.sh mips UOS lzma
./build.sh mips UOS xml2
./build.sh mips UOS qb
./build.sh mips UOS protobuf
./build.sh mips UOS sodium
./build.sh mips UOS hv
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 3.1 缺少 automake-1.16 包的问题
执行脚本有可能会报缺少 automake-1.16
表明在尝试编译 xz-5.2.5 这个软件包时,automake-1.16 工具没有在您的系统上找到。automake 是 GNU Automake 包的一部分,它用于生成 Makefile.in 文件,这是由 autoconf 用于生成最终 Makefile 的基础文件。要解决这个问题,需要安装 GNU Automake 包以及它的依赖项。
# 执行
sudo apt-get install automake autoconf2.13 m4 perl
2
# 3.2 No package 'libxml-2.0' found 的问题
如果执行 ./build.sh x86_64 kylin
脚本命令出现如下错误,就往 3.3 步骤继续走
# 3.3 undefined macro : AC MSG_ERROR 的问题
就找到每一个库,进入该第三方库就行单独编译,./autogen.sh
脚本,如果还出现以下错误
# 输入以下命令
sudo apt-get install autoconf-archive
2
出现如下图所示就表示编译通过
如果还无法解决可以参考这个链接的内容:https://www.thinbug.com/q/8811381
# 3.4 No xxx 三方库的问题
如果执行 ./build.sh x86_64 kylin
脚本命令出现错误,就一个库一个库编译,比如编译 lzma(即 xz-5.2.5)库 ./build.sh x86_64 kylin lzma
出现无法找到的问题,进入该三方库 cd xz-5.2.5
,创建一个 do_build
目录,在返回上一级目录,重新编译 ./build.sh x86_64 kylin lzma
命令就可以了
第三方库都安装完成就可以进行下一步编译项目源码
# 4. 编译项目源码
# 4.1 编译后台程序 usbguard
进入 /data/tq_usb/usbguard
目录,创建 do_build
目录,有的话就不用创建,直接清空就行
# usbguard 目录没有 do_build 目录就创建
mkdir do_build
# 有的话就清空
cd do_build && rm -fr *
cd /data/tq_usb/usbguard && ../autogen.sh
cd /data/tq_usb/usbguard/do_build && cp ../init_build.sh .
./init_build.sh
# 然后执行
make install
2
3
4
5
6
7
8
9
10
11
在 do_build
目录执行完 ../configure
后如果出现以下错误:
进入 /data/tq_usb/release/x86_64/kylin-v10/lib/pkgconfig
查看是否有 libhv.pc
文件,其他三方库也在这里
cd /data/tq_usb/release/x86_64/kylin-v10/lib/pkgconfig
如果没有,则需要 ssh 远程连接其他终端上通过内网拉取,拷贝到这个目录,然后修改路径 vim libhv.pc
其他三方库出现这个问题也一样。
ssh luokp@192.168.0.26
# 提示:电脑开机输入的密码
# 路径如下:
cd /media/luokp/DATA/workspace/tq_usb/release/x86_64/kylin-v10/lib
2
3
4
拷贝到自己的电脑后,要改这拷贝文件的路径。
如下图所示,把下图的 prefix 的路径改为自己项目所在的路径,不知道怎么改可以查看一下同目录下的 libqb.pc 的 prefix 字段的路径
最后就在 do_build
目录继续进行 4.1 步骤,就会生成如下几个可执行文件和配置文件
# 接着执行
make install
2
编译过程如果无报错则继续往下走,有报错,则自行根据具体报错解决。
# 4.2 编译桌面程序 usbdesk
运行脚本前先看看路径,因为不同终端的编译路径可能会不一样。(改 CMakeList.txt 文件)
这个是 /data/tq_usb/usbdesktop/
目录下的 run.sh
文件,这个文件是本地运行项目要用的
./usbdesk -b "" -m network -c ${PWD}/../etc/usbdesk.conf
这里修改的原因可以对照 ``/data/tq_usb/usbdesktop` main.cpp
如果不是在 x86 端编译,而是在 aarch64 端编译要看看 /data/tq_usb/usbdesktop/
目录下的 CMakeList.txt
文件(mips64端就类似与aarch64这样改就行)
cd /data/tq_usb/usbdesktop
vim CMakeList.txt
2
进入 /data/tq_usb/usbdesktop/do_build
目录,运行 build.sh
和 run.sh
脚本
# usbdesktop 目录没有 do_build 目录就创建
cd /data/tq_usb/usbdesktop/ && mkdir do_build
cd do_build && cp ../build.sh .
./build.sh
# 如果本身有 do_build 目录的话就清空
rm -fr do_build/*
cd /data/tq_usb/usbdesktop/do_build && cp ../build.sh .
./build.sh
# 然后执行
make -j8
2
3
4
5
6
7
8
9
10
11
笔者这里运行 build.sh
脚本是因为缺少了 qt5 的部分组件,所以报错了,有类似的可以参考
# 直接命令行下载(前提是你的QT5也是用命令行下载的)
sudo apt-get install qttools5-dev-tools
# 如果没有解决就把 多余的 QT安装包删了
sudo apt remove qttools5-dev-tools
# 然后你会看到他叫你可以删除多余的不需要的安装包,都删了
sudo apt autoremove
# 然后再重新下载
sudo apt-get install qttools5-dev-tools
# 在下载多一个插件试试
sudo apt install qttools5-dev
2
3
4
5
6
7
8
9
10
11
删除多余的安装包,如下图:
编译成功,如下图:
然后接着继续编译源码,还是在 do_build
目录执行 make -j8
然后在 do_build
目录就生成了桌面程序 usbdesk
# 4.3 编译注册程序 power_reg
同样先进入脚本查看路径,因为这个是 QT 编写的程序,所以这里的脚本应该是以 .pro
结尾的文件
进入 /data/tq_usb/power_reg/do_build
目录,执行 qmake ..
# power_reg 目录没有 do_build 目录就创建
cd /data/tq_usb/power_reg/ && mkdir do_build
# 原来就有 do_build 目录的话就清空
rm -fr do_build/*
# 然后执行
qmake ..
---------------------执行结果如下:---------------------------------------------
kylin@kylin:/data/tq_usb/power_reg/do_build$ qmake ..
Info: creating stash file /data/tq_usb/power_reg/do_build/.qmake.stash
Project MESSAGE: VAR_OS=kylin
Project MESSAGE: VAR_OS_VER=v10
Project MESSAGE: ARCH=x86_64
------------------------------------------------------------------------
# 然后执行
make -j8
# 执行完毕后就会在
# /data/tq_usb/release/x86_64/kylin-v10/bin 这个目录下生成 可执行文件 PowerReg
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 4.4 编译 tqFairWall
cd /data/tq_usb/tqFireWall/kernelmod
make
# 执行完之后 kernelmod 会有一个 tqfw.ko 文件
-------------------------------------------------------------------------
cd /data/tq_usb/tqFireWall/command
make
执行完之后 command 会有一个可执行文件 fairwall
2
3
4
5
6
7
# 4.5 单机版本地运行
项目源码编译通过再按下面步骤走
进入 /data/tq_usb/usbguard/src/DBus/
目录,将 org.usbguard1.policy
文件中的所有 auth_admin
该为 yes
这里介绍一个快捷的方式:vim 的手动批量替换(可以防止一键自动替换错地方)
首先,我们需要找到我们想要替换的文字。通过在普通模式下按
/
键并输入我们想要搜索的词语,Vim 就会高亮显示出所有文档中匹配该词语的地方,按下Enter
键以确定搜索。然后通过
n
和N
键在搜索结果中向前和向后跳转。n
键会将光标移动到下一个搜索结果,N
键则会将光标移动到上一个搜索结果。当我们找到了要替换的词语,我们可以通过
cw
命令将该词语替换为新的词语。在普通模式下,cw
命令将删除从光标位置开始的词语,并进入插入模式,这允许我们输入新的词语。当我们完成新词语的输入后,通过按Esc
键返回到普通模式。如果我们想要重复上一步的替换操作,我们可以简单地通过
.
命令来实现。在普通模式下,.
命令将重复最后一次修改,这也包括了我们的替换操作。通过重复步骤 2 至 4,我们就可以实现对文档中所有匹配的词语的替换。
这就是在 Vim 中完成批量替换操作的步骤。尽管最开始可能会觉得有些复杂,但是一旦熟练掌握,你就会发现这实际上是一个非常快速和高效的替换方法。
cd /data/tq_usb/usbguard/src/DBus/
sudo vim org.usbguard1.policy
2
例如:框框中的 auto_admin(不止这两个地方)改为 yes
将 /data/tq_usb/usbguard/src/DBus/org.usbguard1.policy
拷贝到 /usr/share/polkit-1/actions/
同时将 /data/tq_usb/usbguard/src/DBus/org.usbguard1.conf
拷贝到 /usr/share/dbus-1/system.d
下
# 在 /data/tq_usb/usbguard/src/DBus 目录下
cd /data/tq_usb/usbguard/src/DBus
sudo cp org.usbguard1.policy /usr/share/polkit-1/actions/
sudo cp org.usbguard1.conf /usr/share/dbus-1/system.d
2
3
4
然后将 /data/tq_usb/usbdesktop/etc
目录下的 usbdesk.conf 文件中的进行修改
cd /data/tq_usb/usbdesktop/etc
usbdesk.conf文件后续又新增了有关防火漆的配置文件路径,注意路径!
# 4.6 运行项目
把 /data/tq_usb/tqFireWall/kernelmod
目录下的 tqfw.ko 文件拷贝到 /data/tq_usb/release/x86_64/kylin-v10/etc/usbguard
cd /data/tq_usb/release/x86_64/kylin-v10/etc/usbguard
cp /data/tq_usb/tqFireWall/kernelmod/tqfw.ko .
2
把 /data/tq_usb/release/x86_64/kylin-v10/etc
目录下的 usbguard 配置文件拷贝到 /etc 目录下
cd /etc
sudo cp -fr /data/tq_usb/release/x86_64/kylin-v10/etc/usbguard .
2
# 运行项目之前要先在 /data/tq_usb/usbguard/do_build 目录下执行配置文件,不然会把鼠标键盘全部禁用掉,就要重新开机了
cd /data/tq_usb/usbguard/do_build
sudo ./usbguard generate-policy -c /etc/usbguard/usbguard-daemon.conf
# 首先进入 do_build 目录下的
cd /data/tq_usb/usbguard/do_build
sudo ./usbguard-daemon -d
# 新开一个标签,返回 do_build 目录,执行
sudo ./usbguard-dbus -s
# 再新开一个标签,是在 /data/tq_usb/usbdesktop/do_build 目录,执行
cd /data/tq_usb/usbdesktop/do_build
./run.sh
2
3
4
5
6
7
8
9
10
11
12
这里框框部分不用看,已经改了,不再用动态库,全部改为用静态库
在执行
sudo ./usbguard-daemon
时出现找不到某个共享库要把
/data/tq_usb/usbguard/do_build/.libs
目录和/data/tq_usb/release/x86_64/kylin-v10/lib
第三方库这两个路径加入到/etc/ld.so.conf.d/libc.conf
文件里sudo vim /etc/ld.so.conf.d/libc.conf # 改为之后记得刷新 sudo ldconfig
1
2
3
# 5. 打包成安装包
将 /data/tq_usb/release/x86_64/kylin-v10/sbin/usbguard-daemon
和 /data/tq_usb/release/x86_64/kylin-v10/sbin/usbguard-dbus
两个文件 copy 到 /data/tq_usb/make_package/res/bin/
目录下
cd /data/tq_usb/make_package/res/bin
cp /data/tq_usb/release/x86_64/kylin-v10/sbin/usbguard-daemon .
cp /data/tq_usb/release/x86_64/kylin-v10/sbin/usbguard-dbus .
2
3
将 /data/tq_usb/release/x86_64/kylin-v10/bin
目录下的 PowerReg、usbguard 两个文件
/data/tq_usb/usbdesktop/do_build
目录下的 usbdesk 这个文件
/data/tq_usb/tqFireWall/command/
下的 firewall 文件
一共四个文件 copy 到 /data/tq_usb/make_package/res/bin
目录下
cp /data/tq_usb/release/x86_64/kylin-v10/bin/PowerReg .
cp /data/tq_usb/usbdesktop/do_build/usbdesk .
cp /data/tq_usb/release/x86_64/kylin-v10/bin/usbguard .
cp /data/tq_usb/tqFireWall/command/firewall .
2
3
4
然后将 /data/tq_usb/tqFireWall/kernelmod
下的 tqfw.ko 文件拷贝到 /data/tq_usb/make_package/res/etc/usbguard
目录下
cd /data/tq_usb/make_package/res/etc/usbguard
cp /data/tq_usb/tqFireWall/kernelmod/tqfw.ko .
2
到 /data/tq_usb/make_package
目录下找到 Packager.py
脚本执行
./Packager.py
输入版本号, 就会自动生成deb安装包
第一次打包可能告诉你需要下载某个东西
sudo apt -y install dh-make devscripts
再次执行脚本
不知道是不是 bug,这里要敲击
ctrl+C
程序才会继续运行,不然就会一直卡很久才会继续执行。
安装完后的安装包就是一个以 .deb
结尾的文件
安装这个包可以执行
sudo dpkg -i com.tq.usbguard_2024.1.16_amd64.deb
如果后续要换版本了,不需要这个安装包,想重新打包,需要把 build 目录里的文件全部删除,然后在重新打包
sudo rm -fr build/*
通过运行 app 程序想看后台,就要跟踪日志文件
cd /tmp
tail -f usbguard-daemon.log
2
# 6. 安装过程注意事项
- 安装之前把所有的u盘拨出
- 插好 USB 接口的鼠标和键盘
- 开始安装
- 首次运行需要等待大约30秒再启动桌面程序
# 7. 项目解读
# 7.1 USB 规则类型
每个 USB 设备有三种类型的目标规则:
- allow – 授权 USB 设备
- block – 不授权 USB 设备,但是系统仍然可以使用 lsusb 命令看到(可见)该设备。但是,用户不能使用 USB 设备,因为在系统管理员授权之前,它一直处于被阻止状态。(阻止设备)
- reject – 不授权 USB 设备,该设备对系统或用户不可见。USB设备需要再次重新插入才能再次可见。(拒绝该设备)
# 7.2 了解 /etc/usbguard/usbguard-daemon.conf 配置
# 我们使用 less 查看文件发现很多东西,难以观察
sudo less usbguard-daemon.conf
# 所以我们要进行筛选
sudo grep -vE '^#|^$' /etc/usbguard/usbguard-daemon.conf
# 这个命令主要是在 /etc/usbguard/usbguard-daemon.conf 配置文件中找出并显示所有非注释和非空行。
2
3
4
5
-v
:这是 grep 命令的一个选项,会反转搜索结果,也就是说,它会返回所有“不匹配”搜索模式的行。-E
:这是 grep 命令的一个选项,用于支持扩展的正则表达式。'^#|^$'
: 这是 grep 要搜索的模式。它是一个正则表达式,用于匹配以#
开头的行(也就是注解行)或空行。^
是一种定位符,表示行的开始,|
是 “或”的意思,表示符号前后的任何一个条件满足即可。
名称 | 解释 |
---|---|
RuleFile (规则文件) | USBGuard 守护程序将使用该文件加载策略规则集,并写入通过 IPC 接口接收的新规则。 |
ImplicitPolicyTarget (隐式策略目标) | 如何对待与策略中的任何规则都不匹配的 USB 设备。目标应为允许、阻止或拒绝之一(从系统中逻辑删除设备节点)。 |
PresentDevicePolicy (当前设备策略) | 如何对待守护进程启动时已经连接的 USB 设备?策略应为允许、阻止、拒绝、保持(保持设备当前的状态)或应用策略(评估每个现有设备的规则集)之一。 |
PresentControllerPolicy (当前控制策略) | 如何处理守护程序启动时已经连接的 USB 控制器设备。允许、阻止、拒绝、保留或应用策略之一。 |
InsertedDevicePolicy (插入的设备策略) | 如何对待守护进程启动后已经连接的 USB 设备?阻止、拒绝、应用策略之一。 |
RestoreControllerDeviceState (还原控制器设备状态) | USBGuard 守护程序修改控制器设备的某些属性,如新的子设备实例的默认授权状态。使用此设置,您可以控制守护程序在关机时是否尝试将属性值恢复到修改前的状态。 |
DeviceManagerBackend (设备管理器备份) | 使用哪个设备管理器后端实现。后端应为 uevent(默认)或umockdev 之一。 |
IPCAllowedUsers (IPC 允许的用户) | 守护程序将接受 IPC 连接的用户名的空格分隔列表。 |
IPCAllowedGroups (IPC 允许的组) | 守护程序将从其接受 IPC 连接的以空格分隔的组名列表。 |
IPCAccessControlFiles (IPC 访问控制文件) | 守护程序会将此位置的文件解释为 IPC 访问控制定义文件。详情参见 IPC 访问控制部分。 |
DeviceRulesWithPort (带有端口的设备规则) | 生成包括“通过端口”属性的设备特定规则。 |
AuditBackend (审计后端) | USBGuard 审核事件日志后端。后端值应为 FileAudit 或LinuxAudit 之一。 |
AuditFilePath (审计文件路径) | USBGuard 审核事件日志文件路径。如果 AuditBackend 设置为FileAudit,则需要此选项。 |
# 7.3 列出 USBGuard 守护程序使用的规则集(策略)
按照 4.4 部分启动程序后
在 /data/tq_usb/usbguard/do_build/.libs 目录下执行后续命令
# 7.3.1 使用以下命令可以列出规则集:
sudo ./usbguard list-rules
# 7.3.2 显示受特定规则影响的所有设备
sudo usbguard list-rules -d
sudo usbguard list-rules --show-devices
# 7.3.3 还可以显示具有特定标签的规则
sudo ./usbguard list-rules -l {label_here}
sudo ./usbguard list-rules --label
2
# 7.3.4 列出 USBGuard 守护程序识别的所有 USB 设备
sudo ./usbguard list-devices
sudo ./usbguard list-devices -a ## list allowed devices ##
sudo ./usbguard list-devices -b ## list blocked devices ##
2
3
# 8. 项目测试
# 8.1 测试 USB 插入是否默认阻止
我将插入我的USB 4G LTE调制解调器,查看它是否被默认阻止并运行 lsusb:
lsusb
示例输出表明华为USB连接到USB端口(设备009: ID 12d1:157c)并且对系统可见:
Bus 004 Device 002: ID 2109:0813 VIA Labs, Inc. USB3.0 Hub
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 004: ID 06cb:00bd Synaptics, Inc.
Bus 001 Device 007: ID 2109:0102 VIA Labs, Inc. Microsoft Ergonomic Keyboard
Bus 001 Device 005: ID 1a40:0101 Terminus Technology Inc. Hub
Bus 001 Device 003: ID 2109:2813 VIA Labs, Inc. USB2.0 Hub
Bus 001 Device 009: ID 12d1:157c Huawei Technologies Co., Ltd. HUAWEI_MOBILE
Bus 001 Device 006: ID 8087:0029 Intel Corp.
Bus 001 Device 002: ID 045e:082c Microsoft Corp. Microsoft Ergonomic Keyboard
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
2
3
4
5
6
7
8
9
10
11
12
但是,该设备被 USBGuard 阻止。您将看到内核消息,指示华为 USB 设备未经授权使用,如下所示:
sudo dmesg
sudo dmesg | grep -i 'authorized'
2
示例输出表明默认情况下 USBGuard 会阻止 USB 调制解调器:
[87467.670280] usb 1-2: new high-speed USB device number 8 using xhci_hcd
[87467.820572] usb 1-2: New USB device found, idVendor=12d1, idProduct=157c, bcdDevice= 1.02
[87467.820578] usb 1-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[87467.820581] usb 1-2: Product: HUAWEI_MOBILE
[87467.820584] usb 1-2: Manufacturer: HUAWEI_MOBILE
[87467.820587] usb 1-2: SerialNumber: 0123456789ABCDEF
[87467.820928] usb 1-2: Device is not authorized for usage
[87477.196260] usb 1-2: USB disconnect, device number 8
[87477.682044] usb 1-2: new high-speed USB device number 9 using xhci_hcd
[87477.831578] usb 1-2: New USB device found, idVendor=12d1, idProduct=157c, bcdDevice= 1.02
[87477.831583] usb 1-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[87477.831587] usb 1-2: Product: HUAWEI_MOBILE
[87477.831590] usb 1-2: Manufacturer: HUAWEI_MOBILE
[87477.831593] usb 1-2: SerialNumber: 0123456789ABCDEF
[87477.831931] usb 1-2: Device is not authorized for usage
2
3
4
5
6
7
8
9
10
11
12
13
14
15
我们可以使用以下命令查看被阻止的 USB 设备:
sudo ./usbguard list-devices -b
输出:
24: block id 12d1:157c serial "0123456789ABCDEF" name "HUAWEI_MOBILE" hash "8tSOgfYNylANtACo0ysV5qRAx5Ht+geWMd+QOVNcK70=" parent-hash "jEP/6WzviqdJ5VSeTUY8PatCNBKeaREvo2OqdplND/o=" via-port "1-2" with-interface { 08:06:50 02:0e:00 0a:00:02 0a:00:02 08:06:50 } with-connect-type "hotplug"
其中数据块的目标策略如下:
- 24 – 设备号
- **block id 12d1:157c ** – USB 设备 ID
- serial "0123456789ABCDEF" – USB 设备序列号
- name "HUAWEI_MOBILE" – USB 设备名称
USB 设备号是动态生成的,在你的 Linux 系统中会有所不同。
# 8.2 暂时允许访问 USB 设备
默认情况下,我们知道 USBGuard 会阻止连接的USB设备,并将永远被禁止。这意味着基于 USB 的攻击被阻止。但是,如果我想访问合法的 USB 设备呢?尝试以下命令更改数据块策略以允许使用设备块 ID 为12d1:157c 的设备 # 24:
# sudo ./usbguard allow-device {device_ID}
sudo ./usbguard allow-device 24
2
还可以使用如下规则:
sudo ./usbguard allow-device '12d1:157c serial "0123456789ABCDEF"'
sudo ./usbguard allow-device '12d1:1506 serial "0123456789ABCDEF"'
2
# 8.3 永久规则
我们可以让这个决定永久化。特定于设备的允许规则将附加到当前策略中:
# sudo ./usbguard allow-device {device_ID} -p
sudo ./usbguard allow-device 24 -p
2
规则代替 ID:
sudo usbguard allow-device '12d1:157c serial "0123456789ABCDEF"' -p
sudo usbguard allow-device '12d1:1506 serial "0123456789ABCDEF"' -p
2
以下是我使用文本编辑器添加到 rules.conf 的规则:
sudo /etc/usbguard/rules.conf
附加以下内容
allow id 12d1:157c serial "0123456789ABCDEF" name "HUAWEI_MOBILE" hash "8tSOgfYNylANtACo0ysV5qRAx5Ht+geWMd+QOVNcK70=" parent-hash "jEP/6WzviqdJ5VSeTUY8PatCNBKeaREvo2OqdplND/o=" via-port "1-2" with-interface { 08:06:50 02:0e:00 0a:00:02 0a:00:02 08:06:50 } with-connect-type "hotplug"
allow id 12d1:1506 serial "" name "HUAWEI_MOBILE" hash "1lr2516yYIsSGGyDZrcgBBNJPlzzthtHbpH1SN5E/VA=" parent-hash "jEP/6WzviqdJ5VSeTUY8PatCNBKeaREvo2OqdplND/o=" via-port "1-2" with-interface { ff:02:12 ff:02:01 ff:02:16 ff:02:16 08:06:50 08:06:50 } with-connect-type "hotplug"
2
保存并关闭文件。重新启动服务:
sudo systemctl restart usbguard.service
# 8.4 检查
添加规则后,USBGurad 将立即允许 USB 设备访问。现在我可以使用 USB LTE 调制解调器连接到互联网或查看 USD disk:
udisksctl status
MODEL REVISION SERIAL DEVICE
--------------------------------------------------------------------------
SAMSUNG MZVLB1T0HBLR-000L7 5M2QEXF7 xyzfooooooooo1 nvme0n1
SAMSUNG MZVLB1T0HBLR-000L7 5M2QEXF7 xyzfooooooooo2 nvme1n1
HUAWEI TF CARD Storage 2.31 HUAWEI_TF_CARD_Storage-0:0 sda
HUAWEI Mass Storage 2.31 HUAWEI_Mass_Storage-0:0 sr0
2
3
4
5
6
也不再有错误:
sudo dmesg