Suricata – 入侵检测、预防和安全工具

一、Suricata介绍

Suricata是一个功能强大、用途广泛的开源威胁检测引擎,提供入侵检测 (IDS)、入侵防御 (IPS) 和网络安全监控功能。它执行深度数据包(网络流量)检查以及模式匹配,在威胁检测中非常强大。
工作流程:
主要特点:
  • IDS/IPS – Suricata 是一个基于规则的入侵检测和防御引擎,它利用外部开发的规则集(例如Talos规则集和新兴威胁 Suricata 规则集)来监控网络流量中是否存在任何恶意活动、策略违规和威胁。
  • 自动协议检测——Suricata 引擎自动检测 HTTP 和 HTTPS 等协议。任何端口上的 FTP 和 SMB,并应用适当的检测和日志记录逻辑。这在检测恶意软件和 CnC 通道时派上用场。
  • Lua 脚本——Suricata 可以调用提供高级恶意软件检测的Lua脚本,以检测和解码原本难以检测的恶意软件流量。
  • 多线程——Suricata在确定网络流量时提供速度和重要性。该引擎旨在应用现代多核硬件芯片组提供的增强处理能力。

二、安装与使用Suricata

2.1、安装

因为官方的PPA可以用于安装。要安装最新的稳定Suricata版本,请执行以下步骤:
sudo add-apt-repository ppa:oisf/suricata-stable
sudo apt-get update
sudo apt-get install suricata  jq
添加了专用的PPA存储库,更新索引后,可以安装Suricata。我们建议此时安装jq工具,因为它将有助于显示Suricata的EVE JSON输出中的信息。
安装Suricata后,您可以检查您运行的Suricata的版本、选项以及服务状态:
sudo suricata --build-info
sudo systemctl status suricata
  
执行文件:/usr/bin/suricata
配置项与rule规则集:/etc/suricata/
需要重点关注的是suricata.yaml和rules文件夹
  • suricata.yaml文件是对于suricata的软件配置。
  • rules文件夹中存放了相关的检测规则,如果在suricata运行过程中有数据包分析触发了检测规则,则会以日志的形式输出。
日志文件:/var/log/suricata/,也可以在配置文件suricata.yaml中更改default-log-dir
  • eve.json:告警和事件的详细信息
  • fast.log:告警信息简单汇总,一行内容,不是具体信息
  • stats.log:引擎统计信息,比如内存使用计数、数据包数量计数
  • suricata.log:suricata启动过程相关日志
   
基本指令操作:
升级Suricata:
sudo apt-get update
$ sudo apt-get upgrade suricata
 
删除Suricata:
sudo apt-get remove suricata
 
希望 Suricata 具有内置(启用)调试:
sudo apt-get install suricata-dbg 

2.2、配置Suricata

> 首先要配置内部网络和外部网络参数,修改配置文件/etc/suricata/suricata.yaml
HOME_NET: "[192.168.0.0/16,10.0.0.0/8,172.16.0.0/12]"  # 内网是HOME_NET参数,设置为系统内网网段
EXTERNAL_NET: "!$HOME_NET"  # 指定外部网络
> 指定Suricata检查网络流量的网络接口(ip addr查看):
  
> 确保将default-rule-path属性设置为/etc/suricata/rules:
  
> 保存更改并关闭配置文件。然后重新启动Suricata以应用更改:
sudo systemctl restart suricata

2.3、更新Suricata规则集

默认情况下,Suricata附带一组有限的检测规则,位于/etc/suricata/rules/目录中。但是这些规则在检测威胁入侵方面能力较弱,可以更新业内知名的第三方规则集来提高检测效果。
  
Suricata提供了一个名为suricata-update的工具,它允许您从规则集提供者那里获取规则。有些是免费的,例如ET Open set,而有些则需要付费订阅。
它是一个用Python编写的工具,可以使用pip全局安装Suricata-Update供所有用户使用:pip3 install --upgrade suricata-update
   
要为您的服务器获取最新的规则集,请运行以下命令
$ sudo suricata-update update-sources  # 更新规则集索引
$ sudo suricata-update list-sources  列出默认的规则提供程序集
$ sudo suricata-update enable-source et/open  # 添加规则集et/open
$ sudo suricata-update -o /etc/suricata/rules
从输出中,您可以看到suricata-update获取免费的Emerging Threats ET Open Rules并将它们保存到 Suricata 的/etc/suricata/rules/suricata规则文件。此外,它表示处理的规则数。在此示例中,总共添加了45266个。其中,启用了35359个,删除了6个,修改了131个。
   

