Halino/Wazuh-PostgreSQL
GitHub: Halino/Wazuh-PostgreSQL
为 Wazuh 提供支持英意双语的 PostgreSQL 日志解码器与规则集,解决非英语 locale 下默认解码器无法捕获本地化日志告警的问题。
Stars: 0 | Forks: 0
# 适用于 Wazuh 的 PostgreSQL 日志解析器(支持英/意双语)
**Decoders** 和 **rules**,使 Wazuh 能够摄取并分析 **PostgreSQL** 服务器日志——包括在**非英语 locale** 下运行的服务器。
## 原因
当 PostgreSQL 使用本地化的 `lc_messages`(例如 `it_IT`)运行时,它会用该语言写入日志
严重级别和消息:用 `FATALE` 代替 `FATAL`,用 `ERRORE` 代替
`ERROR`,用 `permesso negato` 代替 `permission denied`。**Wazuh 默认的 PostgreSQL
decoders 仅匹配英语**,并会默默漏掉这些行——因此一个带有意大利语
日志的数据库*完全不会*产生 PostgreSQL 告警。
此 ruleset 解析标准的 `log-line-prefix` 格式,并且这些 rules 可**同时匹配英语
和意大利语**,因此无论服务器 locale 如何,身份验证失败、破坏性 DDL 和权限更改都能被捕获。
## 包含内容
| 文件 | 用途 |
|------|--------|
| `wazuh/decoders/postgresql_decoders.xml` | 解析 ` [] : ` |
| `wazuh/rules/postgresql_rules.xml` | 检测身份验证失败、破坏性 DDL、权限更改、FATAL/PANIC |
| `wazuh/ossec-postgresql.conf.snippet` | 示例 `localfile` + 所需的 `postgresql.conf` 设置 |
| `tests/sample_logs.txt` | 用于 `wazuh-logtest` 的英语 + 意大利语示例行 |
## 规则
| Rule ID | Level | 检测内容 | MITRE |
|---------|-------|---------|-------|
| 110000 | 0 | 分组(任何 PostgreSQL 日志行) | — |
| 110001 | 7 | `FATAL`/`PANIC` (EN) · `FATALE`/`PANICO` (IT) | — |
| 110002 | 6 | 身份验证失败 / 权限被拒绝(双语) | T1078 |
| 110003 | 4 | `ERROR` / `ERRORE` | — |
| 110004 | 11 | 破坏性 DDL:`DROP …` / `TRUNCATE` | T1485 |
| 110005 | 7 | 权限 / 角色更改:`GRANT`/`REVOKE`/`CREATE ROLE` | T1098 |
| 110006 | 0 | 降低常规应用 SQL 噪音(约束/重复键/autovacuum)的级别 | — |
| 110007 | 10 | 重复的身份验证失败 = 暴力破解(频率 5 / 120 秒) | T1110 |
Rule ID 使用专门的 **110000-110007** 区间,以避免与其他 rulesets 冲突。
### 误报处理
- **110004 / 110005** 使用了负向先行断言(negative lookahead),因此回显的绑定值或包含 `DROP`/`GRANT` 单词的 `DETAIL:` /
`Parameters:` 行**不会**触发——只有真正的语句才会触发。
- **110006** 将常规的应用程序 SQL 错误(外键/唯一性约束冲突、死锁、
autovacuum、语法错误)降级为级别 0,这样应用程序 bug 就不会淹没告警流。如果你*确实*
想要这些信息,可以删除/调整它。
## 部署
### 1. 将 decoder 和 rules 复制到 Wazuh manager
```
sudo cp wazuh/decoders/postgresql_decoders.xml /var/ossec/etc/decoders/
sudo cp wazuh/rules/postgresql_rules.xml /var/ossec/etc/rules/
sudo systemctl restart wazuh-manager
```
### 2. 收集 PostgreSQL 日志
在**数据库服务器**(Wazuh agent)上——或者如果 PostgreSQL 在本地,则在 manager 上——将
`wazuh/ossec-postgresql.conf.snippet` 中的 `localfile` 块添加到 `ossec.conf` 中,并
指向你的 PostgreSQL 日志路径。
### 3. 确保 PostgreSQL 记录了你想要检测的内容
在 `postgresql.conf` 中:
```
logging_collector = on
log_line_prefix = '%m [%p] ' # timestamp + pid — matches the decoder
log_statement = 'ddl' # required for DROP/TRUNCATE/GRANT detection
# log_connections = on # 可选:auth 事件上的 source host
```
## 测试
```
/var/ossec/bin/wazuh-logtest
```
粘贴(意大利语 locale)示例:
```
2026-07-06 09:14:02.001 CEST [3312] FATALE: autenticazione con password fallita per l'utente "app"
```
预期结果:decoder `postgresql-local`,rule **110002**(authentication_failed,T1078)。
完整的英语 + 意大利语集合请参见 `tests/sample_logs.txt`。
## 兼容性
- Wazuh 4.x(使用 `pcre2` decoders/fields)。
- PostgreSQL 12+(带时间戳 + `[pid]` 前缀的 stderr 日志记录)。已针对 PG 17 进行测试。
## 许可证
MIT — 请参见 [许可证](LICENSE)。
标签:PostgreSQL, Wazuh, 日志解析, 测试用例, 红队行动, 证书伪造, 防御框架