Skip to content

系统审计模块

本文档概述了 eCapture 的系统审计模块,这些模块可以在不修改代码的情况下实现对 shell 命令和数据库查询的安全监控。与 TLS/SSL 捕获模块 中介绍的模块不同,这些模块专注于审计用户操作和 SQL 查询,而不是网络流量。

关于 shell 审计的详细实现,请参见 Shell 命令审计。关于数据库查询审计的详细信息,请参见 数据库查询审计


目的与范围

系统审计模块使用 eBPF uprobe 技术拦截用户空间二进制文件中的函数调用,捕获命令行输入/输出和 SQL 查询字符串。这些模块用于安全审计、合规监控和取证分析等场景。

支持的审计目标:

  • Shell 命令:bash(通过 readline 库)、zsh(通过 zle 库)
  • 数据库查询:MySQL/MariaDB(5.6、5.7、8.0)、PostgreSQL(10+)

所有审计模块独立于 TLS/SSL 模块运行,不需要网络接口访问或数据包捕获功能。

来源:README.md:152-161cli/cmd/bash.go:1-56cli/cmd/zsh.go:1-58cli/cmd/mysqld.go:1-50cli/cmd/postgres.go:1-46


模块概述

下表总结了 eCapture 中可用的四个系统审计模块:

模块目标二进制文件Hook 库/函数捕获的数据主要用途
bash/bin/bashreadline.so (readline())命令输入/输出、退出码Shell 命令审计
zsh/bin/zshzsh 二进制文件(zle 函数)命令输入/输出、退出码Shell 命令审计
mysqld/usr/sbin/mysqld/usr/sbin/mariadbdmysqld 二进制文件(dispatch 函数)SQL 查询字符串数据库查询审计
postgres/usr/bin/postgrespostgres 二进制文件(查询执行)SQL 查询字符串数据库查询审计

所有模块都继承自 IModule 接口,并遵循 模块系统与生命周期 中描述的标准模块生命周期(Init → Run → Close)。

来源:README.md:152-161cli/cmd/bash.go:24-38cli/cmd/zsh.go:27-41cli/cmd/mysqld.go:27-42cli/cmd/postgres.go:27-40


架构集成

系统审计模块作为 IModule 接口的专用实现集成到 eCapture 的核心架构中,专注于基于 uprobe 的事件捕获,而不需要网络组件。

审计模块架构

与 TLS 模块的主要区别:

  • 不需要网络接口(-i)参数
  • 没有 pcap/keylog 输出模式
  • 没有 Traffic Control (TC) hooks 或数据包捕获
  • 更简单的事件流:uprobe → decode → log(无协议解析)

来源:cli/cmd/bash.go:1-56cli/cmd/zsh.go:1-58cli/cmd/mysqld.go:1-50cli/cmd/postgres.go:1-46


命令行接口

每个审计模块都作为 ecapture 二进制文件的子命令调用,具有特定于模块的配置标志。

Shell 命令审计命令

Bash 模块

bash
# 基本用法 - 自动检测 bash 二进制文件
sudo ecapture bash

# 指定 bash 二进制文件路径
sudo ecapture bash --bash=/bin/bash

# 指定 readline 库路径
sudo ecapture bash --readlineso=/lib/x86_64-linux-gnu/libreadline.so.8

# 按错误号过滤(仅显示失败的命令)
sudo ecapture bash --errnumber=1

# 结合日志记录的组合标志
sudo ecapture bash -l bash_audit.log --pid=1234