2.4、测试 Suricata 规则

在开始测试Suricata之前,建议先测试一下配置是否正常:
$ sudo suricata -T -c /etc/suricata/suricata.yaml -v
  
这里将按照Suricata 的快速入门指南的建议,通过模拟入侵来测试ET Open规则集。
通过向作为NIDS( 网络入侵和检测系统)框架的 testmynids.org网站发送 HTTP 请求,将使用签名 ID 2100498 测试 IDS 功能。
   
2100498:
/etc/suricata/rules/ suricata.rules中存在2100498:
alert ip any any -> any any (msg : "GPL ATTACK_RESPONSE id check returned root" ; content : "uid=0|28|root|29|" ; classtype :bad -unknown ; sid : 2100498 ; rev : 7 ; metadata :created_at 2010_09_23 , updated_at 2010_09_23 ;)
这 将对任何在其有效负载中包含内容的 IP 流量发出警报。
   
应该得到以下输出:
发送的 HTTP请求旨在通过模仿id命令的输出来触发警报,该命令可能通过 shell 在受感染的远程系统上运行。
现在让我们筛选 Suricata 的日志以获取相应的警报。Suricata 附带两个默认启用的日志文件:
  • /fast.log
  • /var/log/suricata/eve.json
将使用grep 命令在/var/log/suricata/fast.log日志文件中检查与curl 请求相对应的日志条目。我们将使用快速入门文档中的2100498规则标识符搜索日志条目:
$ grep 2100948 /var/log/suricata/fast.log, 这样将获得以下表示入侵的输出:
或者,您可以检查/var/log/suricata/eve.log日志文件中的签名 ID 2100498,如图所示
$ jq 'select(.alert .signature_id==2100498)' /var/log/suricata/eve.json

三、suricata-update规则管理 

Suricata-Update是更新和管理Suricata规则的官方方式。
安装: pip3 install --upgrade suricata-update
  
更新规则
suricata-update命令将执行以下操作:
  • 查找suricata路径上的程序以确定其版本;
  • 查找/etc/suricata/enable.conf,/etc/suricata/disable.conf,/etc/suricata/drop.conf和/etc/suricata/modify.conf以查找要应用于下载规则的过滤器。这些文件是可选的,不需要存在。
  • 下载适用于您的Suricata版本的Emerging Threats Open规则集,如果找不到则默认为4.0.0。
  • 应用上面加载的启用,禁用,删除和修改过滤器。
  • 写出规则/etc/suricata/rules/suricata.rules。
  • 在测试模式下运行Suricata  /etc/suricata/rules/suricata.rules
   
suricata-update用法:
root@node1:/etc/suricata# suricata-update -h
usage: suricata-update update [-h] [-v] [-q] [-D <directory>] [-c <filename>]
                              [--suricata-conf <filename>] [--suricata <path>]
                              [--suricata-version <version>]
                              [--user-agent <user-agent>]
                              [--no-check-certificate] [-V] [-o <directory>]
                              [-f] [--yaml-fragment <filename>] [--url <url>]
                              [--local <path>] [--sid-msg-map <filename>]
                              [--sid-msg-map-2 <filename>]
                              [--disable-conf <filename>]
                              [--enable-conf <filename>]
                              [--modify-conf <filename>]
                              [--drop-conf <filename>] [--ignore <pattern>]
                              [--no-ignore] [--threshold-in <filename>]
                              [--threshold-out <filename>]
                              [--dump-sample-configs] [--etopen]
                              [--reload-command <command>] [--no-reload]
                              [-T <command>] [--no-test] [--no-merge]
                              [--offline] [--fail]
