OzarkMountainPirate/suricata-elk
GitHub: OzarkMountainPirate/suricata-elk
一套将 pfSense/Suricata 的 EVE 日志通过 TCP 完整推送至自托管 ELK Stack 并进行 GeoIP 富化的端到端部署方案。
Stars: 0 | Forks: 0
# suricata-elk
通过 **TCP** 将 pfSense/Suricata 的 EVE 日志推送到自托管的 ELK stack,并
进行 GeoIP 富化以及配置受限(非超级用户)的摄入路径。本文档记录了在 **elk-host**(Debian,Docker host)上运行并由 **gateway**(运行 Suricata + syslog-ng 的 pfSense 防火墙)提供数据的
实际部署方案。
## 为什么会有这个项目 / 最关键的那个决策
Suricata 可以直接将 EVE JSON 发送到 syslog,但在 pfSense 上,该路径会经过内置的
`syslogd`,这会**在 1024 字节处截断 UDP 数据报**。超长的 DNS/QUIC/TLS 记录会在 JSON 解析到一半时被截断,导致 Logstash 抛出解析
错误。解决方法在于架构调整,而不是简单调整配置参数:
1. 将 Suricata 的 **EVE Output Type 设置为 `File`**(而不是 Syslog)。Suricata 会将
完整的 JSON 写入 `eve.json`。
2. 使用 **syslog-ng 轮询该文件**,并通过 **TCP** 将其转发给 Logstash,
同时剥离所有 syslog 帧格式(`template("${MESSAGE}\n")`),确保最终抵达的
是原始的换行符分隔的 JSON。
3. Logstash 使用 `json_lines` codec 和提升后的
`decode_size_limit_bytes` 来读取数据,确保数据再也不会被截断。
本仓库中的所有其他配置都源于此。
## 数据流向
```
pfSense (gateway) elk-host (Docker host)
+------------------------------+ +------------------------------+
| Suricata (WAN + LAN ifaces) | | |
| EVE output type: File | | |
| /var/log/suricata/.../ | | |
| eve.json | | |
| | | | |
| v | | Logstash (network_mode host)|
| syslog-ng | TCP 5514 | tcp input :5514 |
| source: tail eve.json | --------------> | json_lines codec |
| dest: network() tcp | (raw JSON, | drop non-EVE |
| template ${MESSAGE}\n | newline- | date -> @timestamp |
| | delimited) | geoip src_ip / dest_ip |
+------------------------------+ | | |
| v |
| Elasticsearch :9200 (local) |
| index suricata-YYYY.MM.dd |
| user: logstash_internal |
| | |
| v |
| Kibana (Traefik, TLS) |
| kibana.lan.example.com |
+------------------------------+
```
## 仓库结构
```
elastic/ The ELK compose stack (mirrors /opt/containers/elastic)
docker-compose.yml ES + Kibana + Logstash, final hardened state
.env.example Secret placeholders (copy to .env, never commit .env)
logstash/config/ logstash.yml
logstash/pipeline/ suricata.conf <- the ingest pipeline
es-setup/ One-time Elasticsearch bootstrap (run once)
bootstrap-es.sh Creates index template + scoped role + ingest user
patch-existing-index.sh Optional: geo_point mapping for a pre-existing index
index-template-suricata.json
role-logstash_writer.json
geo-mapping-existing-index.json
pfsense/syslog-ng/ syslog-ng object parameters for the pfSense package
nftables/ Snippet to permit TCP 5514 from the pfSense host
kibana/ Vega Sankey spec + dashboard notes (WIP)
docs/ Full step-by-step walkthrough (start at 01)
```
## 快速开始
[`docs/`](docs/) 中的完整指南才是真正的指导文档;简而言之:
1. **ELK stack** — `cp elastic/.env.example elastic/.env`,填入密钥,
执行 `docker compose up -d`。设置 `kibana_system` 密码并将其同步到
`.env` 中。([docs/02](docs/02-elk-stack-deploy.md))
2. **ES bootstrap** — 在 `elastic/` 目录下,运行 `../es-setup/bootstrap-es.sh` 来
创建 index template、`logstash_writer` 角色以及
`logstash_internal` 用户。([docs/06](docs/06-security-hardening.md),
[docs/07](docs/07-geoip-enrichment.md))
3. **pfSense Suricata** — 在每个受监控的
接口上将 EVE Output Type 设置为 **File**。([docs/03](docs/03-pfsense-suricata.md))
4. **syslog-ng** — 创建 source/destination/log 对象。
([docs/04](docs/04-syslog-ng-forwarding.md))
5. **防火墙** — 允许来自 pfSense 主机的 TCP 5514 端口访问 elk-host。
([docs/01](docs/01-architecture.md))
6. **Kibana** — 创建 `suricata` data view 并构建仪表板
(WIP)。([docs/08](docs/08-kibana-dashboards.md))
## 适配您的环境
将以下示例值替换为您自己的配置:
| 本仓库中的值 | 含义 |
|-------------------------------|------------------------------------------|
| `192.168.1.10` | elk-host (Logstash/ELK host) LAN 地址 |
| `192.168.1.1` | gateway (pfSense/syslog-ng host) |
| `kibana.lan.example.com` | 内部 Kibana 主机名 (Traefik) |
| `suricata_` | WAN Suricata EVE 目录 (见下文) |
| `suricata_` | LAN Suricata EVE 目录 |
| `` | 仪表板过滤器中使用的 LAN NIC 名称 |
Suricata EVE 目录的名称因实例而异。在
pfSense 主机上使用 `ls /var/log/suricata/` 查找您的目录。
## 版本控制
采用语义化版本控制;在仪表板尚未稳定期间版本号为 `0.x`。参见
[`CHANGELOG.md`](CHANGELOG.md)。带标签的发布版本标志着重要的里程碑。
## License
GPL-3.0-or-later。参见 [`LICENSE`](LICENSE)。
标签:ELK Stack, Metaprompt, pfSense, Suricata, syslog-ng, 内容过滤, 应用安全, 版权保护, 现代安全运营, 请求拦截, 越狱测试, 运维