1. 介绍

IDS(Intrusion Detection Systems):入侵检测系统,是一种网络安全设备或应用软件,可以依照一定的安全策略,对网络、系统的运行状况进行监视,尽可能发现各种攻击企图、攻击行为或者攻击结果,并发出安全警报。

IPS(Intrusion Prevention System):入侵防御系统,除了具有IDS的监控检测功能之外,可以深度感知检测数据流量,对恶意报文进行丢弃,以阻止这些异常的或是具有伤害性的网络行为。

NSM:网络安全监控系统,用于收集、检测和分析网络安全数据,通常IDS是其组成部分之一。

IPS入侵防御系统,是在IDS入侵检测系统的基础上,增加了事件处理以及安全防护功能,能够主动对安全事件进行响应。

2. 分类

2.1. IDS分类

IDS根据两种方法进行分类:按照数据来源、按照入侵检测策略。

2.1.1. 按照数据来源分类
  • 基于主机的入侵监测系统(HIDS)
  • 基于网络的入侵检测系统(NIDS)
  • 分布式入侵检测系统(DIDS)
2.1.2. 按照入侵检测策略分类
  • 滥用检测
  • 异常检测
  • 完整性分析

2.2. IPS功能组成

  • 数据采集:采集和捕获流量数据
  • 入侵检测:分析流量和日志数据,发现安全异常行为并发出警报,常见的有Snort、Suricata、Bro
  • 结果展示:用于分析IDS警报并进行友好展示,常见的IDS警报分析工具有Snorby、Sguil、Base等
  • 安全防御:主动响应安全事件,采取丢弃数据包等等措施来阻止异常网络行为,比如与iptables联用

3. Suricata NIDS介绍

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

4. 安装Suricata

4.1. Yum安装Suricata

对于RedHat Enterprise Linux 7和CentOS 7,可以使用EPEL存储库。

yum install epel-release -y
yum install suricata -y
  • 1.
  • 2.

4.2. 源码安装Suricata

4.2.1. 预安装要求

仅限CentOS 6:CentOS 6需要EPEL包存储库:

yum install epel-release -y
  • 1.

在构建Suricata之前,请运行以下命令以确保已安装所有依赖项:

sudo yum -y install gcc libpcap-devel pcre-devel libyaml-devel file-devel \
  zlib-devel jansson-devel nss-devel libcap-ng-devel libnet-devel tar make \
  libnetfilter_queue-devel lua-devel
  • 1.
  • 2.
  • 3.
4.2.2. 下载和构建Suricata
yum -y install wget
wget http://www.openinfosecfoundation.org/download/suricata-3.1.tar.gz

tar -xvzf suricata-3.1.tar.gz

cd suricata-3.1
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

不带有IPS功能的编译(默认IDS)

./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var
  • 1.

带有IPS功能的编译

./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --enable-nfqueue
  • 1.

常用配置选项

--disable-gccmarch-native
  • 1.

不要为其构建的硬件优化二进制文件。如果二进制文件是可移植的,或者如果要在VM中使用Suricata,则添加此标志。

--prefix=/usr/
  • 1.

将Suricata二进制文件安装到/usr/bin/中。默认/usr/local/

--sysconfdir=/etc
  • 1.

将Suricata配置文件安装到/etc/suricata/中。默认/usr/local/etc/

--localstatedir=/var
  • 1.

设置Suricata用于登录/var/log/suricata/。默认/usr/local/var/log/suricata

--enable-lua
  • 1.

使Lua支持检测和输出。

--enable-geopip
  • 1.

启用GeoIP支持进行检测。

--disable-rust
  • 1.

禁用Rust支持。如果rustc/cargo可用,则默认启用Rust支持。

make install-conf
  • 1.

将执行常规"make install",然后它会自动为您创建/设置所有必需的目录和suricata.yaml

make install-rules
  • 1.

将执行常规"make install",然后它将自动下载并设置Suricata可用的Emerging Threats的最新规则集。

make install-full
  • 1.

