zeek/zeek-agent-v2

GitHub: zeek/zeek-agent-v2

一个为Zeek监控框架设计的轻量级跨平台终端代理,用于将主机实时活动(如进程、网络连接、文件变更)以事件流形式发送至Zeek进行集中式安全分析与关联。

Stars: 90 | Forks: 9

# Zeek Agent ![Zeek Agent 部署概览](/auxil/zeek-agent.png) ![Zeek Agent 日志示例](/auxil/log-example.png) **Zeek Agent** 是一个终端代理,它将主机信息发送到 [Zeek](http://zeek.org) 以进行集中监控。在 Zeek 内部,这些主机活动(例如当前进程、打开的套接字或系统上的用户列表)随后会像网络活动一样,作为脚本层事件显示出来。Zeek 及其代理通过基于 WebSocket 的通信协议进行通信。 除了 Zeek Agent 本身,我们还提供了一个 [Zeek 脚本包](https://github.com/zeek-packages/zeek-agent-v2),它为 Zeek 增加了许多新的日志文件,用于记录从代理接收到的终端信息。该包还为自定义脚本提供了 API,用于控制代理和处理它们发送的事件。 这是一个新版本的 Zeek Agent,它取代了一些早期的实现(参见[历史记录](#history))。目前它仍然是实验性的并在开发中,但我们正在努力使其变得稳定。我们对您可能有的任何反馈都很感兴趣。同时也欢迎贡献! #### 目录 - [入门指南](#getting-started) - [Zeek Agent](#zeek-agent) - [Zeek Package](#zeek-package) - [Zeek API](#zeek-api) - [交互式使用](#interactive-usage) - [表参考](#table-reference) - [状态](#status) - [联系我们](#getting-in-touch) - [许可证](#license) - [历史记录](#history) ## 入门指南 ### Zeek Agent #### 前置条件 - 该代理目前支持 Linux、macOS 和 Windows 系统。 - 除了标准系统库之外,终端上没有硬性依赖。(如果个别表在系统上找不到所需的内容,可能会不可用。) #### 下载与安装 在我们的[发布页](https://github.com/zeek/zeek-agent-v2/releases),您可以找到以下预构建的代理版本: - **Linux**:我们提供适用于所有最新 x86_64 系统的静态二进制文件。只需将 `zeek-agent` 二进制文件复制到您的 `PATH` 中即可。 - **macOS**:我们提供适用于 Monterey 及更新版本且已签名的通用二进制文件。要安装,请打开 DMG 磁盘映像,将 `Zeek Agent` 安装应用程序复制到系统的 `/Applications` 文件夹中,然后在那里执行它。该应用程序会将实际的代理作为系统扩展安装。您需要授予其执行此操作的权限,以及追踪终端网络流量的权限。 - **Windows**:我们提供适用于 Windows 2022 的安装程序。 请注意,此页面上描述的功能可能并未全部包含在最新版本中。如果要下载当前的开发版本,请找到 [`main` 分支上最新成功的工作流](https://github.com/zeek/zeek-agent-v2/actions/workflows/main.yml?query=branch%3Amain+is%3Asuccess)并转到其构件列表。 #### 从源代码构建 要自行构建代理,请下载当前版本的源代码发行版,或直接从 GitHub 克隆代码(确保通过 `--recursive` 包含子模块)。然后运行: ``` # ./configure [] && make -j 4 && make test && make install ``` 部分 `configure` 选项(有关更多信息,请参见 `--help`): - `--prefix=`:安装前缀 - `--with-openssl=`:OpenSSL 安装路径。 特定平台的注意事项: - **Linux** - 您必须安装 `clang` 和 `llvm`(不支持使用 `gcc` 进行编译),您还需要提供可用的 ELF 开发头文件(例如 Ubuntu 上的 `libelf-dev`)。所有这些都是 eBPF 支持所必需的。 - **macOS** - 使用 Homebrew 时,添加 `--with-openssl={/usr/local,/opt/homebrew}/opt/openssl@1.1`。 - 默认情况下,生成的 Zeek Agent 应用程序不会被签名和公证,这意味着除非禁用系统完整性保护(不推荐),否则安装应用程序将无法运行。您仍然可以手动执行实际的 `zeek-agent` 二进制文件,但功能有限。 - **Windows** - 任何最新版本的 Visual Studio 都可以。您需要将 `-DCMAKE_TOOLCHAIN_FILE="3rdparty/vcpkg/scripts/buildsystems/vcpkg.cmake"` 传递给 CMake 调用。这将使 vcpkg 为构建安装正确的依赖项。 #### 用法 在 Linux 和 Windows 终端上,以 `root` 身份运行: ``` # zeek-agent -z <你的Zeek系统的主机名> ``` 在 macOS 上,代理通常通过安装应用程序启动,如上所述。该应用程序还提供了一个配置界面来指定目标 Zeek 系统。用于开发和实验时,您也可以像在其他平台上一样直接运行 `zeek-agent` 二进制文件,尽管这样它将无法访问大部分 macOS 特有的功能。 ### Zeek Package #### 前置条件 - 代理的 Zeek 包已通过 Zeek 6.0 的测试;较旧的 Zeek 版本可能有效,也可能无效。预构建的代理二进制文件在连接时需要 Zeek 6.0 或更新版本。 - 对于标准安装,请确保您已提供并配置好 Zeek 包管理器。您可能需要运行 `eval $(zkg env)` 来正确设置环境变量。有关更多信息,请参见包管理器的[快速入门指南](https://docs.zeek.org/projects/package-manager/en/stable/quickstart.html)。 #### 安装 ``` # zkg refresh # zkg install zeek-agent-v2 ``` #### 用法 运行 Zeek: ``` # zeek zeek-agent-v2 ``` 您现在应该会看到记录终端活动的新日志文件: - `zeek-agent-files.log`:记录终端上现有文件列表的更改。 - `zeek-agent-processes.log:`:记录终端上运行进程的更改。 - `zeek-agent-sockets.log:`:记录终端上打开的网络套接字的更改。 - `zeek-agent-ssh-authorized-keys.log`:记录终端上为 SSH 安装的用户 `authorized_keys` 的更改。 - `zeek-agent-ssh-configs.log`:记录 `sshd` 配置选项的更改。 - `zeek-agent-system-logs.log:`:记录操作系统记录的消息。 - `zeek-agent-users.log:`:记录终端上可用用户的更改。 您还会发现一个新的 `zeek-agent.log` 用于追踪代理的连接性。 ## Zeek API [此处即将补充更多内容。] ## 交互式使用 Zeek Agent 提供了一个交互式控制台,可通过 SQL 查询探索其提供的数据: ``` # zeek-agent -i Welcome to Zeek Agent v2. Enter query or command to execute. Type `.help` for help, and `.quit` for exit. > .tables Name Description ------------------ ---------------------------------------------- files_lines line of selected ASCII files files_list file system paths matching a pattern processes current processes sockets open network sockets system_logs_events log messages recorded by the operating systems users user accounts zeek_agent Zeek Agent information > SELECT * FROM sockets WHERE process = "zeek" pid process family protocol local_port remote_port local_addr remote_addr state ----- ------- ------ -------- ---------- ----------- ------------- ----------- ------ 72892 zeek IPv4 17 65059 53 192.168.7.212 1.1.1.2 (null) 72892 zeek IPv6 6 9999 0 :: :: LISTEN ``` 此类 SQL 查询的输出即为作为事件发送给 Zeek 的内容。有关此内容的更多文档即将推出。 ## 表参考
files_columns: 从选定的 ASCII 文件中提取的列 [Linux, macOS]
该表返回从选定 ASCII 文件中提取的列,作为相应字段值的 Zeek record。在查询时,该表会逐行读取所有相关文件。然后根据分隔符字符串拆分每行,并返回感兴趣的列。 要读取的文件通过第 1 个表参数指定,它是一个匹配所有相关路径的 glob。 从每行中提取的列通过第 2 个表参数指定,它是一个包含以逗号分隔的元组 `$:` 列表的字符串,其中 `` 是列号(`$1` 是第 1 列,`$2` 是第 2 列,依此类推);`` 是该列中的值将被解析为的类型。类型可以是:`blob`、`count`、`int`、`real`、`text`。作为一种特殊情况,列 `$0` 指的是未经任何处理的整行内容。 列分隔符由第 3 个表参数指定。它可以留空以按空白字符进行拆分,也可以是一个要搜索的字符串。如果为空(这是默认设置),则每行开头和结尾的任何空白字符也将被忽略。 最后,第 4 个表参数指定了一个正则表达式,用于匹配要忽略的行。默认情况下,它被设置为以常见注释前缀(`#`、`;`)开头的行。如果此参数设置为空字符串,则不会忽略任何行。 在查询结果中,`columns` 将包含一个 JSON 数组,其中包含每行选定的值。在 Zeek 端,此数组将展开为一个 Zeek `record`。 这是一个例子:`SELECT columns from files_columns("/etc/passwd", "$1:text,$3:count", ":")` 将 `/etc/passwd` 拆分为多个部分,并提取每行的用户名和 ID。(由于 `passwd` 文件可能包含注释行,您可以添加第 4 个参数 `"^ *#"` 来忽略这些。但是,以 `#` 开头的注释已被第 4 个参数默认使用的模式所覆盖,因此这不是必需的。) | 参数 | 类型 | 描述 | 默认值 | --- | --- | --- | --- | | `pattern` | text | 匹配所有感兴趣文件的 glob | | | `columns` | text | 要提取的列的规范 | | | `separator` | text | 用于拆分列的分隔符字符串;留空表示按空白字符拆分 | `` | | `ignore` | text | 匹配要忽略的行的正则表达式;留空表示禁用 | `^[ \t]*([#;]\|$)` | | 列 | 类型 | 描述 | | --- | --- | --- | | `path` | text | 绝对路径 | | `number` | count | 源文件中的行号 | | `columns` | record | 提取的列 |
files_lines: 从选定的 ASCII 文件中提取的行 [Linux, macOS]
该表返回选定 ASCII 文件中的行作为表行。感兴趣的文件通过一个强制性表参数指定。在查询时,该表会读入所有匹配的文件,并为每一行返回一行记录,同时去除任何前导/尾随的空白字符。例如,`SELECT * FROM files_lines("/home/*/.ssh/authorized_keys")` 将返回用户授权访问其账户的任何 SSH 密钥。 | 参数 | 类型 | 描述 | 默认值 | --- | --- | --- | --- | | `pattern` | text | 匹配所有感兴趣文件的 glob | | | 列 | 类型 | 描述 | | --- | --- | --- | | `path` | text | 绝对路径 | | `number` | count | 行号 | | `content` | blob | 行内容 |
files_list: 匹配模式的文件系统路径 [Linux, Windows, macOS]
该表提供了终端文件系统上所有匹配自定义 glob 模式的文件列表。该模式通过一个强制性表参数指定。例如,在传统的 Linux 系统上,`SELECT * from files_list("/etc/init.d/*")` 将使用该目录中的所有文件填充该表。如果您随后监视该列表的更改,系统服务的任何更改都会通知您。 文件列表是在查询时生成的。`pattern` glob 需要匹配绝对文件路径。 | 参数 | 类型 | 描述 | 默认值 | --- | --- | --- | --- | | `pattern` | text | 匹配所有感兴趣文件的 glob | | | 列 | 类型 | 描述 | | --- | --- | --- | | `path` | text | 完整路径 | | `type` | text | 路径类型的文本描述(例如 `file`、`dir`、`socket`) | | `uid` | count | 拥有文件的用户 ID | | `gid` | count | 拥有文件的用户组 ID | | `mode` | text | 八进制权限模式 | | `mtime` | time | 最后修改时间 | | `size` | count | 文件大小(以字节为单位) |
processes: 当前进程 [Linux, Windows, macOS]
该表提供了在查询时终端上正在运行的所有进程的列表。 | 列 | 类型 | 描述 | --- | --- | --- | | `name` | text | 进程名称 | | `pid` | count | 进程 ID | | `ppid` | count | 父进程 ID | | `uid` | count | 有效用户 ID | | `gid` | count | 有效用户组 ID | | `ruid` | count | 实际用户 ID | | `rgid` | count | 实际用户组 ID | | `priority` | text | 进程优先级(表示方式取决于具体平台) | | `startup` | interval | 进程启动时间 | | `vsize` | count | 虚拟内存大小 | | `rsize` | count | 常驻内存大小 | | `utime` | interval | 用户 CPU 时间 | | `stime` | interval | 系统 CPU 时间 |
processes_events: 进程活动 [Linux, macOS]
该表报告终端上进程的启动和停止情况。 | 列 | 类型 | 描述 | --- | --- | --- | | `time` | time | 时间戳 | | `name` | text | 进程名称 | | `pid` | count | 进程 ID | | `ppid` | count 父进程 ID | | `uid` | count | 有效用户 ID | | `gid` | count | 有效用户组 ID | | `ruid` | count | 实际用户 ID | | `rgid` | count | 实际用户组 ID | | `priority` | text | 进程优先级(表示方式取决于具体平台) | | `duration` | interval | 自启动以来的时间间隔 | | `vsize` | count | 虚拟内存大小 | | `rsize` | count | 常驻内存大小 | | `utime` | interval | 用户 CPU 时间 | | `stime` | interval | 系统 CPU 时间 | | `state` | text | 进程状态 |
sockets: 打开的网络套接字 [Linux, Windows, macOS]
该表提供了在查询时终端上所有已打开的 IP 套接字的列表。 | 列 | 类型 | 描述 | --- | --- | --- | | `pid` | count | 持有套接字的进程 ID | | `process` | text | 持有套接字的进程名称 | | `family` | text | `IPv4` 或 `IPv6` | | `protocol` | count | 传输协议 | | `local_addr` | address | 本地 IP 地址 | | `local_port` | count | 本地端口号 | | `remote_addr` | address | 远程 IP 地址 | | `remote_port` | count | 远程端口号 | | `state` | text | 套接字状态 |
sockets_events: 打开的网络套接字 [Linux, macOS]
该表报告终端上 IP 套接字的打开和关闭情况。 | 列 | 类型 | 描述 | --- | --- | --- | | `time` | time | 时间戳 | | `pid` | count | 持有套接字的进程 ID | | `process` | text | 持有套接字的进程名称 | | `uid` | count | 进程的用户 ID | | `gid` | count | 进程的用户组 ID | | `family` | text | `IPv4` 或 `IPv6` | | `protocol` | count | 传输协议 | | `local_addr` | address | 本地 IP 地址 | | `local_port` | count | 本地端口号 | | `remote_addr` | address | 远程 IP 地址 | | `remote_port` | count | 远程端口号 | | `state` | text | 套接字状态 |
system_logs_events: 操作系统记录的日志消息 [Linux, Windows, macOS]
该表提供对操作系统记录的日志消息的访问。 在 Linux 上,该表需要 `systemd` 并挂接到其日志中。 在 macOS 上,该表挂接到统一日志系统 (`OSLog`)。 在 Windows 上,该表挂接到事件日志系统。 这是一个事件驱动的表,用于在日志消息出现时捕获它们。新消息将随下一次查询一起返回。 | 列 | 类型 | 描述 | --- | --- | --- | | `time` | time | 时间戳 | | `process` | text | 进程名称 | | `level` | text | 严重级别 | | `message` | text | 日志消息 | | `eventid` | text | 日志事件的特定于平台的标识符 |
users: 用户账户 [Linux, Windows, macOS]
该表提供了终端上存在的所有用户账户的列表,这些账户是在查询时从操作系统检索的。 | 列 | 类型 | 描述 | --- | --- | --- | | `name` | text | 短名称 | | `full_name` | text | 全名 | | `is_admin` | bool | 如果用户具有管理员权限,则为 1 | | `is_system` | bool | 如果用户对应于 OS 服务,则为 1 | | `uid` | text | 用户 ID(在某些平台上可以是字母数字) | | `gid` | count | 用户组 ID | | `home` | text | 主目录路径 | | `shell` | text | 默认 shell 的路径 | | `email` | text | 电子邮件地址 |
zeek_agent: Zeek Agent 信息 [Linux, Windows, macOS]
一个内部表,提供有关 Zeek Agent 进程及其运行终端的信息。 | 列 | 类型 | 描述 | --- | --- | --- | | `id` | text | 唯一的代理 ID(跨重启保持不变) | | `instance` | text | 代理进程的唯一 ID(重启时重置) | | `hostname` | text | 终端名称 | | `addresses` | set | 终端主要网络连接的 IP 地址 | | `platform` | text | `Darwin` 或 `Linux` 或 `Windows` | | `os_name` | text | 操作系统名称 | | `kernel_name` | text | 操作系统内核名称 | | `kernel_version` | text | 操作系统内核版本 | | `kernel_arch` | text | 构建架构 | | `agent_version` | count | 代理版本 | | `uptime` | interval | 代理运行时间 | | `tables` | set | 可供查询的表 |
## 状态 - 该代理目前仍处于实验阶段,API 和表模式仍在不断发展中。具体细节可能仍会在没有太多通知的情况下发生变化。如果您发现任何不符合预期的工作情况,请提交 issue。 - 表和 Zeek 日志的提供仍然有限;我们计划在未来增加更多。 - 欢迎作出贡献,我们接受 pull request。 ## 联系我们 在使用代理时遇到问题?有改进代理的想法?我们期待您的反馈! - 在 [GitHub issue 追踪器](https://github.com/zeek/zeek-agent-v2/issues)上报告问题。 - 在 [Zeek 的 Slack](https://zeek.org/connect) 上的 `#zeek-agent` 频道提问。 ## 许可证 Zeek Agent 是开源的,并在 BSD 许可证下发布,只要您保留许可证头,它就允许几乎不受限制的使用。 ## 历史记录 此 Zeek Agent 取代了不再维护的[第一代早期实现](https://github.com/zeek/zeek-agent)。新版本保留了最初基于表的方法,但降低了部署和代码库的复杂性。它不再支持与 osquery 接口(因为这是复杂性的主要来源)。两个版本的 Zeek Agent 也取代了 [Zeek 早期的一个 osquery 扩展](https://github.com/zeek/zeek-osquery),该扩展只专注于为 Zeek 提供 osquery 的表。
标签:AMSI绕过, EDR, ETW劫持, HTTP/HTTPS抓包, Mr. Robot, PB级数据处理, Rootkit, WebSocket, Zeek, 中心化监控, 主机信息收集, 主机监控, 依赖分析, 威胁检测, 安全测试工具, 安全运维, 开放端口监控, 开源安全工具, 态势感知, 无线安全, 日志记录, 用户活动监控, 端点代理, 端点安全, 端点检测与响应, 网络流量分析, 网络通信协议, 脆弱性评估, 脚本API, 脱壳工具, 补丁管理, 逆向工程平台