目录
5.3 发送请求到testmynids.org测试suricata
7. suricata通过filebeat将日志发送到kafka
1.指定内部IP和外部网络
编辑配置文件/etc/suricata/suricata.yaml
对于HOME_NET指令,指定系统IP地址
HOME_NET: "[192.168.3.0/24]"
将EXTERNAL_NET指令设置为!$HOME_NET
EXTERNAL_NET:"!$HOME_NET"
2.指定suricata检测网络流量的网络借口
2.1 监听单张网卡
设置系统网络监听接口名称为:enp1s0
2.2 监听两张网卡
配置示例:
# 定义全局设置
global:
# ... 其他全局配置 ...
# 定义af-packet监听器
af-packet:
# 监听器1:用于eth0网卡
- interface: eth0
threads: 1 # 根据需要调整线程数
cluster-id: 99 # 如果使用集群功能,请设置相应的ID
cluster-type: auto
# 其他可能的参数,如cluster-queue-length等,根据需求设置
# cluster-type设置为auto表示Suricata将自动选择最佳的集群类型。
# 监听器2:用于eth1网卡
- interface: eth1
threads: 1 # 根据需要调整线程数
cluster-id: 100 # 如果使用集群功能,请设置相应的ID(确保与上一个不同)
cluster-type: auto
# 其他可能的参数,如cluster-queue-length等,根据需求设置
# cluster-type设置为auto表示Suricata将自动选择最佳的集群类型。
# ... 其他配置,如规则文件、输出设置等 ...
我的配置如下:
af-packet:
- interface: ens1f0
# Number of receive threads. "auto" uses the number of cores
#threads: auto
# Default clusterid. AF_PACKET will load balance packets based on flow.
cluster-id: 99
- interface: ens1f1
# Number of receive threads. "auto" uses the number of cores
#threads: auto
# Default clusterid. AF_PACKET will load balance packets based on flow.
cluster-id: 100
注:建议将不同网卡的Cluster-ID设置为不同的值。
Cluster-ID用于在负载平衡时为相应的接口进行分组线程。当Suricata使用af-packet抓包驱动时,它可以基于流量对数据包进行负载均衡。这个过程中,Cluster-ID起到了关键作用:
- 流量分配:Cluster-ID允许Suricata根据网络流量的特性将数据包分配到不同的处理线程或核心上。这样做可以提高处理效率,特别是在多核处理器系统中。
- 接口分组:在配置多个网络接口时,为每个接口指定一个独特的Cluster-ID可以确保它们在负载均衡过程中被正确处理。这样可以避免数据包处理时的冲突或重复。
- 性能优化:结合其他参数,如cluster-type和硬件特性(例如RSS队列),Cluster-ID可以帮助优化Suricata的性能,特别是在高性能网络环境中。
cluster-flow
是cluster-type的一个可能值。当设置为cluster-flow时,Suricata将使用基于流的集群模式。在这种模式下,流量将根据流(例如,具有相同源和目标IP地址以及端口的TCP或UDP会话)在集群中的不同节点之间进行分配。这有助于确保同一流的所有数据包都由同一个Suricata实例处理,从而简化了状态管理和数据处理。
使用cluster-flow模式时,Suricata会利用某种形式的流量分配机制(如哈希函数)来确定每个流应该被发送到哪个节点。这样可以实现负载均衡,并确保流量在集群中的节点之间均匀分布。
3.设置suricata规则路径
将default-rule-path属性设置为/etc/suricata/rules
设置完成后,重启suricata服务
4.更新suricata规则集
默认情况下,suricata附带一组有限的检测规则,位于/etc/suricata/rules目录中,然而,这些被认为在检测入侵方面很弱且无效。需要加载被认为是suricata最全面的规则集,ET规则。
suricata提供了一个名为 suricata-update 的工具,用于更新规则集。
sudo suricata-update -o /etc/suricata/rules
4.1 查看规则提供程序集
suricata-update工具允许您从规则集提供者那里获取规则,有些是免费的,例如ET OPEN set,有些则需要付费订阅。
列出默认的规则提供程序集。
sudo suricata-upate list-sources
4.2 添加规则集
添加规则集,例如 tgreen/hunting 规则集,
sudo suricata-update enable-source tgreen/hunting
5. 测试规则集
5.1 测试suricata配置
在开始测试suricata之前,先测试下配置是否正常
sudo suricata -T -c /etc/suricata/suricata.yaml -v
确认没有报错后,在启动suricata。
5.2 启动suricata
如果是通过包管理器直接安装的suricata,则可以通过systemctl来启动和查看suricata。
sudo systemctl start suricata
sudo systemctl enable suricata
sudo systemctl status suricata
如果是手动编译安装suricata,则通过命令来启动suricata。
suricata -c /etc/suricata/suricata.yaml -i enp1s0
为suricata添加守护进程,使用systemctl来管理。
cd /lib/systemd/system/
vim suricata.service
suricata.service的内容如下:
[Unit]
Description=Suricata IDS/IDP daemon
After=network.target network-online.target
Requires=network-online.target
[Service]
Type=forking
#Environment=LD_PRELOAD=/usr/lib/libtcmalloc_minimal.so.4
PIDFile=/run/suricata.pid
ExecStart=/usr/bin/suricata -D --af-packet -c /etc/suricata/suricata.yaml --pidfile /run/suricata.pid
ExecReload=/usr/bin/suricatasc -c reload-rules ; /bin/kill -HUP $MAINPID
ExecStop=/usr/bin/suricatasc -c shutdown
Restart=on-failure
RestartSec=15
ProtectSystem=full
ProtectHome=true
[Install]
WantedBy=multi-user.target
5.3 发送请求到testmynids.org测试suricata
通过向作为NIDS(网络入侵和检测系统)框架的testmynids.org网站发送HTTP请求。
将使用签名ID 2100498测试IDS功能。
curl http://testmynids.org/uid/index.html
得到以下输出。
uid=0(root) gid=0(root) groups=0(root)
发送到HTTP请求旨在通过模仿id命令的输出来出发报警,该命令可能通过shell在受感染的远程系统上运行。
现在筛选suricata的日志来获取相应的警报。
suricata附带两个默认启用的日志文件。
/var/log/suricata/fast.log
/var/log/suricata/eve.log
使用grep命令在/var/log/suriata/fast.log日志文件中检查与curl请求相对应的日志条目。使用 2100498 规则标识符来搜索日志条目。
grep 2100498 /var/log/suricata/fast.log
将获得以下表示入侵的输出。
08/05/2023-22:49:50.170203 [**] [1:2100498:7] GPL ATTACK_RESPONSE id check returned root [**] [Classification: Potentially Bad Traffic] [Priority: 2] {TCP} 18.66.122.56:80 -> 192.168.3.36:40334
或者,检查/var/log/suricata/eve.log日志文件中的签名ID 2100498
apt install jq
jq 'select(.alert .signature_id==2100498)' /var/log/suricata/eve.json
sec@dyp-elk:~$ jq 'select(.alert .signature_id==2100498)' /var/log/suricata/eve.json
{
"timestamp": "2023-08-05T22:49:50.170203+0800",
"flow_id": 1402112037181580,
"in_iface": "enp1s0",
"event_type": "alert",
"src_ip": "18.66.122.56",
"src_port": 80,
"dest_ip": "192.168.3.36",
"dest_port": 40334,
"proto": "TCP",
"pkt_src": "wire/pcap",
"alert": {
"action": "allowed",
"gid": 1,
"signature_id": 2100498,
"rev": 7,
"signature": "GPL ATTACK_RESPONSE id check returned root",
"category": "Potentially Bad Traffic",
"severity": 2,
"metadata": {
"created_at": [
"2010_09_23"
],
"updated_at": [
"2010_09_23"
]
}
},
"http": {
"hostname": "testmynids.org",
"url": "/uid/index.html",
"http_user_agent": "curl/7.74.0",
"http_content_type": "text/html",
"http_method": "GET",
"protocol": "HTTP/1.1",
"status": 200,
"length": 39
},
"files": [
{
"filename": "/uid/index.html",
"gaps": false,
"state": "CLOSED",
"stored": false,
"size": 39,
"tx_id": 0
}
],
"app_proto": "http",
"direction": "to_client",
"flow": {
"pkts_toserver": 7,
"pkts_toclient": 5,
"bytes_toserver": 562,
"bytes_toclient": 888,
"start": "2023-08-05T22:49:48.981814+0800",
"src_ip": "192.168.3.36",
"dest_ip": "18.66.122.56",
"src_port": 40334,
"dest_port": 80
}
}
sec@dyp-elk:~$
6. 日志轮训
suricata通过logrotate配置日志轮训,自动切割日志。防止单个日志文件过大。
6.1 eve.json日志
vim /etc/logrotate.d/suricata-eve
/var/log/suricata/eve.json {
daily
rotate 3
maxsize 2048M
noolddir
missingok
notifempty
dateext
dateformat %Y-%m-%d-%s
postrotate
/bin/kill -HUP $(cat /var/run/suricata.pid)
endscript
}
6.2 fast.log日志
vim /etc/logrotate.d/suricata-fast
/var/log/suricata/fast.log {
daily
rotate 3
maxsize 2048M
noolddir
missingok
notifempty
dateext
dateformat %Y-%m-%d-%s
postrotate
/bin/kill -HUP $(cat /var/run/suricata.pid)
endscript
}
强制执行,测试是否配置成功
sudo logrotate -f /etc/logrotate.d/suricata-eve
每天自动执行
cat /etc/cron.daily/logrotate
#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.conf
也可以配置定时任务来执行,每五分钟执行一次日志轮训命令
crontab -u root -e
*/5 * * * * /usr/sbin/logrotate /etc/logrotate.conf
7. suricata通过filebeat将日志发送到kafka
可选,如果想将suricata日志发送到态势平台分析使用,可以发送到kafka来进行无边界数据流的接收。
配置文件filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/suricata/eve.json
fields:
topic: wuhan-ndr-suricata
time_zone: "Asia/Shanghai"
output.kafka:
hosts: ["x.x.x.x:9092"]
topic: '%{[fields.topic]}'
code.json: true