DOCA App Shield Agent 应用程序指南
本指南提供了基于 NVIDIA® BlueField® DPU 的进程内省系统实现。
App Shield Agent 使用 DOCA App Shield 库监控主机系统中的进程。
这种安全功能有助于从独立且可信的 DPU 中识别系统中核心进程的损坏。这是一项主要的创新入侵检测系统 (IDS) 功能,因为它无法从主机内部提供。
The DOCA App Shield Library 提供了直接从 DPU 读取、分析和验证主机(裸机/VM)内存的功能。
使用该库,此应用程序哈希特定进程及其库的不可写内存页(以及未加载的页)。然后,应用程序定期验证已加载的页。
应用程序在每次迭代后报告通过/失败,直到首次证明失败。报告既打印到控制台,也使用进程间通信 (IPC) 导出到 DOCA Telemetry Service (DTS)。
本指南介绍了如何使用 DOCA App Shield 库构建安全进程监控,该库利用了 DPU 的优势,例如基于硬件的 DMA、完整性等。
App Shield Agent 旨在 DPU 的 Arm 上独立运行,而不会妨碍主机。
主机的参与仅限于在需要生成必要的 ZIP 和 JSON 文件以传递给 DPU 时,配置对新进程的监控。这在初始阶段(“时间 0”)完成,此时主机仍处于“安全”状态。
可以通过在主机上运行 DOCA App Shield 的 doca_apsh_config.py
工具来生成所需的文件。有关更多信息,请参阅 DOCA App Shield。

用户使用 DOCA 工具 doca_apsh_config.py
创建三个强制性文件,并将它们复制到 DPU。应用程序可以将证明结果报告给
文件
终端
DTS

