senhafathimaa/ELK-Host-Based-Intrusion-Detection-System

GitHub: senhafathimaa/ELK-Host-Based-Intrusion-Detection-System

本项目通过集成 Suricata 与 ELK Stack 构建了一套实时主机入侵检测与安全告警可视化系统。

Stars: 0 | Forks: 0

# 基于 ELK Stack 和 Suricata 的主机入侵检测系统 ## 目录 - [概述](#overview) - [架构](#architecture) - [工具与技术](#tools--technologies) - [数据流](#data-flow) - [安装说明](#installation) - [配置说明](#configuration) - [检测规则](#detection-rules) - [仪表盘设置](#dashboard-setup) - [结果](#results) - [挑战与解决方案](#challenges--solutions) - [总结](#conclusion) ## 概述 本项目通过在 Kali Linux 主机上集成 **Suricata** 与 **ELK Stack**(Elasticsearch、Logstash、Kibana),实现了一个基于主机的入侵检测系统(HIDS)。该系统捕获实时网络流量,通过日志 pipeline 进行处理,并在 Kibana 仪表盘上可视化实时的安全警报。 项目中使用了一台 **Windows 虚拟机**(在相同的局域网内通过 VirtualBox 运行)来模拟攻击,包括针对 Kali 主机的 ICMP ping、Nmap 扫描以及 SSH 暴力破解尝试。 ## 架构 ┌─────────────────────────────────────────────────────────────────┐ │ Kali Linux 主机 (192.168.0.105) │ │ │ │ ┌───────────┐ ┌──────────┐ ┌──────────┐ ┌─────────┐ │ │ │ Suricata │───▶│ Filebeat │───▶│ Logstash │───▶│ Elastic │ │ │ │ (IDS/NSM) │ │ (Ship) │ │ (Process)│ │ search │ │ │ └───────────┘ └──────────┘ └──────────┘ └────┬────┘ │ │ ▲ │ │ │ │ ┌────▼────┐ │ │ wlan0 interface │ Kibana │ │ │ │ :5061 │ │ └─────────────────────────────────────────────────── └─────────┘ │ ▲ │ 相同的局域网 (192.168.0.0/24) ┌────────┴──────────┐ │ Windows 虚拟机 │ │ (VirtualBox) │ │ 192.168.0.107 │ │ • Ping │ │ • Nmap 扫描 │ │ • SSH 尝试 │ ## └───────────────────┘ ## 工具与技术 | 工具 | 版本 | 角色 | |---|---|---| | Kali Linux | Bare metal | 宿主机操作系统 | | Suricata | 8.0.5 | 网络 IDS / NSM | | Elasticsearch | 9.x | 数据存储与搜索引擎 | | Logstash | 9.x | 日志处理 pipeline | | Kibana | 9.x | 可视化与仪表盘 | | Filebeat | 9.x | 日志转发器 | | VirtualBox | — | Windows 虚拟机宿主机 | | Windows 虚拟机 | — | 攻击流量源 | ## 数据流 Suricata (eve.json) │ ▼ Filebeat ──────▶ Logstash (:5044) ──────▶ Elasticsearch (:9200) │ ▼ Kibana (:5061) 1. Suricata 监控 `wlan0` 并将结构化的 JSON 事件写入 `/var/log/suricata/eve.json` 2. Filebeat 持续读取 `eve.json` 并将日志发送至端口为 `5044` 的 Logstash 3. Logstash 解析并丰富这些事件,然后将其转发给 Elasticsearch 4. Elasticsearch 将数据索引到 `suricata-YYYY.MM.dd` 的 index 模式下 5. Kibana 查询 Elasticsearch 并将数据渲染为交互式仪表盘 ## 安装说明 ### 1. Elasticsearch ``` dpkg -i elasticsearch-*.deb sudo systemctl enable elasticsearch sudo systemctl start elasticsearch ``` ### 2. Logstash ``` dpkg -i logstash-*.deb sudo systemctl enable logstash sudo systemctl start logstash ``` ### 3. Kibana ``` dpkg -i kibana-*.deb sudo systemctl enable kibana sudo systemctl start kibana ``` ### 4. Filebeat ``` dpkg -i filebeat-*.deb sudo systemctl enable filebeat sudo systemctl start filebeat ``` ### 5. Suricata ``` sudo apt install suricata -y sudo systemctl enable suricata sudo systemctl start suricata ``` ## 配置说明 ### Elasticsearch (`/etc/elasticsearch/elasticsearch.yml`) ``` network.host: "0.0.0.0" http.port: 9200 transport.host: "0.0.0.0" ``` 重置 elastic 用户密码: ``` sudo /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic ``` 如果出现权限错误,请进行修复: ``` sudo chown -R elasticsearch:elasticsearch /etc/elasticsearch sudo chmod -R 750 /etc/elasticsearch ``` 验证 Elasticsearch 是否正在运行: ``` curl -k -u elastic: https://localhost:9200 ``` ### Kibana (`/etc/kibana/kibana.yml`) ``` server.port: 5061 server.host: "0.0.0.0" elasticsearch.hosts: ["https://localhost:9200"] elasticsearch.password: "" elasticsearch.ssl.certificateAuthorities: ["/etc/kibana/ca.crt"] elasticsearch.ssl.verificationMode: full ``` 复制 Elasticsearch CA 证书: ``` sudo cp /etc/elasticsearch/certs/http_ca.crt /etc/kibana/ca.crt ``` 生成加密密钥并添加到 `kibana.yml`: ``` sudo /usr/share/kibana/bin/kibana-encryption-keys generate ``` 生成服务账号 token(密码的替代方案): ``` sudo /usr/share/elasticsearch/bin/elasticsearch-service-tokens create elastic/kibana kibana-token ``` ### Logstash (`/etc/logstash/conf.d/pipeline.conf`) ``` input { beats { port => 5044 } } filter { if [message] =~ /^\{.*\}$/ { json { source => "message" target => "suricata" } } } output { elasticsearch { hosts => ["https://localhost:9200"] user => "elastic" password => "" index => "suricata-%{+YYYY.MM.dd}" ssl_enabled => true ssl_certificate_authorities => ["/etc/logstash/certs/http_ca.crt"] ilm_enabled => false } } ``` 复制 CA 证书并修复权限: ``` sudo mkdir -p /etc/logstash/certs sudo cp /etc/elasticsearch/certs/http_ca.crt /etc/logstash/certs/ sudo chown logstash:logstash /etc/logstash/certs/http_ca.crt sudo chmod 644 /etc/logstash/certs/http_ca.crt sudo chown -R logstash:logstash /var/lib/logstash /var/log/logstash ``` 验证 Logstash 是否正在监听: ``` sudo ss -tulnp | grep 5044 ``` ### Suricata (`/etc/suricata/suricata.yaml`) ``` af-packet: - interface: wlan0 - eve-log: enabled: yes filetype: regular filename: /var/log/suricata/eve.json default-rule-path: /var/lib/suricata/rules rule-files: - local.rules ``` 验证配置: ``` sudo suricata -T -c /etc/suricata/suricata.yaml -v ``` ### Filebeat (`/etc/filebeat/filebeat.yml`) ``` filebeat.inputs: - type: filestream id: my-filestream-id enabled: true paths: - /var/log/suricata/eve.json - /var/log/auth.log output.logstash: hosts: ["localhost:5044"] ``` 修复权限并进行测试: ``` sudo chmod 644 /var/log/suricata/eve.json sudo chmod 644 /var/log/auth.log sudo filebeat test output ``` ## 检测规则 文件:`/etc/suricata/rules/local.rules` alert icmp any any -> any any (msg:"ICMP Ping Detected"; itype:8; sid:1000001; rev:1;) alert tcp any any -> any 22 (msg:"SSH Brute-Force Attempt"; flow:to_server,established; content:"SSH-"; threshold:type threshold, track by_src, count:5, seconds:60; sid:1000002; rev:1;) alert tcp any any -> any any (msg:"Nmap SYN Scan Detected"; flags:S; threshold:type threshold, track by_src, count:20, seconds:10; sid:1000003; rev:1;) alert tcp any any -> any any (msg:"Nmap NULL Scan Detected"; flags:0; sid:1000004; rev:1;) alert tcp any any -> any any (msg:"Nmap Xmas Scan Detected"; flags:FPU; sid:1000005; rev:1;) 将规则复制到 Suricata 的规则路径: ``` sudo cp /etc/suricata/rules/local.rules /var/lib/suricata/rules/ ``` ## 仪表盘设置 1. 前往 **Stack Management → Data Views → Create data view** - Index pattern: `suricata-*` - Timestamp field: `@timestamp` 2. 前往 **Analytics → Discover**,选择 `suricata-*` —— 应该会显示超过 1,600 个文档 3. 过滤警报:`suricata.event_type: alert` 4. 前往 **Analytics → Visualize Library → Create visualization → Lens** | 设置 | 值 | |---|---| | Data view | `suricata-*` | | Filter | `suricata.event_type: alert` | | Chart type | Bar | | Horizontal axis | `@timestamp` | | Vertical axis | Count of records | 5. 保存为 **"Alert Types Breakdown"** 并将其添加到仪表盘 ## 结果 - 测试期间在 Kibana Discover 中确认了 **82 个警报事件** - 所有 **5 条自定义 Suricata 规则** 均已成功加载并触发 - 仪表盘显示测试期间有明显的**警报活动激增** - 最高激增:6 月 8 日主动进行 ICMP ping 测试期间出现了 **20 多个警报** ## 挑战与解决方案 | 挑战 | 解决方案 | |---|---| | Kibana 拒绝了 elastic 超级用户账号 | 通过 `elasticsearch-service-tokens` 使用了服务账号 token | | Elasticsearch 文件权限错误 | 运行了 `sudo chown -R elasticsearch:elasticsearch /etc/elasticsearch` | | Logstash 权限问题 | 修复了 `/var/lib/logstash` 的所有权,并始终通过 systemd 运行 | | Suricata 规则路径不匹配 | 将规则从 `/etc/suricata/rules/` 复制到了 `/var/lib/suricata/rules/` | | Filebeat 启动失败 | 将已弃用的 `log` 输入类型替换为 `filestream`(Filebeat 9) | | Kibana 无法通过 HTTPS 连接到 Elasticsearch | 复制了 `http_ca.crt` 并在 kibana.yml 中设置了 `ssl.certificateAuthorities` | ## 总结 本项目成功演示了如何从零开始集成开源工具,以构建一个可用的实时入侵检测与可视化系统。Suricata 监控了实时主机流量,检测了来自 Windows 虚拟机的模拟攻击,而完整的 ELK pipeline 则负责传输、存储和可视化由此产生的警报。 虽然 Suricata 主要是一款网络 IDS/IPS,但将其部署在主机自身的 interface 上,使其能够有效地进行主机级别的监控。在生产环境中,将其部署在网络网关或 SPAN 端口上,可以将监控范围扩展到整个网络。 ## 作者 **Senha Fathima** ## 许可证 本项目仅用于教育和研究目的。
标签:Beacon Object File, ELK Stack, Metaprompt, Suricata, 主机入侵检测, 内容过滤, 插件系统, 现代安全运营, 网络安全监控, 越狱测试, 驱动开发