将结合上面提到的所有内容(install-confinstall-rules) - 并为您提供准备运行(配置和设置)Suricata。

到这里默认安装已完成,可以直接启动。

5. 优化配置

Suricata的配置文件路径是:/etc/suricata/suricata.yaml

sudo vim /etc/suricata/suricata.yaml
  • 1.

我们需要注意以下几个关键参数:

HOME_NET:它指定了Suricata监控的本地网络,根据自己的网络情况进行修改。

HOME_NET: "[192.168.0.0/16,10.0.0.0/8,172.16.0.0/12]"
  • 1.

EXTERNAL_NET变量的!$HOME_NET代表除本地网络之外的其他网络。

default-log-dir:日志文件存储路径,默认是/var/log/suricata

outputs:outputs选项下有很多可以输出的配置选项,包括警告、检测的数据包、产生的结果等,可以根据自己的需求进行配置。

  • fast.log:默认的警告输出文件。
  • eve.json:JSON格式文件输出。
  • unified2.alert:数据包输出文件,将整个数据包以二进制的方式存储到文件中。
  • http.log:HTTP日志,包含了HTTP请求、HOST字段、URI字段和User-Agent字段。
  • syslog:这个选项决定了是否将Suricata的警告输出到syslog文件中。
  • drop.log:当Suricata工作在IPS模式下的时候,可以使用drop操作规则,这些drop掉的数据包信息就会存储在drop.log文件中。

max-pending-packets:设置Suricata能同时处理的数据包数量,最少为1,最大值取决于内存的大小,更大的内存可以设置更大的值并拥有更好的性能,默认值是1024。

default-packet-size:对处理的每个数据包的大小进行限制。默认值是1514,也是TCP数据包的最大长度(当数据超过这个长度便会使用TCP报文重组技术)。

6. 启动Suricata

启动

suricata -c /etc/suricata/suricata.yaml -i eth0
  • 1.

参数:

--init-errors-fatal
  • 1.

测试错误规则非常推荐

添加开机自启动

echo "suricata -c /etc/suricata/suricata.yaml -i eth0  >/dev/null 2>&1 &" >> /etc/rc.local
  • 1.

7. 安装更新规则工具

注意:suricata-update与Suricata 4.1及更高版本捆绑在一起。它也可以与旧版本一起使用。在这种情况下,必须单独安装。使用yum安装suricata,已包含suricata-update工具,需要安装pyyaml,执行命令pip install pyyaml

手动安装

yum install -y python-pip
pip install --upgrade suricata-update
  • 1.
  • 2.

目录和权限

为了suricata-update正常工作,需要以下权限:

  • 目录/etc/suricata:读访问权限
  • 目录/var/lib/suricata/rules:读/写访问
  • 目录/var/lib/suricata/update:读/写访问

一种选择是简单地以root身份运行suricata-update或以root身份运行sudo

8. 更新规则

在不进行任何配置的情况下,默认操作suricata-update是使用Emerging Threats Open规则集。

例:

suricata-update
  • 1.

该命令将:

  • 查找suricata路径上的程序以确定其版本。
  • 查找/etc/suricata/enable.conf/etc/suricata/disable.conf/etc/suricata/drop.conf/etc/suricata/modify.conf以查找要应用于下载规则的过滤器。这些文件是可选的,不需要存在。
  • 下载适用于您的Suricata版本的Emerging Threats Open规则集,如果找不到则默认为4.0.0。
  • 应用上面加载的启用、禁用、删除和修改过滤器。
  • 写出规则/var/lib/suricata/rules/suricata.rules
  • 在测试模式下运行Suricata /var/lib/suricata/rules/suricata.rules

9. 规则集管理

使用Oinkmaster进行规则管理

或者从这里下载并解压缩您选择的目录(或yaml配置设置)中的规则集:

http://rules.emergingthreats.net/open/suricata/
  • 1.

或者如果您愿意,可以下载并使用VRT规则集。

whereis suricata-update
echo "0 0 * * 1  /usr/local/bin/suricata-update > /dev/null 2>&1 &" >>/var/spool/cron/root
  • 1.
  • 2.

