使用Snort进行网络入侵流量检测
Snort是一种开源网络入侵检测系统 (NIDS),使用基于签名的检测技术分析网络流量并检测威胁。它提供灵活的规则语言,因此用户可以编写自己的威胁检测规则或自定义现有规则。此外snort还拥有社区提供的大量规则。
主机安全(HIDS)很多人都知道,但是NIDS大部分人都了解比较少,本文通过部署开源的snort作为NIDS检测主机流量。
HIDS和NIDS的区别
HIDS(主机入侵检测系统)和NIDS(网络入侵检测系统)的主要特点和差异:
特点 | HIDS(主机入侵检测系统) | NIDS(网络入侵检测系统) |
---|---|---|
监控范围 | 监控单个主机的内部活动和状态 | 监控网络的数据流动 |
部署位置 | 部署在特定主机上 | 部署在网络的关键交汇点,如网络边界或核心交换机附近 |
侦测内容 | 系统调用、文件系统访问、系统日志等 | 捕获和分析网络流量,如数据包内容 |
主要功能 | 检测未授权文件改动、系统配置异常、恶意软件活动等 | 检测拒绝服务攻击、端口扫描、恶意流量模式等 |
面对威胁 | 侧重防范内部威胁和后门攻击 | 侧重检测网络层面的攻击和异常活动 |
局限性 | 无法获得网络层面的信息,可能影响主机性能 | 对加密流量的分析能力受限,难以深入单一主机的具体应用层面 |
安装 Snort
apt install snort -y
安装完成后查看snort版本。
root@VM-24-5-ubuntu:~# snort -V ,,_ -*> Snort! <*- o" )~ Version 2.9.15.1 GRE (Build 15125) '''' By Martin Roesch & The Snort Team: http://www.snort.org/contact#team Copyright (C) 2014-2019 Cisco and/or its affiliates. All rights reserved. Copyright (C) 1998-2013 Sourcefire, Inc., et al. Using libpcap version 1.10.1 (with TPACKET_V3) Using PCRE version: 8.39 2016-06-14 Using ZLIB version: 1.2.11
curl testmyids.com tail -f /var/log/snort/snort.alert.fast
测试 Snort 是否正常工作。
Snort 分析 PCAP 文件
为了开始分析,运行 Snort 的系统上必须存在 PCAP 文件。可以在snort的主机上用tcpdump抓包保存为pcap文件后用snort分析。下面的命令分为3个不同窗口执行。
python3 -m http.server 80 tail -f /var/log/snort/snort.alert.fast tcpdump -i eth0 -w snort-test.pcap
用python监听80端口。
然后随便用一个扫描器扫描。
扫描完成后终止tcpdump抓包。
snort -r snort-test.pcap -c /etc/snort/snort.conf 2>&1 | less
使用snort分析刚才抓包的pcap流量。
告警内容输出到/var/log/snort/snort.alert.fast文件中。
查看Snort告警日志
Snort的日志文件位于:/var/log/snort
snort.alert.fast 包含了简略的告警信息,比如触发的什么规则,以及对应的id。
而Snort.log中就包含了触发告警的原始请求信息。
手动添加Snort规则
上面的测试中都是用的Snort默认自带的规则。我们也可以添加自己的规则,比如http请求中包含snort-test-payload的就告警。
vim /etc/snort/rules/local.rules
添加下面的内容然后重启。
alert tcp $EXTERNAL_NET any -> $HOME_NET $HTTP_PORTS (msg:"Detected Snort Test Payload in HTTP Request"; flow:to_server,established; content:"snort-test-payload"; http_uri; sid:1000001; rev:1; classtype:web-application-attack; priority:2;)
systemctl restart snort
这条规则的组成部分说明如下:
- alert tcp: 规则动作和协议,表示对TCP协议生成警告。
- $EXTERNAL_NET any -> $HOME_NET $HTTP_PORTS: 规则的网络地址和端口,表示从任何外部地址到内网HTTP端口的流量。
- msg:”Detected Snort Test Payload in HTTP Request”: 规则触发时的消息。
- flow,established: 流量方向和状态,只检测建立了的向服务器的流量。
- content:”snort-test-payload”: 规则内容,检测HTTP请求URI中含有”snort-test-payload”字符串。
- http_uri: 指定
content
检测的位置在HTTP URI中。 - sid:1000001: 规则的唯一标识符(Signature ID)。
- rev:1: 规则的修订版本号。
- classtype: 规则分类。
- priority:2: 规则的优先级。
自动生成Snort规则
上面的规则自己写会非常麻烦,网上有现成Snort规则生成工具。
https://github.com/chrisjd20/Snorpy
Snort 禁用指定规则
我是在腾讯云上部署的snort,云主机自身会有ping的动作会导致持续触发snort的规则告警。
误报对我们造成的的干扰非常大,我们可以禁用掉这条规则。
root@VM-24-5-ubuntu:~# grep -irn "ICMP PING NMAP" /etc/snort/rules/ /etc/snort/rules/icmp.rules:32:alert icmp $EXTERNAL_NET any -> $HOME_NET any (msg:"ICMP PING NMAP"; dsize:0; itype:8; reference:arachnids,162; classtype:attempted-recon; sid:469; rev:3;)
找到对应的规则文件位置,手动注释掉。
修改完规则文件后,需要重启Snort服务以使更改生效。
赞赏微信赞赏支付宝赞赏
发表评论