开源入侵检测系统SELKS系统搭建
一、系统环境配置
系统环境:centos7x64 ip地址:172.16.91.130
1.设置静态IP地址
[root@localhost backlion]#vi /etc/sysconfig/network-scripts/ifcfg-*
BOOTPROTO=static #dhcp改为static(修改)
ONBOOT=yes #开机启用本配置,一般在最后一行(修改)
IPADDR=172.16.91.130 #静态IP(增加)
GATEWAY=172.168.91.1 #默认网关,虚拟机安装的话,通常是2,也就是VMnet8的网关设置(增加)
NETMASK=255.255.255.0 #子网掩码(增加)
DNS1=172.16.95.70 #DNS 配置,虚拟机安装的话,DNS就网关就行,多个DNS网址的话再增加(增加)
[root@localhost ~]# /etc/init.d/network restart
设置DNS:
Vim /etc/resolv.conf
nameserver=114.114.114.114
nameserver=8.8.8.8
2.设置主机名
[root@localhost network-scripts]# hostnamectl set-hostname selks-server.com
vim /etc/hosts最后加上你的IP与主机名的绑定
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.91.121 elk-server.com elk#其中最后是主机名的别名
主机名:内网名字
域名:公网名字
主机名不能是localhost
绑定主机名就相当于内网的dns,非常重要。
3.关闭防火墙
[root@selks-server ~]# cat /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#enforcing - SELinux security policy is enforced.
#permissive - SELinux prints warnings instead of enforcing.
#disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three two values:
#targeted - Targeted processes are protected,
#minimum - Modification of targeted policy. Only selected processes are protected.
#mls - Multi Level Security protection.
SELINUXTYPE=targeted
或者
[root@localhost ~]# sed -i 7s/enforcing/disabled/ /etc/selinux/config
关闭firewall:
[root@selks-server ~]# systemctl
stop firewalld.service #停止firewall
[root@selks-server ~]# systemctl disable firewalld.service #禁止firewall开机启动
[root@localhost ~]# systemctl list-unit-files |grep firewalld #查看是否随机启动firewall
4. 安装wget
[root@selks-server ~]# yum install wget –y
5.更换yum源
更换成阿里云源,更新系统、下载软件速度快4
[root@selks-server ~]#yum install wget
[root@selks-server ~]# mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
[root@selks-server ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@selks-server ~]# yum clean all
[root@selks-server ~]# yum makecache
6.更新系统
[root@selks-server ~]# yum -y update
7.安装epel源
[root@selks-server rules]# yum -y install epel-release
8.时间同步
[root@localhost yum.repos.d]# yum
-y install ntp ntpdate #安装ntp时间同步相关软件包
[root@localhost yum.repos.d]#cat /etc/ntp.conf #确认配置文件里有下列的时间同步源
server 0.rhel.pool.ntp.org iburst
server 1.rhel.pool.ntp.org iburst
server 2.rhel.pool.ntp.org iburst
server 3.rhel.pool.ntp.org iburst
[root@localhost yum.repos.d]# systemctl enable ntpd #设置开机自动启动ntpd
[root@localhost yum.repos.d]# systemctl
start ntpd #立即启动ntpd服务
[root@localhost yum.repos.d]#
cp
/usr/share/zoneinfo/Asia/Shanghai /etc/localtime
[root@localhost yum.repos.d]#date #确认时间与现在时间一致
9.添加路由
用法:route add -net|-host DEST gw NEXTHOP
route add -net 10.0.0.0/8 gw 192.168.10.1 #添加路由
route add default gw 192.168.10.1 #添加一条默认路由
永久添加/删除关于某个网卡的路由:编辑/etc/network-scripts/route-INTERFACE_NAME
vim /etc/network-scripts/route-eth0
ADDRESS0=222.16.60.148
NETMASK0=255.255.255.0
NEXTHOP0=222.16.60.254
ADDRESS1=222.16.60.214
NETMASK1=255.255.255.0
NEXTHOP1=222.16.60.254
二、安装Suricata
1.安装依赖包
[root@selks-server ~]# yum install wget libpcap-devel libnet-devel pcre-devel gcc-c++ automake autoconf libtool make libyaml-devel zlib-devel file-devel jansson-devel nss-devel
2.下载解压Suricata
下载最新安装包http://suricata-ids.org/download/(截至18年6月14日,最新版本为4.0.4)
[root@selks-server ~]# wget http://www.openinfosecfoundation.org/download/suricata-4.0.4.tar.gz
[root@selks-server ~]# tar zxvf suricata-4.0.4.tar.gz
[root@selks-server ~]# cd suricata-4.0.4
3.编译安装
[root@selks-server ~]#./configure && make && make install-full
注意:
默认从http://rules.emergingthreats.net/社区下载可用的社区规则集快照,并且将其存储在/usr/local/etc/suricata/rules目录下。
suricata配置文件路径为:
/usr/local/etc/suricata/suricata.yaml
4.配置suricata
请注意:不管使用哪个端口, Suricata都能自动检测HTTP流量。所以,正确指定HTTP_PORTS变量并不是很重要。命令如下:
[root@selks-server ~]# vim /usr/local/etc/suricata/suricata.yaml
#Suricata 的配置文件默认在 /etc/suricata/suricata.yaml,在启动前我们需要先配置好一些重要的变量,其中变量分为两组,一个是地址组(address-groups),另一个是端口组(port-groups)。示例配置文件如下
注意:如果HOME_NET设置了any,EXTERNAL_NET设置!HOME_NET的话会报错,如果HOME_NET设置了内网地址,EXTERNAL_NET设置为!$HOME_NET的话,有些内网之间的告警就无法匹配到
address-groups: #配置地址组
HOME_NET: "[192.168.0.0/16,10.0.0.0/8,172.16.0.0/12]" #指定 Suricata 检查的网络
#HOME_NET: "[192.168.0.0/16]"
#HOME_NET: "[10.0.0.0/8]"
#HOME_NET: "[172.16.0.0/12]"
#HOME_NET: "any"
#EXTERNAL_NET: "!$HOME_NET"
EXTERNAL_NET: "any" #设置出本地以外的其他网络地址
HTTP_SERVERS: "$HOME_NET"
SMTP_SERVERS: "$HOME_NET"
SQL_SERVERS: "$HOME_NET"
DNS_SERVERS: "$HOME_NET"
TELNET_SERVERS: "$HOME_NET"
AIM_SERVERS: "$EXTERNAL_NET"
DNP3_SERVER: "$HOME_NET"
DNP3_CLIENT: "$HOME_NET"
MODBUS_CLIENT: "$HOME_NET"
MODBUS_SERVER: "$HOME_NET"
ENIP_CLIENT: "$HOME_NET"
ENIP_SERVER: "$HOME_NET"
port-groups:
HTTP_PORTS: "80" #来辨别不同服务所用到的端口号
SHELLCODE_PORTS: "!80"
ORACLE_PORTS: 1521
SSH_PORTS: 22
DNP3_PORTS: 20000
MODBUS_PORTS: 502
FILE_DATA_PORTS: "[$HTTP_PORTS,110,143]"
FTP_PORTS: 21
## Step 2: select the rules to enable or disable
##
default-rule-path: /usr/local/etc/suricata/rules #设置默认的规则库路径地址
rule-files:
- botcc.rules
# - botcc.portgrouped.rules
- ciarmy.rules
- compromised.rules
- drop.rules
- dshield.rules
# - emerging-activex.rules
- emerging-attack_response.rules
- emerging-chat.rules
- emerging-current_events.rules
- emerging-dns.rules
- emerging-dos.rules
- emerging-exploit.rules
- emerging-ftp.rules
# - emerging-games.rules
# - emerging-icmp_info.rules
# - emerging-icmp.rules
- emerging-imap.rules
# - emerging-inappropriate.rules
# - emerging-info.rules
- emerging-malware.rules
- emerging-misc.rules
- emerging-mobile_malware.rules
- emerging-netbios.rules
- emerging-p2p.rules
- emerging-policy.rules
- emerging-pop3.rules
- emerging-rpc.rules
# - emerging-scada.rules
# - emerging-scada_special.rules
- emerging-scan.rules
# - emerging-shellcode.rules
- emerging-smtp.rules
- emerging-snmp.rules
- emerging-sql.rules
- emerging-telnet.rules
- emerging-tftp.rules
- emerging-trojan.rules
- emerging-user_agents.rules
- emerging-voip.rules
- emerging-web_client.rules
- emerging-web_server.rules
# - emerging-web_specific_apps.rules
- emerging-worm.rules
- tor.rules
# - decoder-events.rules # available in suricata sources under rules dir
# - stream-events.rules # available in suricata sources under rules dir
- http-events.rules # available in suricata sources under rules dir
- smtp-events.rules # available in suricata sources under rules dir
- dns-events.rules # available in suricata sources under rules dir
- tls-events.rules # available in suricata sources under rules dir
# - modbus-events.rules # available in suricata sources under rules dir
# - app-layer-events.rules # available in suricata sources under rules dir
# - dnp3-events.rules # available in suricata sources under rules dir
# - ntp-events.rules # available in suricata sources under rules dir
classification-file: /usr/local/etc/suricata/classification.config
reference-config-file: /usr/local/etc/suricata/reference.config
threshold-file: /usr/local/etc/suricata/threshold.config
##
## Step 3: select outputs to enable
##
types:
- alert:
# payload: yes # enable dumping payload in Base64
payload-buffer-size: 6kb # max size of payload buffer to output in eve-log paylaod大小限制
payload-printable: yes # enable dumping payload in printable (lossy) format 记录原始payload
# packet: yes # enable dumping of packet (without stream segments)
# http-body: yes # enable dumping of http body in Base64
http-body-printable: yes # enable dumping of http body in printable format 记录http 原始响
metadata: yes # add L7/applayer fields, flowbit and other vars to the alert
# pattern matcher buffers and
scans as many packets as possible in parallel.
max-pending-packets: 1024 #设置了suricata能够同时处理的数据包的数量,最少为1,最大值取决于内存的大小,更大的内存可以设置更大的值并拥有更好的性能,默认值是1024
部分用于防御利用操作系统网络栈的自身行为来逃避检测的一些知名攻击手段(例如:TCP reassembly)。作为对策,通过针对目标操作系统而对检测引擎算法进行微调,现代 IDC 提供了“基于目标”的检测手段。因此,如果你知道某台主机运行了什么操作系统的话,将这个信息提供给 Suricata 就可以大幅提高检测的成功率。这就是 host-os-policy 存在的意义。本例中,默认的 IDC 策略是 Linux 系统。如果针对某个 IP 地址没有指定操作系统信息,Suricata 会默认应用基于 Linux 系统的检测策略。如下,当捕获到对 192.168.122.0/28 和 192.168.122.155通讯时,Suricata 就会应用基于 Windows 系统的检测策略。
host-os-policy:
# Make the default policy windows.
windows: [10.22.0.0/24]
bsd: []
bsd-right: []
old-linux: []
linux: [0.0.0.0/0,10.22.0.188]
old-solaris: []
solaris: []
hpux10: []
hpux11: []
irix: []
macos: []
vista: []
windows2k3: []
5.关闭网卡LGO/GRO功能(网卡名结合实际修改)
[root@selks-server ~]# ethtool -K ens32 gro off lro off
Cannot change large-receive-offload(说明你的网卡不支持LRO/GRO功能,忽略即可)
6.查看所有可用的运行模式
[root@selks-server ~]# /usr/local/bin/suricata --list-runmodes
7.运行Suricata
[root@selks-server ~]#
/usr/local/bin/suricata -c /usr/local/etc/suricata/suricata.yaml
-i ens33 --init-errors-fatal &
其中:
- -c用来指定配置文件
- -i 说明以 IDS 模式运行
- Ens33 说明让 Suricata 监听 ens33 端口
其中检测日志默认为 fast.log在/usr/local/var/log/suricata/fast.log,同时还有json格式方便导入,位置是/usr/local/var/log/suricata/eve.json
注意:
启动命令:
[root@selks-server ~]# ethtool -K ens33 gro off lro off #ens33就是所需要监控的网卡地址
[root@selks-server ~]#
/usr/local/bin/suricata -c /usr/local/etc/suricata/suricata.yaml
-i ens33 --init-errors-fatal &
三、安装ELK
相关软件请到Elasticsearch官方网站下载
Elasticsearch6.2.0下载
Logstash6.2.0下载
Kibana6.2.0下载
1.安装elasticsearch
[root@selks-server ~]#
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.2.0.rpm
[root@selks-server ~]# chmod +x elasticsearch-6.2.0.rpm
[root@selks-server ~]# rpm -ivh elasticsearch-6.2.0.rpm
[root@selks-server ~]# systemctl daemon-reload
[root@selks-server ~]# systemctl enable elasticsearch.service
[root@selks-server ~]# systemctl start elasticsearch.service
访问本地9200端口,出现如下内容说明Elasticsearch安装成功
[root@selks-server ~]# curl 127.0.0.1:9200
{
"name" : "79TP4oM",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "9cxWmy3fQvmgiPRTtGYaZg",
"version" : {
"number" : "6.2.0",
"build_hash" : "37cdac1",
"build_date" : "2018-02-01T17:31:12.527918Z",
"build_snapshot" : false,
"lucene_version" : "7.2.1",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
2.安装logstash
[root@selks-server ~]#
wget https://artifacts.elastic.co/downloads/logstash/logstash-6.2.0.rpm
[root@selks-server ~]# chmod +x logstash-6.2.0.rpm
[root@selks-server ~]# rpm -ivh logstash-6.2.0.rpm
添加logstash过滤规则
vim /etc/logstash/conf.d/logstash.conf
input {
file {
path => ["/usr/local/var/log/suricata/eve.json "]
codec =>"json"
type => "SuricataIDPS"
}
}
filter {
if [type] == "SuricataIDPS" {
date {
match => [ "timestamp", "ISO8601" ]
}
ruby {
code => "
if event.get('[event_type]') == 'fileinfo'
event.set('[fileinfo][type]', event.get('[fileinfo][magic]').to_s.split(',')[0])
end
"
}
ruby{
code => "
if event.get('[event_type]') == 'alert'
sp = event.get('[alert][signature]').to_s.split(' group ')
if (sp.length == 2) and /\A\d+\z/.match(sp[1])
event.set('[alert][signature]', sp[0])
end
end
"
}
}
if [src_ip] {
geoip {
source => "src_ip"
target => "geoip"
#database => "/opt/logstash/vendor/geoip/GeoLiteCity.dat"
add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ]
add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}" ]
}
mutate {
convert => [ "[geoip][coordinates]", "float" ]
}
if ![geoip.ip] {
if [dest_ip] {
geoip {
source => "dest_ip"
target => "geoip"
#database => "/opt/logstash/vendor/geoip/GeoLiteCity.dat"
add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ]
add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}" ]
}
mutate {
convert => [ "[geoip][coordinates]", "float" ]
}
}
}
}
}
output {
elasticsearch {
hosts => "localhost:9200"
}
}
[root@selks-server ~]# systemctl enable logstash.service
[root@selks-server ~]# chmod 775 /usr/local/var/log/suricata/eve.json
[root@selks-server ~]# systemctl start logstash.service
3.安装kibana
[root@selks-server ~]#
wget https://artifacts.elastic.co/downloads/kibana/kibana-6.2.0-x86_64.rpm
[root@selks-server ~]#chmod +x kibana-6.2.0-x86_64.rpm
[root@selks-server ~]#rpm -ivh kibana-6.2.0-x86_64.rpm
修改kibana允许访问的主机范围、默认只允许本地访问
vim /etc/kibana/kibana.yml
server.host: "0.0.0.0"
systemctl start kibana.service
systemctl enable kibana.service
浏览器访问IP:5601,进入Kibana,这里应该会要求设置一个索引,这里使用logstash-*
最终访问界面:
附录Suricata规则详解
==botcc.portgrouped.rules botcc.rules==
这些是已知和确认的活动僵尸网络和其C&C(command and control)服务器。由一些组织生成,每日更新。
==ciarmy.rules==
封锁被ciArmy.com标记出来的Top Attackers
==compromised.rules==
这是一个已知的受影响的主机列表,每天更新。
decoder-events.rules
解码器事件,里面包含了对解码器解码所产生的事件,比如包无效、包过大、过小等
dnp3-events.rules
包含对dnp3(分布式网络协议)的一些规则,不多,只有几条
dns-events.rules
包含对dns协议的一些规则,比如dnsflooded事件等,不多,只有几条
==drop.rules==
每天更新的Spamhaus DROP(Don't Route or Peer)列表。列出了著名的、专业的垃圾邮件发送者。
==dshield.rules==
每天更新的DShield top attackers。十分可靠。
emerging-activex.rules
主要用来检测与ActiveX控件有关的攻击
==emerging-attack_response.rules==
这些规则是为了捕获成功攻击的结果,诸如“id=root”之类的东西,或者表示可能发生妥协的错误消息(即虽然产生了错误消息,但是攻击已经成功)。
emerging-chat.rules
主要检测聊天软件、即时通讯软件的攻击,大部分是国外的一些软件,比如facebook,雅虎,msn
==emerging-current_events.rules==
这些规则是不打算在规则集中长期保存的,或者是在被包含之前进行测试。大多数情况下,这些都是针对当天的大量二进制URL的简单sigs,用来捕获CLSID新发现的易受攻击的应用程序,我们没有这些漏洞的任何细节。这些sigs很有用,却不是长期有效的。
emerging-deleted.rules
里面都是被注释掉的规则,可能删除后的规则放在这里
emerging-dns.rules
检测dns协议相关的攻击
==emerging-dos.rules==
目的是捕获入站的DOS(拒绝服务)活动和出站指示。
emerging-ftp.rules
检测ftp协议相关的攻击
==emerging-games.rules==
魔兽世界、星际争霸和其他流行的在线游戏都在这里。我们不打算把这些东西贴上邪恶的标签,只是它们不适合所有的攻击环境,所以将它们放在了这里。
emerging-icmp_info.rules emerging-icmp.rules
检测与icmp协议相关的攻击
==emerging-exploit.rules==
直接检测exploits(漏洞)的规则。如果你在寻找windows的漏洞等,他们会在这里被列出。就像sql注入一样,exploits有着自己的体系。
总之就是用来检测exploits漏洞的。
emerging-imap.rules
检测与imap相关的攻击
==emerging-inappropriate.rules==
色情、儿童色情,你不应该在工作中访问的网站等等。WARNING:这些都大量使用了正则表达式,因此存在高负荷和频繁的误报问题。只有当你真正对这些规则感兴趣时才去运行这些规则。
emerging-info.rules
看了一些规则后,似乎是检测与信息泄露、信息盗取等事件的规则,里面会检测后门、特洛伊木马等与info相关的攻击
==emerging-malware.rules==
我个人最喜欢的。这一套最初只是间谍软件,这就足够了。间谍软件和恶意软件之间的界限已经很模糊了。这里不仅仅是间谍软件,但是请放心,这里没有任何东西是你想在自己的网络或者PC上运行的。已知的更新模式、已知的恶意软件的UserAgent字符串和大量的其它有用的东西。如果你只准备运行一个规则集来保证安全性,这个规则集是首选。
emerging-misc.rules
检测混杂的攻击,这种攻击一般没有确切的分类,或者使用了多种技术
emerging-mobile_malware.rules
检测移动设备上的恶意软件
emerging-netbios.rules
检测与netbios有关的攻击
==emerging-p2p.rules==
P2P(Peer to Peer)之类的。我们并不想将它定义为有害的,只是不适合出现在IPS/IDS的网络环境中。
==emerging-policy.rules==
对于经常被公司或组织政策禁止的事务的规则。Myspace、Ebay之类的东西。
emerging-pop3.rules
检测与pop3协议有关的攻击
emerging-rpc.rules
检测与rpc(远程过程调用协议)有关的攻击
emerging-scada.rules
检测与SCADA(数据采集与监控系统)相关的攻击
==emerging-scan.rules==
检测探测行为。Nessus,Nikto,端口扫描等这样的活动。这是攻击前准备时期的警告。
emerging-shellcode.rules
检测shellcode,shellcode是一段用于利用软件漏洞而执行的代码,以其经常让攻击者获得shell而得名。
emerging-smtp.rules
检测与smtp协议相关的攻击
emerging-snmp.rules
检测与snmp协议相关的攻击
==emerging-sql.rules==
这是一个巨大的规则集,用于捕获在特殊应用程序上的特殊攻击。这里面有一些普遍的SQL注入攻击规则,效果很好,可以捕获大多数攻击。
但是这些规则根据不同的app和不同的web服务器,有很大的差别。如果你需要运行非常严格的web服务或者很重视信息的安全性,请使用这个规则集。
emerging-telnet.rules
检测与telnet协议相关的攻击
emerging-tftp.rules
检测与tftp协议相关的攻击
emerging-trojan.rules
检测trojan木马
emerging-user_agents.rules
检测异常的user-agents
==emerging-voip.rules==
检测voip相关的异常,它是一个新兴的规则集,目前还很小,但是我们预计它很快就会增长。
emerging-web_client.rules
检测web客户端的攻击
emerging-web_server.rules
检测web服务端的攻击
emerging-web_specific_apps.rules
检测特殊的web应用程序的异常
emerging-worm.rules
检测蠕虫
modbus-events.rules
检测modbus事件
smtp-events.rulse
检测smtp事件
stream-events.rules
检测stream事件
tls-events.rules
检测tls事件
==tor.rules==
检测使用tor进行匿名通信的流量,tor本身没有威胁,但却是很可以的行为
规则库更新管理
[root@selks-server rules]# yum installpython-pip python-yaml
[root@selks-server rules]# pip install --pre --upgrade suricata-update
[root@selks-server rules]#suricata-update
<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">