sjinks/wazuh-ar-ipset

GitHub: sjinks/wazuh-ar-ipset

基于 C23 的 Wazuh 主动响应脚本,通过 libipset 将告警中的恶意 IP 自动加入 Linux 内核 ipset 黑名单实现网络封禁。

Stars: 0 | Forks: 0

# wazuh-ar-ipset 基于 Wazuh 告警管理 Linux `ipset` 集合的有状态 Wazuh 主动响应(AR)脚本。 - 语言:C23(通过 CMake) - 依赖项:`libipset`、`libcjson` (cJSON) - 运行环境:由 `wazuh-execd` 执行,通常以 `root` 用户身份在 Wazuh agent 上运行。 本项目的设计理念是**安全第一**(以 root 身份运行并与内核交互)且**足够快**,但并未进行过度的微优化。 ## 功能说明 - 从 `stdin` 读取 Wazuh 主动响应 JSON 消息。 - 从告警中提取源 IP,并使用 `parameters.extra_args` 解析目标 ipset 名称(IPv4/IPv6 集合)。 - 实现**有状态 AR 协议**: - 对于 `command: "add"`: - 通过 `stdout` 向 Wazuh 发送包含该 IP 的 `check_keys` 控制消息。 - 等待包含 `command: "continue"` 或 `"abort"` 的响应。 - 若为 `continue`,则将该 IP 添加到配置的 ipset 中。 - 若为 `abort`,则记录日志并退出,不修改 ipset。 - 对于 `command: "delete"`: - 从配置的 ipset 中删除该 IP。 所有与 ipset 的交互都是通过 `src/ipset.*` 中的小型封装层调用 `libipset` 完成的。 ## 构建说明 本项目使用 CMake,并假定系统已安装 `libipset` 和 `libcjson` 开发包。 在典型的 Debian/Ubuntu 系统中,您可能需要安装以下包(具体包名可能因发行版而异): ``` sudo apt-get update sudo apt-get install -y libipset-dev libcjson-dev cmake build-essential ``` 配置并构建: ``` cd /workspaces/wazuh-ar-ipset # or your clone path cmake -S . -B build cmake --build build --clean-first -v ``` 生成的二进制文件(例如 `firewall-ipset`)将会出现在 `build/` 目录中。 ## 安装到 Wazuh 在您想要运行此 AR 的 Wazuh **agent** 上: 1. 将构建好的二进制文件复制到 agent 的主动响应目录中(根据需要调整路径和文件名): ``` sudo install -o root -g wazuh -m 750 build/firewall-ipset /var/ossec/active-response/bin/firewall-ipset ``` 2. 在 Wazuh **manager** 上,在 `/var/ossec/etc/ossec.conf` 中配置命令和主动响应(简化示例)。请注意,该命令需要以 `root` 身份运行,以确保 `ipset` 操作能够成功执行: ``` firewall-ipset firewall-ipset yes ar-ipset-v4 ar-ipset-v6 no firewall-ipset local 12345 600 ``` 3. 重启 Wazuh 组件以应用更改: ``` sudo systemctl restart wazuh-agent sudo systemctl restart wazuh-manager ``` 请根据您的环境自行调整名称、规则 ID 和超时时间。 ### 创建 ipset 集合 在使用此主动响应之前,您必须创建在 `extra_args` 中引用的 ipset 集合(例如 `ar-ipset-v4` 和 `ar-ipset-v6`)。在 Wazuh agent 上以 `root` 用户身份运行以下命令: ``` # IPv4 set (IPv4 地址的 hash) sudo ipset create ar-ipset-v4 hash:ip family inet # IPv6 set (IPv6 地址的 hash) sudo ipset create ar-ipset-v6 hash:ip family inet6 ``` 这些命令会创建两个适用于屏蔽 IP 地址的简单哈希集合。请根据您的环境需要,自行调整名称和 ipset 选项(例如 `timeout`、`maxelem`)。 ## Wazuh 主动响应协议 此二进制程序遵循 Wazuh 的**有状态主动响应**模式。完整详情请参阅官方文档: - Wazuh 文档:[自定义主动响应脚本](https://documentation.wazuh.com/current/user-manual/capabilities/active-response/custom-active-response-scripts.html) 关键点: - 输入为每次调用读取的单个 JSON 对象,通过 `stdin` 读取。 - 对于有状态 AR,脚本可以发送 `check_keys` 控制消息,并且必须等待 Wazuh 的响应(`continue` / `abort`)。 - 交换的每条 JSON 消息都作为以 `\n` 结尾的单行发送。 - `parameters.extra_args` 必须是包含两个元素的数组: - 索引 0:用于 IPv4 地址的 ipset 名称 - 索引 1:用于 IPv6 地址的 ipset 名称 ### 状态图 以下 Mermaid 状态图概括了此二进制程序实现的主要有状态 AR 流程: ``` stateDiagram-v2 [*] --> ReadAlert ReadAlert: Read alert JSON from stdin ReadAlert --> ParseAlert ParseAlert: Parse JSON, extract srcip, command, list name ParseAlert --> DecideCommand DecideCommand: Decide add/delete DecideCommand --> AddFlow: command == "add" DecideCommand --> DeleteFlow: command == "delete" state AddFlow { [*] --> SendControl SendControl: Send check_keys control message SendControl --> WaitResponse WaitResponse: Wait for response JSON WaitResponse --> HandleResponse HandleResponse: Parse response.command HandleResponse --> AddIp: response.command == "continue" HandleResponse --> Abort: response.command == "abort" or invalid AddIp: Add IP to ipset AddIp --> ExitAdd Abort: Log abort/invalid Abort --> ExitAdd ExitAdd: Exit with OS_SUCCESS/OS_FAILURE } state DeleteFlow { [*] --> DeleteIp DeleteIp: Delete IP from ipset DeleteIp --> ExitDelete ExitDelete: Exit with OS_SUCCESS/OS_FAILURE } ExitAdd --> [*] ExitDelete --> [*] ``` ## 本地测试 您可以通过将示例 AR JSON 消息通过管道传入程序来进行本地测试。这**不能**完全模拟 Wazuh,但有助于验证解析和基本的错误处理。 1. 构建项目(参见上文的**构建说明**),然后在仓库根目录下创建一个包含两行内容的精简测试文件。此示例使用了占位符 ipset 名称 `ar-ipset-v4` 和 `ar-ipset-v6`,这些集合应当已经在系统中存在: ``` cat > sample-add.json << 'EOF' {"version":1,"origin":{"name":"test-agent","module":"wazuh-execd"},"command":"add","parameters":{"extra_args":["ar-ipset-v4","ar-ipset-v6"],"alert":{"data":{"srcip":"192.0.2.10"}},"program":"firewall-ipset"}} {"version":1,"origin":{"name":"test-manager","module":"wazuh-execd"},"command":"continue","parameters":{}} EOF ``` - **第 1 行**是包含 `command: "add"` 的告警消息。 - **第 2 行**是包含 `command: "continue"` 的模拟 Wazuh 响应。 2. 以 `root` 用户身份运行该二进制程序,并通过 `stdin` 传入这两条 JSON 消息: ``` sudo ./build/firewall-ipset < sample-add.json ``` 程序将会: - 读取第 1 行(告警),解析它,并向 `stdout` 打印一条 `check_keys` 控制消息。 - 读取第 2 行(响应),识别到 `command: "continue"`,并尝试将该 IP 添加到配置的 ipset 中。 3. 要测试 `delete` 流程,请创建一个类似的单行文件,例如: ``` echo '{"version":1,"origin":{"name":"test-agent","module":"wazuh-execd"},"command":"delete","parameters":{"extra_args":["ar-ipset-v4","ar-ipset-v6"],"alert":{"data":{"srcip":"192.0.2.10"}},"program":"firewall-ipset"}}' > sample-delete.json sudo ./build/firewall-ipset < sample-delete.json ``` 在这种情况下,程序将直接尝试从配置的 ipset 中移除该 IP,然后退出。
标签:Bash脚本, certspotter, ipset, Linux防火墙, Wazuh, 主动响应, 安全运营, 客户端加密, 扫描框架