前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[ffffffff0x] 开源IDS与IPS的搭建与使用 Suricata

[ffffffff0x] 开源IDS与IPS的搭建与使用 Suricata

原创
作者头像
r0fus0d
修改2021-01-25 10:09:29
4.1K0
修改2021-01-25 10:09:29
举报
文章被收录于专栏:ffffffff0xffffffff0x

前言

多年来,Snort 一直是开源入侵检测/防御系统(IDS / IPS)的实际标准,但随着越来越多的服务器网卡带宽提升,Snort对线路上的数据包进行计算密集型的入侵检测越来越困难。这种情况下,可以考虑部署开源的IDS工具:Suricata。


Suricata

简介

Suricata 是由 OISF(开发信息安全基金会)开发,它也是基于签名,但是集成了创新的技术。该引擎嵌入了一个 HTTP 规范化器和分析器(HTP 库),可提供非常先进的 HTTP 流处理,从而能够在 OSI 模型的第七层(应用层)上解析流量。

Suircata 是一款支持 IDS 和 IPS 的多线程入侵检测系统。与传统 Snort 相比,Suircata 的多线程和模块化设计使其在效率和性能上超过了原有 Snort,它将 CPU 密集型的深度包检测工作并行地分配给多个并发任务来完成。这样的并行检测可以充分利用多核硬件的优势来提升入侵检测系统的吞吐量,在数据包的深度检测上效果优越。同时,Suircata 可以兼容现有的 Snort 规则签名,还增加了对 ipv6 的支持,已经逐渐成为传统 Snort 入侵检测系统的代替方案。

架构

Suricata 有三种运行模式,分别为 single,workers,autofp。官方推荐性能最佳的运行模式为 workers 。

  • single 模式:只有一个包处理线程,一般在开发模式下使用。
  • workers 模式:多个包处理线程,每个线程包含完整的处理逻辑。
  • autofp 模式:有多个包捕获线程,多个包处理线程。一般适用于 nfqueue 场景,从多个 queue 中消费流量来处理。

报文检测系统通常包含四大部分,报文获取、报文解码、报文检测、日志记录;Suricata 不同的功能安装模块划分,一个模块的输出是另一个模块的输入。

搭建

Suricata 的搭建过程非常简单,如果是通过软件源安装只需要添加相应仓库源即可

代码语言:txt
复制
sudo add-apt-repository ppa:oisf/suricata-stable
sudo apt update
sudo apt install suricata jq

测试使用

代码语言:txt
复制
suricata-update # 更新规则
代码语言:txt
复制
suricata -T     # 测试运行
代码语言:txt
复制
suricata -i ens33 -c /etc/suricata/suricata.yaml    # 启动运行

如果要使Suricata发挥出最大功力。还可以配置加上 luajit、PF_RING。

LuaJIT

LuaJIT 是采用 C 语言写的 Lua 代码的解释器,LuaJIT 试图保留 Lua 的精髓--轻量级,高效和可扩展。

代码语言:txt
复制
wget https://luajit.org/download/LuaJIT-2.0.5.tar.gz
tar -zxf LuaJIT-2.0.5.tar.gz
cd LuaJIT-2.0.5/
sudo make && make install

配置文件

/etc/suricata/ 目录下有4个配置文件和一个文件夹,作用分别是:

  • classification.config : 定义了各种流量攻击类型和优先级,类似拒绝服务攻击和 web 应用攻击等
  • reference.config : 记录一些安全网站,漏洞平台的网址,或者是自己可以自定义的 url,是参考的意思,用来联系外部的恶意攻击检测网站中关于此类攻击的页面。
  • suricata.yaml : Suricata 默认的配置文件,以硬编码的形式写在源代码中,里面定义了几乎关于 Suricata 的所有运行内容,包括运行模式、抓包的数量和大小、签名和规则的属性和日志告警输出等等。
    • 先设置 HOME_NETEXTERNAL_NET,推荐 HOME_NET 填写内网网段,EXTERNAL_NET 设置为 any
    • 如果 HOME_NET 设置了 anyEXTERNAL_NET 设置 !$HOME_NET 的话会报错,如果 HOME_NET 设置了内网地址,EXTERNAL_NET 设置为 !$HOME_NET 的话,有些内网之间的告警就无法匹配到
  • threshold.config : threshold(阈值)关键字可用于控制规则的警报频率,可用于在规则生成警报之前为其设置最小阈值.
  • rules : 规则目录,存放不同种类的规则,规则用来判定流量攻击类型,并定义攻击类型和告警种类,可以存放自带的规则,也可以自己按规则语法编写