这些文件是通过在主机上针对时间零时的进程运行
doca_apsh_config.py
生成的。注意动作 2-5 定期重复。
App Shield Agent 从 DOCA App Shield 库请求新的证明。
DOCA App Shield 库创建一个新的证明
扫描和哈希进程内存页(当前正在使用中)。
将哈希与原始哈希进行比较。
为进程中涉及的每个 lib/exe 创建证明。每个证明都包含有效页数和总页数。
App Shield Agent 搜索每个证明,查找已用页数和有效页数之间的不一致。
App Shield Agent 将带有时间戳和扫描计数的报告结果报告给
本地遥测文件 – 一个文件夹和文件,代表真实的 DTS 将收到的数据。这些文件仅用于本示例的目的,因为通常此数据不会导出到用户可读的文件中。
DOCA 日志(没有扫描计数)。
DTS IPC 接口(即使没有 DTS 处于活动状态)。
App Shield Agent 在首次证明失败时退出。
有关如何安装 BlueField 相关软件的详细信息,请参阅 Linux 版 DOCA 安装指南。
DOCA 参考应用程序的安装包包含应用程序的源代码以及匹配的编译说明。这允许“按原样”编译应用程序,并提供修改源代码然后编译应用程序新版本的能力。
有关应用程序以及开发和编译技巧的更多信息,请参阅 DOCA Reference Applications 页面。
应用程序的源代码可以在应用程序的目录下找到:/opt/mellanox/doca/applications/app_shield_agent/
。
编译所有应用程序
所有 DOCA 应用程序都在单个 meson 项目下定义。因此,默认情况下,编译包括所有应用程序。
要一起构建所有应用程序,请运行
cd /opt/mellanox/doca/applications/
meson /tmp/build
ninja -C /tmp/build
doca_app_shield_agent
在 /tmp/build/app_shield_agent/
下创建。
仅编译当前应用程序
要仅构建 App Shield Agent 应用程序
cd /opt/mellanox/doca/applications/
meson /tmp/build -Denable_all_applications=false
-Denable_app_shield_agent=true
ninja -C /tmp/build
doca_app_shield_agent
在 /tmp/build/app_shield_agent/
下创建。
或者,用户可以在 meson_options.txt
文件中设置所需的标志,而不是在编译命令行中提供它们。
编辑
/opt/mellanox/doca/applications/meson_options.txt
中的以下标志将
enable_all_applications
设置为false
将
enable_app_shield_agent
设置为true
运行以下编译命令
cd /opt/mellanox/doca/applications/ meson /tmp/build ninja -C /tmp/build
信息doca_app_shield_agent
在/tmp/build/app_shield_agent/
下创建。
故障排除
有关应用程序编译中遇到的任何问题,请参阅 DOCA Troubleshooting。
先决条件
配置 BlueField 的固件。
在 BlueField 系统上,配置 PF 基地址寄存器和 NVMe 仿真。运行
dpu> mlxconfig -d /dev/mst/mt41686_pciconf0 s PF_BAR2_SIZE=
2
PF_BAR2_ENABLE=1
NVME_EMULATION_ENABLE=1
执行 BlueField 系统重启,使
mlxconfig
设置生效。您可以使用以下命令验证这些配置
dpu> mlxconfig -d /dev/mst/mt41686_pciconf0 q | grep -E
"NVME|BAR"
下载目标系统(主机/VM)符号。
对于 Ubuntu
host> sudo tee /etc/apt/sources.list.d/ddebs.list << EOF deb http:
//ddebs.ubuntu.com/ $(lsb_release -cs) main restricted universe multiverse
deb http://ddebs.ubuntu.com/ $(lsb_release -cs)-updates main restricted universe multiverse
deb http://ddebs.ubuntu.com/ $(lsb_release -cs)-proposed main restricted universe multiverse
EOF host> sudo apt install ubuntu-dbgsym-keyring host> sudo apt-get update host> sudo apt-get install linux-image-$(uname -r)-dbgsym对于 CentOS
host> yum install --enablerepo=base-debuginfo kernel-devel-$(uname -r) kernel-debuginfo-$(uname -r) kernel-debuginfo-common-$(uname -m)-$(uname -r)
Windows 不需要操作
执行 IOMMU 直通。仅当默认情况下未启用 IOMMU 时(例如,当主机使用 AMD CPU 时)才需要此步骤。
注意如果您不确定是否需要此步骤,请跳过此步骤。仅当 DMA 失败并在
dmesg
中出现类似于以下消息的消息时,才返回此步骤。host> dmesg [ 3839.822897] mlx5_core 0000:81:00.0: AMD-Vi: Event logged [IO_PAGE_FAULT domain=0x0047 address=0x2a0aff8 flags=0x0000]
找到您操作系统的 grub 文件(很可能是
/boot/grub/grub.conf
、/boot/grub2/grub.cfg
或/etc/default/grub
)并打开它进行编辑。运行host> vim /etc/
default
/grub搜索定义
GRUB_CMDLINE_LINUX_DEFAULT
的行,并添加参数iommu=pt
。例如GRUB_CMDLINE_LINUX_DEFAULT=
"iommu=pt <intel/amd>_iommu=on"
运行
注意在执行电源循环之前,请务必执行正常关机。
对于 Ubuntu
host> sudo update-grub host> ipmitool power cycle
对于 CentOS
host> grub2-mkconfig -o /boot/grub2/grub.cfg host> ipmitool power cycle
对于 Windows 目标,请关闭 Hyper-V 功能。
准备目标
在目标系统上安装 DOCA。
创建 ZIP 和 JSON 文件。运行
target-system> cd /opt/mellanox/doca/tools/ target-system> python3 doca_apsh_config.py --pid <pid-of-process-to-monitor> --os <windows/linux> --path <path to dwarf2json executable or pdbparse-to-json.py> target-system> cp /opt/mellanox/doca/tools/*.* <shared-folder-with-baremetal> dpu> scp <shared-folder-with-baremetal>/* <path-to-app-shield-binary>
如果目标系统未安装 DOCA,则可以从 BlueField 复制脚本。
DOCA 未提供所需的
dwaf2json
和pdbparse-to-json.py
。注意如果内核和进程
.exe
没有更改,则无需重做此步骤。
应用程序执行
App Shield Agent 应用程序以源代码形式提供;因此,在执行应用程序之前需要进行编译。
应用程序使用说明
Usage: doca_app_shield_agent [DOCA Flags] [Program Flags] DOCA Flags: -h, --help Print a help synopsis -v, --version Print program version information -l, --log-level Set the (numeric) log level
for
the program <10
=DISABLE,20
=CRITICAL,30
=ERROR,40
=WARNING,50
=INFO,60
=DEBUG,70
=TRACE> --sdk-log-level Set the SDK (numeric) log levelfor
the program <10
=DISABLE,20
=CRITICAL,30
=ERROR,40
=WARNING,50
=INFO,60
=DEBUG,70
=TRACE> -j, --json <path> Parse all command flags from an input json file Program Flags: -p, --pid Process ID of process to be attested -e, --ehm <path> Exec hash map path -m, --memr <path> System memory regions map -f, --vuid VUID of the System device -d, --dma DMA device name -o, --osym <path> System OS symbol map path -s, --osty <windows|linux> System OS type - windows/linux -t, --time <seconds> Scan time interval in seconds信息可以使用
-h
(或--help
)选项将此用法打印输出到命令行。./doca_app_shield_agent -h
信息有关更多信息,请参阅“命令行标志”部分。
在 BlueField 上运行应用程序的 CLI 示例
./doca_app_shield_agent -p
13577
-e hash.zip -m mem_regions.json -o symbols.json -f MT2125X03335MLNXS0D0F0VF1 -d mlx5_0 -t3
-s linux注意所有使用的标识符(
-f
、-p
和-d
标志)都应与所需设备和进程的标识符匹配。
命令行标志
标志类型 | 短标志 | 长标志 | 描述 |
通用标志 |
|
| 打印帮助概要 |
|
| 打印程序版本信息 | |
|
| 设置应用程序的日志级别
| |
N/A |
| 设置程序的日志级别
| |
|
| 从输入 JSON 文件解析所有命令标志 | |
程序标志 |
|
| 要证明的进程的 PID |
|
| 从主机传输的预生成 | |
|
| 从主机传输的预生成 | |
|
| 暴露给目标系统的 VF/PF 的系统 PCIe 功能供应商唯一标识符 (VUID)。用于 DMA 操作。 要获取此参数,请运行
示例输出
为连接到目标系统的每个 DPU 打印两个 VUID。第一个是 pf0 上 DPU 的 VUID,第二个是端口 注意
在 DPU 上运行此命令会输出 VUID,中间带有一个额外的“EC”字符串。您必须删除“EC”才能获得正确的 VUID。
在 PF0/1 上分配的 VF 的 VUID 是 PF 的 VUID,带有额外的后缀 例如,对于上面示例中的输出
VUID 即使在重置后也是持久的。 | |
|
| 要使用的 DMA 设备名称 | |
|
| 从主机传输的预生成 | |
|
| 进程运行的系统的操作系统类型( | |
|
| 扫描之间休眠的秒数 |
有关支持的标志和执行模式的更多信息,请参阅 DOCA Arg Parser。
故障排除
有关 DOCA 应用程序的安装或执行中遇到的任何问题,请参阅 DOCA Troubleshooting。
解析应用程序参数。
初始化参数解析器资源并注册 DOCA 常规参数。
doca_argp_init();
注册应用程序参数。
register_apsh_params();
解析参数。
doca_argp_start();
初始化 DOCA App Shield 库上下文。
创建库上下文。
doca_apsh_create();
为库设置 DMA 设备。
doca_devinfo_list_create(); doca_dev_open(); doca_devinfo_list_destroy(); doca_apsh_dma_dev_set();
启动上下文
doca_apsh_start(); apsh_system_init();
初始化 DOCA App Shield 库系统上下文处理程序。
获取暴露给系统的远程 PCIe 功能的代表。
doca_devinfo_remote_list_create(); doca_dev_remote_open(); doca_devinfo_remote_list_destroy();
创建并启动系统上下文处理程序。
doca_apsh_system_create(); doca_apsh_sys_os_symbol_map_set(); doca_apsh_sys_mem_region_set(); doca_apsh_sys_dev_set(); doca_apsh_sys_os_type_set(); doca_apsh_system_start();
通过 pid 查找目标进程。
doca_apsh_processes_get();
遥测初始化。
telemetry_start();
初始化新的遥测模式。
注册证明类型事件。
设置输出到文件(除了默认的 IPC)。
启动遥测模式。
使用 gethostname() 名称作为源 ID 初始化并启动新的 DTS 源。
获取进程的初始证明。
doca_apsh_attestation_get();
循环直到证明验证失败。
doca_apsh_attst_refresh();
/* validation logic */
doca_telemetry_exporter_source_report(); DOCA_LOG_INFO(); sleep();DOCA App Shield Agent 销毁。
doca_apsh_attestation_free(); doca_apsh_processes_free(); doca_apsh_system_destroy(); doca_apsh_destroy(); doca_dev_close(); doca_dev_remote_close();
遥测销毁。
telemetry_destroy();
参数解析器销毁。
doca_argp_destroy();
/opt/mellanox/doca/applications/app_shield_agent/