利用 ELK 深度定制实时入侵日志分析平台初步



0x01 首先,快速安装配置好jdk 1.8,因为ES基于java:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# export LANG=en
# tar xf jdk-8u131-linux-x64.tar.gz
# mv jdk1.8.0_131/ /usr/local/jdk
# ll /usr/local/jdk
# chown -R root.root /usr/local/jdk/
# ll /usr/local/jdk
# vi /etc/profile
export JAVA_HOME=/usr/local/jdk/
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
export TOMCAT_HOME=/usr/local/tomcat
# source /etc/profile
# java -version
# javac

0x02 再来熟悉一些必要的关于elasticsearch的基础概念:

1
索引 -> 文档 -> 分片和副本

0x03 下载配置 elasticsearch:

1
2
3
4
# wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.7.2.tar.gz
# tar -xf elasticsearch-1.7.2.tar.gz
# mv elasticsearch-1.7.2 /usr/local/
# ln -s /usr/local/elasticsearch-1.7.2/ /usr/local/elasticsearch

0x04 关于 ES 目录下各配置文件作用简要说明:

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
# tree /usr/local/elasticsearch
|-- LICENSE.txt
|-- NOTICE.txt
|-- README.textile
|-- bin elasticsearch 自身工具
| |-- elasticsearch
| |-- elasticsearch-service-mgr.exe
| |-- elasticsearch-service-x64.exe
| |-- elasticsearch-service-x86.exe
| |-- elasticsearch.bat
| |-- elasticsearch.in.bat
| |-- elasticsearch.in.sh
| |-- plugin
| |-- plugin.bat
| `-- service.bat
|-- config
| |-- elasticsearch.yml 主配置文件
| `-- logging.yml 日志配置文件
`-- lib
|-- antlr-runtime-3.5.jar
|-- asm-4.1.jar
|-- asm-commons-4.1.jar
|-- elasticsearch-1.4.4.jar
|-- groovy-all-2.3.2.jar
|-- jna-4.1.0.jar
|-- jts-1.13.jar
|-- log4j-1.2.17.jar
|-- lucene-analyzers-common-4.10.3.jar
|-- lucene-core-4.10.3.jar
|-- lucene-expressions-4.10.3.jar
|-- lucene-grouping-4.10.3.jar
|-- lucene-highlighter-4.10.3.jar
|-- lucene-join-4.10.3.jar
|-- lucene-memory-4.10.3.jar
|-- lucene-misc-4.10.3.jar
|-- lucene-queries-4.10.3.jar
|-- lucene-queryparser-4.10.3.jar
|-- lucene-sandbox-4.10.3.jar
|-- lucene-spatial-4.10.3.jar
|-- lucene-suggest-4.10.3.jar
|-- sigar
| |-- libsigar-amd64-freebsd-6.so
| |-- libsigar-amd64-linux.so
| |-- libsigar-amd64-solaris.so
| |-- libsigar-ia64-linux.so
| |-- libsigar-sparc-solaris.so
| |-- libsigar-sparc64-solaris.so
| |-- libsigar-universal-macosx.dylib
| |-- libsigar-universal64-macosx.dylib
| |-- libsigar-x86-freebsd-5.so
| |-- libsigar-x86-freebsd-6.so
| |-- libsigar-x86-linux.so
| |-- libsigar-x86-solaris.so
| |-- sigar-1.6.4.jar
| |-- sigar-amd64-winnt.dll
| |-- sigar-x86-winnt.dll
| `-- sigar-x86-winnt.lib
`-- spatial4j-0.4.1.jar

0x05 编辑修改ES主配置文件

1
2
# cd /usr/local/elasticsearch/config/
# vi elasticsearch.yml

1
2
3
4
5
6
7
8
cluster.name: xlion 集群名称
node.name: "klionsec" 节点名称,如果是同一个集群中的节点只需要改此名称即可
node.master: true 将此节点作为 master,具备一些管理功能
node.data: true 是否存储数据,如果只是想做一些管理功能,可以不存储数据,即设为false
index.number_of_shards: 5 主分片
index.number_of_replicas: 1 副本分片
network.host: 192.168.3.139 监听ip,可直监听内网ip
.....

定义好一些ES要用到的临时文件路径

1
2
3
4
5
6
path.conf: /usr/local/elasticsearch/conf
path.data: /usr/local/elasticsearch/data
path.work: /usr/local/elasticsearch/work
path.logs: /usr/local/elasticsearch/logs
path.plugins: /usr/local/elasticsearch/plugins
bootstrap.mlockall: true 锁住内存

创建刚才定义的目录,并仔细检查配置

1
2
# mkdir -p /usr/local/elasticsearch/{conf,data,work,logs,plugins}
# egrep -v "#|^$" elasticsearch.yml

0x06 没什么问题之后,就可以启动ES了,它默认会监听9300和9200端口,9300是集群节点之间的通信端口,9200是提供给外部的api接口端口:

1
2
3
4
5
# /usr/local/elasticsearch/bin/elasticsearch 前台启动
# /usr/local/elasticsearch/bin/elasticsearch -d 后台启动
# curl http://192.168.3.139:9200
# jps | grep Elasticsearch
# kill -15 27257 注意如果要关闭elasticsearch,这里直接kill掉jvm进程即可

测试查询,看看ES是否真的已经可用

1
2
3
4
5
6
7
# curl -i -XGET 'http://192.168.3.139:9200/_count?pretty' -d '
{
"query":{
"match_all":{}
}
}
'

0x06 安装一些常用的ES插件:

1
2
# /usr/local/elasticsearch/bin/plugin -i elasticsearch/marvel/latest 一个图形化的增删改查插件
浏览器访问 http://192.168.3.139:9200/_plugin/marvel/kibana/index.html#/dashboard/file/marvel.overview.json

1
2
# /usr/local/elasticsearch/bin/plugin -i mobz/elasticsearch-head 一个集群管理插件,节点,数据量较少时还是非常好用的
浏览器访问 http://192.168.3.139:9200/_plugin/head/

0x07 配置 Logstash,相当于数据源和ES之间的通道,Logstash把指定的数据源中的数据读过来,然后再通过Logstash把数据写到ES中,可以说是整个套件中最核心的地方:

1
2
3
4
5
6
7
8
# tar xf logstash-1.5.3.tar.gz
# mv logstash-1.5.3 /usr/local/
# ln -s /usr/local/logstash-1.5.3/ /usr/local/logstash
# mkdir /usr/local/logstash/etc/
# /usr/local/logstash/bin/logstash -e 'input { stdin{} } output { stdout{codec => rubydebug} }'
# /usr/local/logstash/bin/logstash -e 'input { stdin{} } output { elasticsearch { host => "192.168.3.139" protocol => "http"} }'
# vi /usr/local/logstash/etc/logstash.conf
# /usr/local/logstash/bin/logstash -f /usr/local/logstash/etc/logstash.conf 直接通过配置文件的方式启动

0x08 Logstash[基于jruby] 基本配置语法,还有非常多,更详细的内容请直接参考官方文档,篇幅原因这里不细说了,因为非常重要,所以大家可能要多花些时间来仔细学习:

1
input[数据源可以是文件,各类数据库...] -> filter -> output[ 一般都是es ]

1
2
3
4
5
6
7
8
9
10
11
12
13
# vi /usr/local/logstash/etc/logstash.conf
input {
file {
path => "/var/log/messages"
}
}
output {
file {
path => "/tmp/%{+YYYY-MM-dd}.messages.gz"
gzip => true
}
}

0x09 简单配置 Kibana[基于nodejs] 它主要用来搜索es中的数据,并将其可视化,默认监听5601端口:

1
2
3
4
5
6
7
8
# tar xf kibana-4.1.1-linux-x64.tar.gz
# mv kibana-4.1.1-linux-x64 /usr/local/
# ln -s /usr/local/kibana-4.1.1-linux-x64/ /usr/local/kibana
# cd /usr/local/kibana/config/
# vi kibana.yml
elasticsearch_url: "http://192.168.3.139:9200"
# nohup /usr/local/kibana/bin/kibana
访问 http://192.168.3.139:5601/

0x10 平时经常要搜集的一些日志:

1
2
3
4
5
6
各类系统平台运行日志
各类服务访问,错误日志
各类程序自身的运行日志
基于web和内网的各种攻击特征日志
其它的各类业务日志等...
.....

一点小结:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
这里仅仅也只是先把日志搜集平台大体框架搭起来,中间并未涉及任何具体应用
和运维不同的是,他们可能更偏向于去解决各类系统,服务故障,性能调优以及一些实际的业务规划,架构设计等等....
看日志的大多目的可能也都主要集中在这些点上,安全可能往往只是顺带考虑下而已,毕竟,不是专门做安全的
但作为一名防御者,我们关注更多的,可能还是存在日志中的各种各样的攻击特征
如果能实时捕捉到这些高危入侵特征,并实现可视化及高效报警,我想肯定会是一件非常有意思的事情
但同时也有个非常现实的问题,如果日志量特别大,想做到接近实时就非常困难了
这时,ELK也许会是个非常不错的选择...当然,已经有很多类似的商业产品,如,相对比较成熟的splunk
但splunk并非主要专注安全,不过好在splunk已经提供了非常强大的api
后续我们会再重点介绍它,也是一款非常不错的工具,但就是要收点儿钱
所以,在不想花钱的情况下,ELK绝对是个非常不错的选择
根据自己实际的渗透经验加上py,在此基础上定制一套极具针对性的"入侵日志监控系统"还是非常现实的.....
对了,像ES和logstash,每次这样手工启动,确实比较累,不过别人已经写好对应的系统启动脚本
这里毕竟不是运维,所以也就没仔细说,大家可自行去谷歌上找找,或者自己写写都行....
.....