规则详解

suricata 完全兼容 snort 规则

代码语言:txt
复制
alert modbus any any -> any any (msg:"SURICATA Modbus Request flood detected"; flow:to_server;app-layer-event:modbus.flooded; classtype:protocol-command-decode; sid:2250009; rev:2;)
- alert:默认顺序为:pass,drop,reject,alert,跳过、丢弃、拒绝、警告四种类型的动作
- Modbus:注明协议种类,UDP/ICMP 等
- Any:源地址/目的地址(IP)
- Any:源端口/目的端口
- ->:方向,单向流量;<>双向流量
- Any:源地址/目的地址(IP)
- Any:源端口/目的端口
- msg:”SURICATA Modbus Request flood detected”:关键字 msg 提供对触发警报的有关签名/规则相关文本提示信息
- flow:to_server:客户端到服务器
- app-layer-event:modbus.flooded:具体攻击内容
- classtype:protocol-command-decode:提供有关规则和警报分类的信息,由 classification.config 文件定义。
- sid:2250009:用于唯一性规则标识,sid 不能重复
- rev:2:规则版本号,每次修改规则 rev 则递增1

完整规则

代码语言:txt
复制
alert  tcp $EXTERNAL_NET $FILE_DATA_PORTS -> $HOME_NET any (msg:"INDICATOR-SHELLCODE  heapspray characters detected - ASCII     "; flow:to_client,established; file_data; content:"0d0d0d0d";  fast_pattern:only; metadata:service ftp-data, service http,service imap, service  pop3;  reference:url,sf-freedom.blogspot.com/2006/07/heap-spraying-internet-exploiter.html;  classty    pe:attempted-user; sid:33339;  rev:1;)
  • alert tcp $EXTERNAL_NET $FILE_DATA_PORTS -> $HOME_NET any
  • 规则行为 协议 源ip 源端口 流量方向 目标ip 目标端口 红色代表规则头
    • 规则行为,根据优先级排列:
      • pass 如果匹配到规则后,suricata 会停止扫描数据包,并跳到所有规则的末尾
      • drop ips 模式使用,如果匹配到之后则立即阻断数据包不会发送任何信息
      • reject 对数据包主动拒绝,接受者与发送中都会收到一个拒绝包
      • alert 记录所有匹配的规则并记录与匹配规则相关的数据包
    • 协议:在规则中指定匹配那些协议,suricata 支持的协议要比 snort 多一些
      • TCP、UDP、ICMP、IP(同时用与 TCP 与 UDP)、http、ftp、smb、dns
    • 源 ip,目标 ip:
      • 支持单个 ip,cidr,ip 组,96.30.87.36,96.32.45.57,所有主机 any,以及规则文件中配置的 ip 变量 $HOME_NET(受保护的 ip 段)与 $EXTERNAL_NET(其他所有 ip):
    • 源端口/目标端口:
      • 支持设置单个端口 80,端口组80,8080,端口范围1024:65535以及 any 任意端口,还可以在配置文件中添加端口组,通过 ! 号来进行排除
    • 流量方向:
      • -> 单向流量,从源 ip 到目标 ip 的单项流量
      • <> 双向流量,2个 ip 往返之间的流量
  • 规则体 : (msg:"INDICATOR-SHELLCODE heapspray characters detected - ASCII "; flow:to_client,established; file_data; content:"0d0d0d0d"; fast_pattern:only; metadata:service ftp-data, service http,service imap, service pop3; reference:url,sf-freedom.blogspot.com/2006/07/heap-spraying-internet-exploiter.html; classtype:attempted-user; sid:33339; rev:1;)
    • MSG:规则名称,规则中的第一个字段
      • ids告警上显示的信息,INDICATOR-SHELLCODE heapspray characters detected - ASCII
    • 源 ip、目标 ip 检测:
      • sameip 会将流量中源 ip 和目标 ip 相同的显示出来
      • alert ip any any -> any any (msg:"GPL SCAN same SRC/DST"; sameip; reference:bugtraq,2666; reference:cve,1999-0016; reference:url,www.cert.org/advisories/CA-1997-28.html; classtype:bad-unknown; sid:2100527; rev:9; metadata:created_at 2010_09_23, updated_at 2010_09_23;)
    • flow 流匹配:
      • flow 是特定时间内具有相同数据的数据包(5元组信息)同属于一个流,suricata 会将这些流量保存在内存中。
      • flowbits set , name 设置条件
      • flowbits isset, name 选择条件
      • 一旦设置 flowbits 之后,第一条规则没有命中那么第二条规则即使命中了也不会显示出来,例如一些攻击行为的响应信息,现在请求中设置条件,然后在响应中选择条件
      • to_client/from_server 服务器到客户端
      • to_server/from_client 客户端到服务器
      • established 匹配已经建立连接的(tcp 则是经过3次握手之后,udp 则是有双向流量)
      • no_established 匹配不属于建立连接的
      • only_stream 匹配由流引擎重新组装的数据包
      • no_stream 不匹配流引擎重新组装的数据包
    • 阀值 threshold:
      • threshold: type <threshold|limit|both>, track <by_src|by_dst>, count <N>, seconds <T>
      • threshold 最小阀值 也就是说只有匹配到至少多少次数才进行告警
      • limit 限制告警次数,例如最少5分钟内告警一次
      • 调节阀值主要是通过 2 种方法,一种是通过规则内的 threshold 关键字来调节,下图中类型是 limit 也就是限制告警次数,track by_s rc代表来源 ip,seconds 60 每个60秒告警一次 count 1
      • 另外一种则是通过配置文件 /etc/suricata/threshold.config 来进行控制,更加推荐这种方法,写在规则内部每次更新后都会替换掉。
      • event_filter gen_id 1(组id), sig_id 1101111(规则id), type limit ,track by_src, count 1 , seconds 60
      • suppress 则是告警排除,排除指定 ip 产生的规则告警
    • 内容匹配 content:检测数据包中是否存在此内容,例如检测流量中是否存在 0d0d0d0d
      • 如果有多个匹配项可以使用 content:"evilliveshere"; content:"here"; 这种写法,注意如果没有用内容修饰的话,ids 不会按照先后顺序去匹配的,只会在内容中匹配是否包含这2个值,必须用内容修饰来调整先后顺序,用 distance 0 来让第二个匹配项在第一个匹配项匹配位置之后匹配,并且如果有多个 content 他们的关系是 and 关系必须都匹配到才告警 。
      • 使用感叹号 ! 对匹配项的否定:content:!"evilliveshere";
      • 将字符串的十六进制用管道符(|)进行包围:content:"|FF D8|"; 字符串与十六进制混合使用:content:"FF |SMB|25 05 00 00 80";
      • 匹配内容区分大小写,保留字符(; \ "|)须进行转义或十六进制转码
      • 内容修饰,能够更加精准匹配
      • 不区分大小写 nocase:
        • content:"root";nocase; #修饰符直接在;号后面添加
      • 偏移位置 offset:
        • content:"xss";offset 100; #代表了从数据包开始位置0往后偏移100位字节后进行匹配
      • 结束位置 depth:
        • content:"xss";offset 100;depth 200; #代表了匹配数据包结束的位置,如果没有offset则是从开始位置计算,有offset则是从offset开始,此次则是从100字节开始匹配到200字节内的内容。
      • 在xx范围外 distance :
        • 本次匹配必须在上一次匹配结束位置到distance设置的偏移位置区间之外,例如content:"msg1";content:"msg2";distance 25; 如果msg1在第100行找到,那么就会在100+25后匹配msg2
      • 在xx范围内 within:
        • 本次匹配必须在上一次匹配结束位置之内,如果上次结束是100,within 15;那么第二次匹配必须在100到115之内开始匹配,如果within与distance同时出现 content:"evilliveshere"; content:"here"; distance:1;within:7; 则匹配here在 evilliveshere位置结束1-7内匹配
      • 有效载荷大小 dsize:
        • dsize: >64 用来匹配payload大小,可以用来检测异常包大小
      • pcre正则 pcre:
        • content:"xss"; pcre:"xss\w" 先匹配content内容后才进行匹配pcre正则,这样的话减少系统开销
      • http修饰符:
        • 更多详细内容查看:http://suricata.readthedocs.io/en/suricata-4.0.4/rules/http-keywords.html
        • alert tcp any any -> any 80(msg:"Evil Doamin www.appliednsm.com"; "content:"GET";httpmethod; content:"www.appliednsm.com";http_uri; sid:5445555; rev:1;)
        • http_client_body HTTP客户端请求的主体内容
        • http_cookie HTTP头字段的“Cookie”内容
        • http_header HTTP请求或响应头的任何内容
        • http_method 客户端使用的HTTP方法(GET,POST等)
        • http_uri HTTP客户端请求的URI内容
        • http_stat_code 服务器响应的HTTP状态字段内容
        • http_stat_message 服务器响应的HTTP状态消息内容
        • http_encode 在HTTP传输过程中所使用的编码类型
        • url_len url长度
      • 快速匹配模式:
        • fast_pattern; 如果suricata规则中有多个匹配项目,快速匹配的目的是设置优先级最高的匹配项,如果设置了快速匹配模式没有命中则跳过这条规则
    • 元数据 Metadata:
      • suricata 会忽略元数据背后的语句,用于添加备注
    • 组gid:
      • 1:2000000 告警前面的 1 代表组 id
    • 优先级 priority:
      • 手动设置规则优先级别,范围 1-255,1 最高,一般都是 1-4,suricata 会首先检查优先级较高的规则
    • 引用 reference:
      • 连接外部信息来源,补充描述,reference:url,sf-freedom.blogspot.com/2006/07/heap-spraying-internet-exploiter.html
    • 类别 classtype:
      • 根据规则检测到的活动类型为规则分类,classtype:attempted-user
    • 特征标示符 sid:
      • 用于唯一性规则标识,sid 不能重复,0-10000000 VRT 保留,20000000-29999999 Emerging 保留,30000000+:公用
    • 修订 rev:
      • 规则版本号,每次修改规则 rev 则递增 1

规则修改

代码语言:txt
复制
suricata-update list-sources    # 列出当前的规则源
suricata-update                 # 更新规则

例如要禁用某一个规则,直接新建 /etc/suricata/disable.conf 文件,然后在里面填入 sid,每次更新的话会自动禁止该规则。

规则更新后,所有的规则都会保存在 /var/lib/suricata/rules/suricata.rules 文件中,这时候就必须修改 suricata 配置文件的 default-rule-path 与 rule-files 来指定规则文件到这个规则上。

suricata 主要是 et/open 规则,这是系统自带的规则,目前开源免费的就是 et/open、pt 规则、sslbl 规则,其余的均需要授权码才能更新。


总结

本文介绍了Linux环境下Suricata的安装和配置,同时介绍了配置文件和相应的配置规则,Suricata与Snort都是非常优秀的NIDS工具,Suricata对于高并发下的场景支持性更好,如果配合分布式ELK,安全能力将更上一层。


本文作者 r0fus0d

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • Suricata
    • 搭建
      • 规则详解
      • 总结
      相关产品与服务
      主机安全
      主机安全(Cloud Workload Protection,CWP)基于腾讯安全积累的海量威胁数据,利用机器学习为用户提供资产管理、木马文件查杀、黑客入侵防御、漏洞风险预警及安全基线等安全防护服务,帮助企业构建服务器安全防护体系。现支持用户非腾讯云服务器统一进行安全防护,轻松共享腾讯云端安全情报,让私有数据中心拥有云上同等级别的安全体验。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档