optional arguments:
  -h, --help            show this help message and exit
  -v, --verbose         更详细的输出
  -q, --quiet           安静地跑。仅显示警告和错误消息
  -D <directory>, --data-dir <directory>
                        设置备用数据目录 (default: /var/lib/suricata)
  -c <filename>, --config <filename>
                        suricata-update配置文件的路径 (default/etc/suricata/update.yaml)
  --suricata-conf <filename>
                        suricata配置文件的路径 (default/etc/suricata/suricata.yaml)
  --suricata <path>     Suricata程序的路径
  --suricata-version <version>
                        将Suricata版本设置为特定版本,而不是检查路径上的Suricata版本。
  --user-agent <user-agent>
                        为HTTP请求设置自定义用户代理字符串
  --no-check-certificate
                        Disable server SSL/TLS certificate verification
  -V, --version         显示suricata-update的版本
  -o <directory>, --output <directory>
                        要将规则输出到的目录
  -f, --force           强制远程规则文件下载(如果它们不是刚刚下载),或者远程校验和与缓存副本匹配
  --yaml-fragment <filename>
                        Output YAML fragment for rule inclusion
  --url <url>           从中下载规则的URL。此选项可以多次使用
  --local <path>        要包含的本地规则文件的文件名或目录的路径
  --sid-msg-map <filename>
                        Generate a sid-msg.map file
  --sid-msg-map-2 <filename>
                        Generate a v2 sid-msg.map file
  --disable-conf <filename>
                        Filename of rule disable filters
  --enable-conf <filename>
                        Filename of rule enable filters
  --modify-conf <filename>
                        Filename of rule modification filters
  --drop-conf <filename>
                        Filename of drop rule filters
  --ignore <pattern>    Filenames to ignore (can be specified multiple timesdefault: *deleted.rules)
  --no-ignore           Disables the ignore option.
  --threshold-in <filename>
                        Filename of rule thresholding configuration
  --threshold-out <filename>
                        Output of processed threshold configuration
  --dump-sample-configs
                        Dump sample config files to current directory
  --etopen              默认下载ET / Open规则集
  --reload-command <command>
                        Command to run after update if modified
  --no-reload           禁用Suricata规则重新加载
  -T <command>, --test-command <command>  指定自定义测试命令以在重新加载Suricata之前测试规则
  --no-test             禁用测试命令并继续进行,就像它已经通过一样
  --no-merge            不要将规则合并到单个规则文件中。警告:如果2个输入规则文件具有相同名称,则不会尝试解决冲突。
  --offline             Run offline using most recent cached rules
  --fail                Strictly fail and exit in case of an error
other commands:
    update-sources             Update the source index
    list-sources               List available sources
    enable-source              Enable a source from the index
    disable-source             Disable an enabled source
    remove-source              Remove an enabled or disabled source
    add-source                 Add a new source by URL
    check-versions             Check version of suricata-update

四、Suricata规则

suricata规则由三部分组成:
  • Action:规则匹配后所执行的操作;
  • Header:定义规则的协议、源和目的IP地址、端口和流量方向;
  • Options:选项,指定诸如签名ID(sid)、日志信息、匹配数据包内容的正则表达式、分类类型,以及其他可以帮助缩小识别合法和可疑流量的修饰语 。
一条自定义规则:
alert http any any <> $HOME_NET 80 (msg:"web服务器出现404状态码"; content: "404"; http_stat_code; sid:561001;)
Action取值范围如下:
  • pass:如果匹配到规则,suricate会停止扫描并放行数据包
  • drop:如果程序匹配到了这类规则,这个数据包被阻断将不会被发送到目标。Drop只能在IPS/inline模式下可用。缺点:接收器没有接收到正在发生事情的信息,导致超时(TCP),Suricata对这个数据包生成一个警报。
  • reject:不同于 Drop 直接丢弃数据包,reject 在匹配到规则时会主动进行拒绝数据包。有两种类型的拒绝数据包将自动选择。当违规数据包与TCP有关时,会发送Reset-Packet包。对其他所有协议,会发送ICMP-error包。Suricata同时会生成一个警告。在Inline/IPS模式下,违规数据包也会被drop掉,与Drop action相似。
  • alert:当匹配到规则时,Suricata 不会对数据包进行任何操作,会像对正常数据包一样进行放行,除了会记录一条只有管理员能够看到的警
以上四种操作也是有优先级的,默认的优先级为:Pass > Drop > Reject > Alert。也就是规则在匹配时会优先考虑包含 Pass 的规则,其次才是 Drop,再然后是 Reject,最后再考虑包含 Alert 的规则
  
Header包含如下几项内容
  • 协议(Protocol):这个字段用来告诉 Suricata当前规则所包含的协议。其取值可以为:tcp,udp,icmp,ip,http,ftp,tls(包含ssl),smb,dns等;这些协议能不能用取决于配置文件suricata.yaml中是否配置了这些协议
  • 源/目的地址(Source and destination):源/目的地址可以设置为 IP 地址或者在配置文件(Suricata.yaml)里定义的变量;
  • 端口号(Ports):不同的协议使用不同的端口号,例如 HTTP 使用 80 端口,而 HTTPS则使用 443。通常情况下端口号会设置为 any,这样会影响所有的协议;
  • 流向(Direction):流向告诉规则匹配哪些流量数据,是源ip到目标ip的单项流量,还是2个ip往返之间的流量。其中,每条规则都必须有一个箭头如示:->或<>。
