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, 主动响应, 安全运营, 客户端加密, 扫描框架