在EC2上安装蜜罐,并使用Kibana进行分析(lurker + fluentd + elasticsearch + kibana)
简介
我将总结在AWS上搭建低互动型蜜罐(即仅收集攻击数据而不实际入侵的蜜罐),并同时作为备忘录。搭建的方法如下所示:
刚开始运营蜜罐时,每次都要编写脚本并进行各种调查,但慢慢觉得麻烦了,所以我们决定使用Kibana作为方便的界面。
实例以稍微特殊的配置进行,除了默认用于管理的eth0网络接口外,还添加了用于观测的NIC(eth1)和全局地址,以避免将额外的数据混杂到观测数据中。eth1不分配IP地址,操作系统也不会做出任何响应,但蜜罐软件通过适当地响应ARP和TCP等请求,捕获对额外分配的全局地址的攻击。
通过fluentd将日志数据存储到Elasticsearch中,并通过SSH隧道在Kibana上查看。在这种配置中,我们选择了一个包含所有内容的配置,但由于日志数据的传递是通过fluentd进行的,因此也可以更改蜜罐部分和数据存储、聚合部分。
准备实例
在EC2上准备实例。关于实例的分发方法暂不讨论,但似乎使用Elasticsearch需要至少t2.micro或更高的规格。(如果是t2.nano,则会由于内存不足而无法运行或崩溃)当然,如果想要顺畅运行,需要更高规格的实例。
在准备实例后,首先需要分配一个新的弹性IP地址。在仪表盘的网络与安全 -> 弹性IP中,选择分配新地址。
接下来创建一个接受所有传入通信的安全组。请注意,由于在常规操作中使用会非常危险,因此请确保不要错误地应用到其他接口实例上。在“网络与安全”->“安全组”中选择“创建安全组”。
然后,在网络界面上添加一个网络接口。子网应选择与创建的实例相同的子网。安全组应选择先前创建的全允许的安全组。私有IP应选择自动分配。
然后,将IP地址关联到网络接口。在接口中选择刚刚创建的网络接口。
最后将网络接口附加到实例上。
通过以上步骤,成功配置了具有两个网络接口和两个全局IP地址的实例。接下来将进入实例内配置的步骤。
弹性搜索的设置
鉴于Elasticsearch相关的应用程序和资源可能发生较大变化,建议查阅官方网页获取最新信息。此处所提供的信息截至2016年1月。
首先,安装Java以运行Elasticsearch。由于Elasticsearch的页面推荐使用Java8,因此我们安装Oracle的Java8版本。在安装过程中,需要在终端上输入同意条款。
$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update -y
$ sudo apt-get install -y oracle-java8-installer
一旦完成 Java 的安装设置后,接下来就是安装 Elasticsearch 本体。这次我们将从软件库进行安装。
$ wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
$ echo "deb http://packages.elastic.co/elasticsearch/2.x/debian stable main" | sudo tee -a /etc/apt/sources.list.d/elasticsearch-2.x.list
$ sudo apt-get update && sudo apt-get install elasticsearch
当安装完成后,将启用自动启动,并启动该服务。
$ sudo update-rc.d elasticsearch defaults 95 10
Adding system startup for /etc/init.d/elasticsearch ...
/etc/rc0.d/K10elasticsearch -> ../init.d/elasticsearch
/etc/rc1.d/K10elasticsearch -> ../init.d/elasticsearch
/etc/rc6.d/K10elasticsearch -> ../init.d/elasticsearch
/etc/rc2.d/S95elasticsearch -> ../init.d/elasticsearch
/etc/rc3.d/S95elasticsearch -> ../init.d/elasticsearch
/etc/rc4.d/S95elasticsearch -> ../init.d/elasticsearch
/etc/rc5.d/S95elasticsearch -> ../init.d/elasticsearch
$ sudo /etc/init.d/elasticsearch start
* Starting Elasticsearch Server
...done.
Kibana的安装设置
下载并解压缩Kibana软件包。由于本文撰写时,最新版的Elasticsearch和Kibana发布版4.1.4存在兼容性问题,所以我们将使用测试版4.3.1。
$ wget https://download.elastic.co/kibana/kibana/kibana-4.3.1-linux-x64.tar.gz
$ tar xzf kibana-4.3.1-linux-x64.tar.gz
$ cd kibana-4.3.1-linux-x64/
因为它应该以默认设置运行,所以我试着启动一下。确认后我会先用Ctrl-C退出。
$ ./bin/kibana
log [00:58:11.960] [info][status][plugin:kibana] Status changed from uninitialized to green - Ready
log [00:58:11.986] [info][status][plugin:elasticsearch] Status changed from uninitialized to yellow - Waiting for Elasticsearch
log [00:58:11.997] [info][status][plugin:kbn_vislib_vis_types] Status changed from uninitialized to green - Ready
log [00:58:12.001] [info][status][plugin:markdown_vis] Status changed from uninitialized to green - Ready
log [00:58:12.004] [info][status][plugin:metric_vis] Status changed from uninitialized to green - Ready
log [00:58:12.014] [info][status][plugin:spyModes] Status changed from uninitialized to green - Ready
log [00:58:12.025] [info][status][plugin:statusPage] Status changed from uninitialized to green - Ready
log [00:58:12.027] [info][status][plugin:table_vis] Status changed from uninitialized to green - Ready
log [00:58:12.040] [info][listening] Server running at http://0.0.0.0:5601
log [00:58:17.069] [info][status][plugin:elasticsearch] Status changed from yellow to yellow - No existing Kibana index found
log [00:58:20.655] [info][status][plugin:elasticsearch] Status changed from yellow to green - Kibana index ready
^C
网络设置
使用ifconfig命令确认额外的网络接口(eth1)已启用。
$ ifconfig -a
eth0 Link encap:Ethernet HWaddr 06:c0:a5:86:b9:57
inet addr:172.30.1.113 Bcast:172.30.1.255 Mask:255.255.255.0
inet6 addr: fe80::4c0:a5ff:fe86:b957/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:9001 Metric:1
RX packets:256 errors:0 dropped:0 overruns:0 frame:0
TX packets:260 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:33995 (33.9 KB) TX bytes:30622 (30.6 KB)
eth1 Link encap:Ethernet HWaddr 06:32:14:8c:48:cb
BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B
如果可以检测到eth1,则创建一个配置文件,在启动时启用它。
$ sudo vi /etc/network/interfaces.d/eth1.cfg
auto eth1
iface eth1 inet manual
流畅地设置 fluentd
我们将使用fluentd将Honeypot软件(lurker)中的数据传输到Elasticsearch。这次我们将直接将其作为全局gem安装到专用实例上。接下来,我们将安装fluentd的Elasticsearch插件。
首先,从存储库中安装Ruby。
$ sudo add-apt-repository -y ppa:brightbox/ruby-ng
$ sudo apt-get update -y
$ sudo apt-get install -y ruby2.2 ruby2.2-dev
$ sudo gem install fluentd
$ sudo fluent-gem install fluent-plugin-elasticsearch
我們將準備一個設定文件。為了將 fluentd 格式轉換為 logstash 格式,我們將設定 logstash_format 為 true,並設定 include_tag_key 和 tag_key 以將每個訊息中的標籤保留並嵌入。
$ sudo mkdir -p /usr/local/etc/
$ sudo vi /usr/local/etc/fluentd.conf
<source>
@type forward
port 24224
bind 127.0.0.1
</source>
<match lurker.**>
type elasticsearch
host localhost
port 9200
index_name lurker
logstash_format true
include_tag_key true
tag_key _tag
</match>
一旦准备好两者,就会进行启动确认。确认完毕后,暂时使用Ctrl-c退出。
$ sudo /usr/local/bin/fluentd -c /usr/local/etc/fluentd.conf
2016-01-03 06:46:23 +0000 [info]: reading config file path="/usr/local/etc/fluentd.conf"
2016-01-03 06:46:23 +0000 [info]: starting fluentd-0.12.19
2016-01-03 06:46:23 +0000 [info]: gem 'fluent-plugin-elasticsearch' version '1.2.1'
2016-01-03 06:46:23 +0000 [info]: gem 'fluentd' version '0.12.19'
2016-01-03 06:46:23 +0000 [info]: adding match pattern="lurker.**" type="elasticsearch"
2016-01-03 06:46:23 +0000 [info]: adding source type="forward"
2016-01-03 06:46:23 +0000 [info]: using configuration file: <ROOT>
<source>
@type forward
port 24224
bind 127.0.0.1
</source>
<match lurker.**>
type elasticsearch
host localhost
port 9200
index_name lurker
logstash_format true
include_tag_key true
tag_key _tag
</match>
</ROOT>
2016-01-03 06:46:23 +0000 [info]: listening fluent socket on 127.0.0.1:24224
^C2016-01-03 06:46:33 +0000 [info]: shutting down fluentd
2016-01-03 06:46:33 +0000 [info]: shutting down input type="forward" plugin_id="object:d21298"
2016-01-03 06:46:34 +0000 [info]: shutting down output type="elasticsearch" plugin_id="object:d2cd8c"
2016-01-03 06:46:34 +0000 [info]: process finished code=0
潜伏者(蜜罐软件)的安装设置
安装所需的软件包。
$ sudo apt-get install -y git build-essential libev4 libev-dev cmake libpcap-dev libmsgpack3 libmsgpack-dev
然后,需要编译必要的源代码。需要编译libfluent和lurker这两个。分别将它们解压到主目录(/home/ubuntu/)。
$ cd
$ git clone https://github.com/m-mizutani/libfluent.git
$ cd libfluent
$ cmake . && make
$ cd ..
$ git clone https://github.com/m-mizutani/lurker.git
$ cmake -DWITH_FLUENT=../libfluent/ . && make
只确认启动动作。
$ /home/ubuntu/lurker/bin/lurker -h
Usage: lurker [options]
Options:
-h, --help show this help message and exit
-i STRING Specify interface to monitor on the fly
-r STRING Specify pcap_file for dry run mode
-f STR Fluentd inet destination (e.g. 10.0.0.1:24224)
-o STRING Output file path. '-' means stdout
-t STRING File path of target list
-H Enable hex format data log instead of binary data
创建启动脚本
我們將創建以下啟動腳本,以便在重新啟動後繼續運行。將IP地址分配給ADDR變量,請根據環境設置為新添加的網絡接口的主要私有IP地址。
$ sudo vi /etc/rc.local
#!/bin/sh -e
DEV=eth1
ADDR=172.30.1.xxx
iptables -I INPUT -i $DEV -j DROP
nohup /home/ubuntu/kibana-4.3.1-linux-x64/bin/kibana &
nohup /home/ubuntu/lurker/bin/lurker -i $DEV "$ADDR:*" -f localhost &
/usr/local/bin/fluentd -c /usr/local/etc/fluentd.conf -d /var/run.fluentd.pid &
exit 0
我会在这里重新启动机器。如果所有设置都成功完成,那么输入ps命令应该会得到以下大致结果。
$ ps ax | grep -e elasticsearch -e kibana -e lurker -e fluentd
1170 ? Sl 0:12 /usr/bin/java -Xms256m -Xmx1g -Djava.awt.headless=true -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+HeapDumpOnOutOfMemoryError -XX:+DisableExplicitGC -Dfile.encoding=UTF-8 -Djna.nosys=true -Des.path.home=/usr/share/elasticsearch -cp /usr/share/elasticsearch/lib/elasticsearch-2.1.1.jar:/usr/share/elasticsearch/lib/* org.elasticsearch.bootstrap.Elasticsearch start -d -p /var/run/elasticsearch/elasticsearch.pid --default.path.home=/usr/share/elasticsearch --default.path.logs=/var/log/elasticsearch --default.path.data=/var/lib/elasticsearch --default.path.conf=/etc/elasticsearch
1195 ? Sl 0:05 /home/ubuntu/kibana-4.3.1-linux-x64/bin/../node/bin/node /home/ubuntu/kibana-4.3.1-linux-x64/bin/../src/cli
1268 ? Sl 0:00 /usr/bin/ruby2.2 /usr/local/bin/fluentd -c /usr/local/etc/fluentd.conf -d /var/run.fluentd.pid
1271 ? Sl 0:00 /usr/bin/ruby2.2 /usr/local/bin/fluentd -c /usr/local/etc/fluentd.conf -d /var/run.fluentd.pid
1417 pts/0 S 0:00 sudo nohup /home/ubuntu/lurker/bin/lurker -i eth1 172.30.1.xxx:* -f localhost
1418 pts/0 Sl 0:00 /home/ubuntu/lurker/bin/lurker -i eth1 172.30.1.64:* -f localhost
1444 pts/0 S+ 0:00 grep --color=auto -e elasticsearch -e kibana -e lurker -e fluentd
连接到Kibana。
最后,我们将连接到Kibana。由于Kibana的功能限制较弱,如用户限制等,我们不会全局打开端口,而是通过SSH的SOCKS进行访问。
% ssh -i .ssh/ec2.pem ubuntu@52.68.xxx.xxx -D 4000
进行如下设置,通过浏览器设置本地端口4000作为SOCKS代理。然后,通过指定类似于http://172.30.xxx.xxx:5601的地址(其中172.30.xxx.xxx为eth0的私有IP地址)来打开浏览器,应该可以打开Kibana的界面。
最开始会出现以下页面,要求进行索引创建的设置。可以默认设置,选择“创建”即可。
之后,您可以通过上方菜单中的Discover或Visualize等选项进行所需的分析。