配置结构BashConfig cli/cmd/bash.go:24

  • Bashpath:bash 二进制文件路径(默认:从 $SHELL 自动检测)
  • Readline:readline.so 库路径(默认:自动检测)
  • ErrNo:按退出码过滤命令(默认:BashErrnoDefault

Zsh 模块

bash
# 基本用法 - 自动检测 zsh 二进制文件
sudo ecapture zsh

# 指定 zsh 二进制文件路径
sudo ecapture zsh --zsh=/bin/zsh

# 按错误号过滤
sudo ecapture zsh --errnumber=127

配置结构ZshConfig cli/cmd/zsh.go:27

  • Zshpath:zsh 二进制文件路径(默认:从 $SHELL 自动检测)
  • ErrNo:按退出码过滤命令(默认:ZshErrnoDefault

来源:cli/cmd/bash.go:24-56cli/cmd/zsh.go:27-58


数据库查询审计命令

MySQL/MariaDB 模块

bash
# 基本用法 - 默认 mysqld 路径
sudo ecapture mysqld

# 指定 mysqld 二进制文件(MySQL)
sudo ecapture mysqld --mysqld=/usr/sbin/mysqld

# 指定 mariadbd 二进制文件(MariaDB)
sudo ecapture mysqld --mysqld=/usr/sbin/mariadbd

# 通过名称 hook 特定函数
sudo ecapture mysqld --funcname=dispatch_command

# 通过偏移量 hook(高级用法)
sudo ecapture mysqld --offset=0x710410

# 结合日志记录
sudo ecapture mysqld -l mysql_queries.log --pid=3306

配置结构MysqldConfig cli/cmd/mysqld.go:27

  • Mysqldpath:mysqld/mariadbd 二进制文件路径(默认:/usr/sbin/mariadbd
  • FuncName:要 hook 的特定函数名(可选)
  • Offset:uprobe 附加的内存偏移量(可选,高级用法)

支持的版本:MySQL 5.6/5.7/8.0、MariaDB 10.5+

PostgreSQL 模块

bash
# 基本用法 - 默认 postgres 路径
sudo ecapture postgres

# 指定 postgres 二进制文件路径
sudo ecapture postgres --postgres=/usr/lib/postgresql/14/bin/postgres

# Hook 特定函数
sudo ecapture postgres --funcname=exec_simple_query

# 结合日志记录
sudo ecapture postgres -l postgres_queries.log --pid=5432

配置结构PostgresConfig cli/cmd/postgres.go:27

  • PostgresPath:postgres 二进制文件路径(默认:/usr/bin/postgres
  • FuncName:要 hook 的特定函数名(可选)

支持的版本:PostgreSQL 10+

来源:cli/cmd/mysqld.go:27-50cli/cmd/postgres.go:27-46


模块执行流程

所有审计模块都遵循标准的 eCapture 模块生命周期,与 TLS 模块相比,事件处理更为简化。

审计模块生命周期

与 TLS 模块的主要区别:

  1. 无网络接口绑定或 TC 分类器设置
  2. 无 EventProcessor/IWorker 池(更简单的事件流)
  3. 无协议解析(不使用 IParser)
  4. 直接的事件 decode → log 管道
  5. 无主密钥提取或 pcap 文件生成

来源:cli/cmd/bash.go:52-55cli/cmd/mysqld.go:46-49


通用配置参数

所有审计模块除了其特定于模块的标志外,还支持从根命令继承的标准全局标志。

全局标志(继承)

标志类型默认值描述
--piduint0目标特定进程 ID(0 = 所有进程)
--uiduint0目标特定用户 ID(0 = 所有用户)
-l, --logaddrstring""日志输出文件路径(空 = stdout)
--hexboolfalse以十六进制格式打印载荷

模块检测逻辑

每个审计模块都实现了二进制文件/库检测逻辑:

  1. Bash 模块 cli/cmd/bash.go:36-37

    • $SHELL 环境变量自动检测 bash
    • 从 bash 的链接库自动定位 readline.so
  2. Zsh 模块 cli/cmd/zsh.go:39

    • $SHELL 环境变量自动检测 zsh
  3. MySQL 模块 cli/cmd/mysqld.go:40

    • 默认路径:/usr/sbin/mariadbd
    • 可以为 MySQL 安装指定 /usr/sbin/mysqld
  4. PostgreSQL 模块 cli/cmd/postgres.go:37

    • 默认路径:/usr/bin/postgres
    • 版本无关检测(适用于 PG 10+)

来源:cli/cmd/bash.go:36-37cli/cmd/zsh.go:39cli/cmd/mysqld.go:40cli/cmd/postgres.go:37


使用场景与示例

安全审计场景

命令历史审计

场景:监控特定用户执行的所有 bash 命令,无需修改 shell 配置或需要用户配合。

bash
# 监控用户 ID 1000 的所有命令
sudo ecapture bash --uid=1000 -l /var/log/audit/bash_commands.log

# 监控特定 bash 进程
sudo ecapture bash --pid=12345 -l /var/log/audit/process_12345.log

# 仅显示失败的命令(非零退出码)
sudo ecapture bash --errnumber=1

输出格式:捕获命令文本、PID、UID、时间戳和退出码。

数据库查询审计

场景:审计生产 MySQL 服务器上执行的所有 SQL 查询,用于合规监控。

bash
# 监控所有 MySQL 查询
sudo ecapture mysqld --mysqld=/usr/sbin/mysqld -l /var/log/audit/mysql_queries.log

# 通过 PID 监控特定 MySQL 实例
sudo ecapture mysqld --pid=3306 -l /var/log/audit/mysql_3306.log

输出格式:捕获 SQL 查询字符串及连接元数据(PID、时间戳)。

取证分析

场景:通过在事件响应期间捕获所有 shell 命令和数据库查询来调查可疑活动。

bash
# 终端 1:监控 bash 命令
sudo ecapture bash -l /tmp/forensics/bash.log

# 终端 2:监控 PostgreSQL 查询
sudo ecapture postgres -l /tmp/forensics/postgres.log

# 终端 3:监控 zsh 命令
sudo ecapture zsh -l /tmp/forensics/zsh.log

来源:README.md:152-161cli/cmd/bash.go:30-32cli/cmd/mysqld.go:32-36


与 TLS 模块的比较

下表突出显示了审计模块与 TLS 捕获模块之间的架构差异:

功能系统审计模块TLS/SSL 模块
Hook 类型仅 UprobeUprobe + TC + Kprobe
网络接口不需要pcap 模式需要
事件处理直接 decode → logEventProcessor + IWorker 池
协议解析不适用IParser 实现
输出模式仅文本文本、pcap、keylog
主密钥提取不适用TLS 1.2/1.3 密钥
目标检测二进制文件路径查找库版本检测
用例命令/查询审计加密流量捕获

审计模块比 TLS 模块简单得多,因为它们不需要:

  • 网络数据包重组
  • 连接跟踪(4 元组映射)
  • 协议状态机
  • 主密钥提取
  • 带 DSB 块的 PCAP 文件生成

有关 TLS 模块的详细信息,请参见 TLS/SSL 捕获模块

来源:README.md:38-43README.md:152-161


模块注册

所有审计模块通过各自命令文件中的 init() 函数在 CLI 命令结构中注册:

命令注册cli/cmd/bash.go:35-55cli/cmd/zsh.go:38-52cli/cmd/mysqld.go:39-44cli/cmd/postgres.go:36-40

模块执行:所有命令都调用 runModule(moduleName, config),该函数:

  1. 调用 setModConfig(globalConf, moduleConfig)
  2. 实例化模块实现
  3. 执行标准生命周期:Init() → Run() → Close()

有关详细的模块生命周期信息,请参见 模块系统与生命周期

来源:cli/cmd/bash.go:52-55cli/cmd/zsh.go:54-57cli/cmd/mysqld.go:46-49cli/cmd/postgres.go:42-45


构建配置

系统审计模块根据构建标签进行有条件编译:

这种有条件编译减少了 Android 部署的二进制文件大小,因为这些审计功能通常在 Android 上不需要。

有关构建系统的详细信息,请参见 构建系统

来源:cli/cmd/zsh.go:1-2cli/cmd/mysqld.go:1-2cli/cmd/postgres.go:1-2

系统审计模块 has loaded