Options包含一系列选项,选项以key:value或者key的形式存在,用;进行分隔<keyword>: <settings>; <keyword>;

五、添加自己的Suricata规则

1、在/etc/suricata/rules/下创建my.rules文件
 
2、向my.rules中写入自己的规则
# 百度搜素
alert tcp any any -> any any (msg:"hit baidu.com..."; content:"baidu"; reference:url, www.baidu.com; sid:888888890;)
alert tcp any any -> any any (msg:"hit baidu.com"; content:"baidu"; sid:888888891;)
 
# 登录dvwa
alert http any any <> any any (msg:"dvwa url"; content:"/login.php";  http_uri; nocase; sid:8880; rev:1;)
alert http any any -> any any (msg:"dvwa protocol"; flow:to_server; http_protocol; content:"HTTP/1.1"; sid:8881; rev:1;)
alert http any any -> any any (msg:"dvwa request header";  content:"application/x-www-form-urlencoded"; http_header; sid:8882; rev:1;)
alert http any any -> any any (msg:"dvwa request referer"; http_referer;  content:"http://192.168.11.45/login.php"; sid:8883; rev:1;)
alert http any any -> any any (msg:"dvwa request user agent";  content:"Mozilla/5.0"; http_user_agent; nocase; sid:8884; rev:1;)
alert http any any -> any any (msg:"dvwa request cookie";  content:"security=impossible"; http_cookie; nocase; sid:8885; rev:1;)
alert http any any -> any any (msg:"dvwa request body";  content:"username=admin"; http_client_body; nocase; sid:8886; rev:1;)
alert http any any -> any any (msg:"dvwa request body"; file_data;  content:"username=admin"; content:"password=password"; nocase; sid:88861;  rev:1;)
alert http any any <> any any (msg:"dvwa"; content: "200"; http_stat_code; sid:8887; rev:1;)
alert http any any <> any any (msg:"dvwa"; content: "302"; http_stat_code; sid:8888; rev:1;)
alert http any any <> any any (msg:"dvwa code"; content:"impossible"; nocase; sid:8889; rev:1;)
# sqli-lab
alert http any any -> any any (msg:"SQL注入攻击"; content:"/Less-1"; http_uri; nocase; sid:562001; rev:1;)
alert http any any -> any any (msg:"SQL注入攻击-union."; content:"select"; http_uri; nocase; classtype:web-sql-injection; sid:562002; rev:1;)
alert http any any -> any any (msg:"SQL注入攻击---."; content:"--"; http_uri; nocase; classtype:web-sql-injection; sid:562003; rev:1;)
alert http any any -> any any (msg:"SQL注入攻击response."; content:"Your Login name"; http_server_body; nocase; classtype:web-sql-injection; sid:562004; rev:1;)
alert http any any -> any any (msg:"SQL注入攻击response_1."; http_server_body;  content:"Your Login name"; content:"Your Password"; nocase;  classtype:web-sql-injection; sid:562005; rev:1;)    # 语法解析error
alert http any any -> any any (msg:"SQL注入攻击response_2."; file_data; content:"Your Login name"; content:"Your Password"; nocase;  classtype:web-sql-injection; sid:562006; rev:1;)
3、更新Suricata配置文件/etc/suricata/suricata.yaml,确保你的本地规则文件已添加到规则列表:
4、如果您必须更正您的规则和/或修改Suricata的YAML配置文件,那么您必须重新启动Suricata。
systemctl restart suricata
 
5、运行suricata并查看是否正在加载规则。
suricata -c /etc/suricata/suricata.yaml -i ens160
比如错误的规则被检测出来了:
如果规则未能加载,Suricata将显示与它认为该规则不可加载时一样多的信息。特别注意细节:查找特殊字符、空格、大写字符等的错误。
6、虚拟机上网页访问baidu.com或者curl baidu.com 
7、笔记本上网页访问http://192.168.11.45/login.php,输入用户密码,登录
8、网页访问http://192.168.11.45:8080/Less-1/?id=-1' UNION SELECT 1,2,3 --+

六、参考

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值