每周1晚上半夜12点更新规则
建议经常更新您的规则。新兴威胁每天都会被修改,VRT每周更新一次。

10. 网络边缘部署情况

10.1. 设备接入部署

  • 111.230.173.69
  • 111.230.194.241
  • 193.112.121.73
  • 203.195.139.126
  • 203.195.139.139
  • 111.230.169.164
  • 111.230.170.136

10.2. Nginx部署

  • 119.29.9.233
  • 119.29.9.168
  • 119.29.116.47

11. 事件可视化

11.1. 数据采集

11.1.1. 配置Redis
cat >/data/redis/ossec_redis.conf<<EOF
bind 10.104.154.91 127.0.0.1
protected-mode yes
port 6579
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
supervised no
pidfile /var/run/redis_6579.pid
loglevel notice
logfile "/data/redis/log/ossec_redis.log"
databases 16
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /data/redis/ossec
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
replica-priority 100
requirepass es2018
maxmemory 1G
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
EOF
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
11.1.2. 启动Redis

启动

/data/redis/src/redis-server /data/redis/ossec_redis.conf
  • 1.

添加开机自启动

echo "/data/redis/src/redis-server /data/redis/ossec_redis.conf >/dev/null 2>&1 &" >> /etc/rc.local
  • 1.
11.1.3. 配置Elasticsearch

集群其中一台配置,如下所示。

cat >/data/es/config/elasticsearch.yml<<EOF
cluster.name: clife-es
node.name: es-redis
path.data: /data/es/data
path.logs: /data/es/log
network.host: 10.104.154.91
http.port: 9200
path.repo: ["/es_back_data/es_data_back"]
discovery.zen.ping.unicast.hosts: ["10.104.199.117","10.104.154.91","10.104.45.13"]
EOF
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
11.1.4. 启动Elasticsearch
/data/elasticsearch-6.4.3/bin/elasticsearch -d
  • 1.
11.1.5. 检查Elasticsearch运行状态

每5分钟检查一次Elasticsearch集群状态

*/5 * * * * /data/elasticsearch-6.4.3/bin/elasticsearch-certutil cert --pem -ca --keep-ca-key >> /tmp/es_cert.log 2>&1
  • 1.
11.1.6. 配置Logstash
cat >/data/logstash-6.4.3/config/logstash.conf<<EOF
input {
  redis {
    host => "10.104.154.91"
    port => 6579
    password => "es2018"
    data_type => "list"
    key => "ossec-alerts"
    type => "ossec-alerts"
  }
}

filter {
  if [type] == "ossec-alerts" {
    json {
      source => "message"
    }
  }
}

output {
  if [type] == "ossec-alerts" {
    elasticsearch {
      hosts => ["10.104.154.91:9200"]
      index => "ossec-%{+YYYY.MM.dd}"
    }
  }
}
EOF
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
11.1.7. 启动Logstash
/data/logstash-6.4.3/bin/logstash -f /data/logstash-6.4.3/config/logstash.conf
  • 1.

添加开机自启动

echo "/data/logstash-6.4.3/bin/logstash -f /data/logstash-6.4.3/config/logstash.conf >/dev/null 2>&1 &" >> /etc/rc.local
  • 1.

11.2. Kibana可视化

11.2.1. 配置Kibana
cat >/data/kibana-6.4.3-linux-x86_64/config/kibana.yml<<EOF
server.port: 5601
server.host: "10.104.154.91"
elasticsearch.url: "http://10.104.154.91:9200"
EOF
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
11.2.2. 启动Kibana
/data/kibana-6.4.3-linux-x86_64/bin/kibana
  • 1.

添加开机自启动

echo "/data/kibana-6.4.3-linux-x86_64/bin/kibana >/dev/null 2>&1 &" >> /etc/rc.local
  • 1.

至此,Suricata的部署、规则更新、事件可视化环境就已经全部准备就绪了。接下来就可以访问Kibana的Web界面( http://10.104.154.91:5601)进行数据可视化分析了。