Docker实战:用Elastic社区开源组件打造属于自己的网络探针
网络探针,就是一个用于捕获、分析网络数据包的组件。目前有一些捕获、分析网络数据包的开源组件,比如Yaf、Bro、Packetbeat等,但是这些组件的核心在于流量的采集,而流量日志的存储、界面展示则没有。
所以我们会希望拥有自己的网络探针,捕获、分析数据包,并以界面的形式展示查询。一个完全使用全套Elastic社区开源组件的解决方案是,使用Packetbeat来监听网络流量(Packetbeat是Elastic社区Beats组件家族的一种,Beats组件家族还有其余的用于分析文件日志、审计日志等的组件,如Filebeat,Auditbeat),而将流量日志存储在Elasticsearch中,使用Kibana读取Elasticsearch中的日志并以日志检索、统计图表等形式提供界面查询。但是在每一个不同的环境上部署网络探针时,都需要重新把所有组件下载一遍配置一遍,实在是很繁琐。那么可不可以利用Docker容器技术,将配置好的环境生成镜像,以后在不同的环境,只需要导入这个镜像运行即可。如下图所示:
PacketBeat目前支持的协议类型如下:
ICMP (v4 and v6)
DNS
HTTP
AMQP 0.9.1
Cassandra
Mysql
PostgreSQL
Redis
Thrift-RPC
MongoDB
Memcache
TLS
下面咱们就来尝试一下吧!
如果是CentOS 7系统,那么安装Docker非常简单,只需要一句简单的命令:yum install docker即可。安装完毕后,使用systemctl start docker命令,启动Docker daemon进程;并且使用systemctl enable docker命令设置Docker为开机启动。安装完毕后,就可以尝试运行一个CentOS容器。运行命令时,Docker首先会检查本地是否有CentOS镜像,如果没有的话,就会从官方的Docker Hub Registry下载镜像,然后再用该镜像运行一个新容器。
值得一提的是,访问国外的Docker镜像站点非常的慢,而且有时会拉取镜像不成功。所以一般推荐把镜像切换为国内镜像,命令为:
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["http://f2d6cb40.m.daocloud.io"]
}
EOF
systemctl restart docker
鉴于下载的Centos镜像为最小包镜像,所以需要手动安装一些必要的软件。如:
yum install wget
yum install net-tools
yum install libpcap
yum install libpcap-devel
yum install sudo
1下载组件
下载需要的安装包,包括JDK1.8,Elasticsearch,Packetbeat以及Kibana。将它们放在一个目录下,如下图所示:
2新建用户并赋权
由于Elasticsearch不可以用root用户运行。所以我们新建一个名为dell的用户,并赋予它免密码sudo权限。
useradd dell
passwd dell
visudo
然后切换到dell用户(su - dell)。
3配置JDK
开始安装JDK,将JDK1.8解压到/home/dell目录下,并配置环境变量:
运行java -version命令有版本信息被打印出来,即安装成功。
4配置Elasticsearch
接着解压缩Elasticsearch到/home/dell目录下,并配置elasticsearch.yml文件,配置cluser.name为 my_network_probe,network.host为localhost,http.port为9200。
5配置Packetbeat
然后解压缩Packetbeat到/home/dell目录下,并配置packetbeat.yml文件里需要写入的Elasticsearch:
6配置Kibana
再解压缩Kibana到/home/dell目录下,配置/home/dell/kibana/config/kibana.yml文件:
并指定查询的Elasticsearch:
7编写启动脚本
最后再在/home/dell目录下新建start.sh文件,负责启动所有组件:
如下图的命令,就是将正在运行的容器生成名为nsfocus/my_network_probe3的镜像:
如下图的命令,就是将名为nsfocus/my_network_probe3的镜像,打为tar包:
将镜像导入到另外一台需要使用此镜像的机器上,如下图的命令,就是在另外一台机器导入刚才打包的镜像:
此时使用docker images查看,是可以看到导入的这个镜像的:
运行此镜像,指定--network=host参数,表示Docker容器共享宿主机网络。共享宿主机网络的好处就在于,可以使用Packetbeat来监听宿主机上指定网卡的流量。由于共享了网络,所以无需进行端口映射,在Docker容器里打开的端口即是在宿主机上打开端口,进入容器看到的主机名也是宿主机的主机名。
进入该容器,修改Kibana对应的配置文件里的IP(就配置为宿主机的IP),方便外部主机访问Web界面:
默认Packetbeat是配置的监听所有网卡的流量,如果期望只监听特定网卡的流量,则修改/home/dell/packetbeat/packetbeat.yml文件里的packetbeat.interface.device: 网卡名即可(以root权限修改)。举个例子,我们这台主机的p2p4网卡是作为镜像流量接入的网卡,所以我们将监听的网卡配置为p2p4:
运行start.sh脚本,启动所有组件:
Ctrl+P+Q退出容器并保持容器是运行状态。
此时可以看到宿主机上的5601端口已经处于监听状态:
此时访问5601端口,即可以看到对应的Kibana界面。在索引发现处填入packetbeat-*:
我们就可以看到写入的数据量:
然后还可以在Discover处查看到流量日志的相关信息:
可以看到Packetbeat采集的流量,类型包括Flow流之外,还有ICMP,DNS,TLS等,还是比较丰富的:
我们可以在Discover界面上添加过滤器,查询指定sip、dport的流量:
以后在这台主机上直接使用容器ID进行启动、停止、连接容器动作即可,非常方便。
我们可以生成访问最多的目的IP的柱状图,一般而言被访问最多的目的IP且目的端口为常用端口的话,该目的IP为服务器的可能性较大。
我们还可以生成特定IP在一段时间范围内上/下行流量的趋势图,一般而言工作时间段和非工作时间段的流量情况是有差别的。如果在非工作时间段出现很大的流量,就需要排查该主机是否有运行定时下载任务的软件,或者在被远程登录进行工作等。
我们还可以生成DNS请求域名的环形图。DNS请求的域名中如果出现了非常长且子域名像加密字符长串的情况,这要排查是否存在DNS隐蔽信道。像McAfee 等安全软件会使用DNS隐蔽信道来发送一些信息。
内容编辑:绿盟科技 皮靖 责任编辑:肖晴
往期回顾
本公众号原创文章仅代表作者观点,不代表绿盟科技立场。所有原创内容版权均属绿盟科技研究通讯。未经授权,严禁任何媒体以及微信公众号复制、转载、摘编或以其他方式使用,转载须注明来自绿盟科技研究通讯并附上本文链接。
关于我们
绿盟科技研究通讯由绿盟科技创新中心负责运营,绿盟科技创新中心是绿盟科技的前沿技术研究部门。包括云安全实验室、安全大数据分析实验室和物联网安全实验室。团队成员由来自清华、北大、哈工大、中科院、北邮等多所重点院校的博士和硕士组成。
绿盟科技创新中心作为“中关村科技园区海淀园博士后工作站分站”的重要培养单位之一,与清华大学进行博士后联合培养,科研成果已涵盖各类国家课题项目、国家专利、国家标准、高水平学术论文、出版专业书籍等。
我们持续探索信息安全领域的前沿学术方向,从实践出发,结合公司资源和先进技术,实现概念级的原型系统,进而交付产品线孵化产品并创造巨大的经济价值。
长按上方二维码,即可关注我们