一、基于流量的入侵检测系统
1、基于主机的入侵检测系统——HIDS
(1)功能
①通过监控和分析系统日志、应用程序日志和安全日志来识别异常活动和潜在威胁。
②通过跟踪分析系统上的命令执行和系统调用来检查是否存在恶意命令执行或不正常的系统操作。
③可以定期对系统进行安全评估。
④通过监控关键的系统配置文件和系统状态来确保它们在未经授权的情况下被修改。
(2)不足
已知,apache的post请求的主体内容在access日志中是没有,需要开启apache的调试模式,post的主体内容才会在error日志中显示,但是会产生大量的调试信息,耗费服务器的资源,因此生成环境下一般不开启apache的调试模式。
至于MySql的查询日志也同样是不开启的
(3)解决问题
对于主机层面无法检测的内容可以在流量层面对其进行检测,也就是NIDS、NIPS(入侵防御系统)。
①解决主机日志
WAF:一套基于流量的入侵检测响应系统,但是只对http和https流量进行检测。而对于检测HTTPS来说,需要先解密再进行检测,这需要搭配反向代理来实现。下面是通常情况下的部署,如图:
上图属于串联,WAF的具体内容为NIDS,而对于HIDS来说,旁挂更为合适。
②解决MySql数据库
使用数据库审计系统(DAS),基于流量的审计系统,只针对Sql语句进行检测。部署图如下:
二、suricata
1、部署surcata
(1)安装
sudo yum install -y epel-release yum-plugin-copr
sudo yum copr enable @oisf/suricata-7.0 #导入存储库可能会失败,可以不用管
sudo yum install suricata #如果导入存储库失败,安装的默认是4.1.10版本
(2)查看软件包名和安装路径
rpm -qa suricata # 查看软件包名
whereis suricata
(3)启动与错误处理
安装后直接启动:
suricata -c /etc/suricata/suricata.yaml -i ens33 #启动命令
yml与yaml一样。
查询网卡:
ifconfig
出现警告:
虽然已经启动,但是警告没有规则。
vi /etc/suricata/suricata.yaml
cd /var/libsuricata #到该目录下
mkdir rules #创建文件夹
touch /etc/suricata/rules/suricata.rules #创建规则文件
写入规则
vi suricata.rules
规则:
alert http $EXTERNAL_NET any <> $HOME_NET 80 (msg:"出现404错误"; content: "404"; http_stat_code; sid:561001;) #警告规则
修改主配置文件
vi /etc/suricata/suricata.yaml
修改后:
配置完毕,再次运行
suricata -c /etc/suricata/suricata.yaml -i ens33
动态查看日志:
之前我们在规则文件里加入了一条规则
alert http $EXTERNAL_NET any <> $HOME_NET 80 (msg:"出现404错误"; content: "404"; http_stat_code; sid:561001;) #警告规则
该规则是用于告警404的,比如当一个攻击者对你的网站进行扫描时就会短时间内多次触发该规则,suricata就会不断进行报警,提示监管者进行安全操作。
我们来试一试
动态查看告警日志
tail -f fast.log
2、编写规则
(1)格式
直接对我们之前使用的404警告规则进行分析
alert http $EXTERNAL_NET any <> $HOME_NET 80 (msg:"出现404错误"; content: "404"; http_stat_code; sid:561001;rev:1;)
第一个字段:动作,取值alert(告警),还要一个动作是:drop(丢弃,无法单独使用,
需要和iptalbes进行结合)
第二个字段:协议,取值http,取值可以是网络层及其上层协议(网络层、传输层、应用
层协议)。其中有一个是https,由于https是加密的,因此需要配合反向代理使
得WAF可以先进行解密然后再进行检测。
第三、六个字段:地址,取值$EXTERNAL_NET(源IP)$HOME_NET(目的IP)。
第四、七个字段:端口,第四字段是源IP的某个端口,由于具有随机性,因此取值为any。
第七个字段是目的ip开放服务的端口,是固定的,因此填写具体端口。
第五个字段:方向,<>代表双向,->代表请求。
()中的为具体规则的编写。
msg:触发规则后的提示信息
content:检索的关键字,可以搭配http_stat_code; 使用,http_stat_code指的是指 HTTP 状
态码。告知程序content内容在HTTP请求中的http_stat_code中查找。
sid:唯一标识一条规则的
rev:版本号
classtype:规则具体分类,需要配合在配置文件中编写的规则进行使用
注意格式问题
priority:优先级(数字越小,越严重)
nocase:不区分大小写
alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"HTTP Content-Type Request Example"; flow:established,to_server; http.content_type; content:"multipart/form-data|3b 20|"; startswith; classtype:bad-unknown; sid:95; rev:1;)
flow:established,to_server; #意思是建立连接成功
http.content_type; #检测请求头中content_type的内容
content:"multipart/form-data|3b 20|";startswith; # content_type内容中以multipart/form-data开头,注意:两个竖线中间的部分是特殊字符,要使用16进制,并且放在两个竖线中间
(2)编写规则
编写规则参考网址
Web检测
①目录扫描检测
多次404错误,疑似web扫描攻击
规则:
alert http $EXTERNAL_NET any <> $HOME_NET 80 (msg:"疑似web目录扫描"; http.stat_code; content:"404";classtype:dir-scan; threshold: type threshold, track by_src, count 5, seconds 20; sid:561002;rev:1;)
分析:threshold: type threshold, track by_src, count 5, seconds 20;
threshold:用于设定和定义基于特定条件的阈值规则。
type threshold:设定规则为阈值类型,还可以是
type rate等,限制速率,防止DDOS攻击。
track by_src:根据源 IP 地址来跟踪请求。
count 5, seconds 20:20秒内发生5次。
意思是:如果某个源 IP 地址在 20 秒内发出 5 个请求都是404,就会触发相关的规则或
警报。
操作:
根据classtype:dir-scan;先在配置文件设置类型
然后将规则写入:
测试:
②Sql注入c
使用正则表达式来匹配一些Sql注入的特征,使用pcre。
规则:
get请求:
# get请求,通过uri判断sql注入 alert http $EXTERNAL_NET any-> $HOME_NET 80 (msg:"GET请求SQL注入"; http.uri; pcre:"/union|select|and|user()|database()|information_schema/i";classtype:Sql-injection; sid:561003;rev:1;)
post请求:
# post请求,通过request_body判断sql注入 alert http $EXTERNAL_NET any -> $HOME_NET 80 (msg:"POST请求SQL注入"; http.request_body; pcre:"/union|select|and|user()|database()|order|20| by|information_schema/i"; classtype:Sql-injection; sid:561004;rev:1;)
http.url:就是端口号的所以内容都是url
http.request_body:post请求,因为post请求不能在url中识别。
pcre:正则表达式,具体的正则表达式要卸载"\正则内容\"内,i表示不区分大小写。
操作:
先前配置文件中的类型已经设置过了。
写入规则后测试:
get:
post:
(3)自行测试
关于web检测还要很多的规则可以写,比如xss、ssrf等,可以根据上述的规则编写实例来自行编写,巩固知识。