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, 主机入侵检测, 内容过滤, 插件系统, 现代安全运营, 网络安全监控, 越狱测试, 驱动开发