开源入侵检测系统SELKS系统搭建

时间:2024-03-12 18:31:58
 

一、系统环境配置

系统环境: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/(截至18614日,最新版本为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设置了anyEXTERNAL_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-*.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==

 

对于经常被公司或组织政策禁止的事务的规则。MyspaceEbay之类的东西。

 

emerging-pop3.rules

 

检测与pop3协议有关的攻击

 

emerging-rpc.rules

 

检测与rpc(远程过程调用协议)有关的攻击

 

emerging-scada.rules

 

检测与SCADA(数据采集与监控系统)相关的攻击

 

==emerging-scan.rules==

 

检测探测行为。NessusNikto,端口扫描等这样的活动。这是攻击前准备时期的警告。

 

emerging-shellcode.rules

 

检测shellcodeshellcode是一段用于利用软件漏洞而执行的代码,以其经常让攻击者获得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-*.rules

 

检测*木马

 

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;">