本文将分享工控蜜罐Conpot的一些进阶玩法
0×01 引言 & Why Docker
之前在工控蜜罐Conpot的部署和入门指南这篇博客中介绍了 Conpot 的部署和简单配置,但是很多时候我们往往需要部署多个蜜罐形成蜜网,用虚拟机的硬件消耗不太划算,所以说这时候部署在 Docker 上就非常有必要了。我在上一篇博客中已经尝试在一台 32 核 32GB 服务器上部署了150个 Pre-Build Conpot 容器, CPU 占用微乎其微,内存占用大约在 14GB 左右。对于大规模的部署,这种资源占用程度是可以接受的。下面这幅图从实现架构上介绍了 Docker 相对于虚拟机的优势,我觉得 Docker 有一个很棒的优势就是在于较低资源占用下提供了容器间资源隔离。
官方提供了一个 Pre-Build 的镜像,但是直接使用这个只能实现比较有限的功能,同时也不支持蜜罐模板的定制和日志的配置,所以这时候就需要自己撸 Dockerfile ,编译镜像了,但是不用像做官方的 Dockerfile 那么麻烦,可以基于 Pre-Build 镜像修改。
这幅图展示了一个比较典型的工业生产环境(图片来自Logix),包括一些功能模块([变频]风扇单元、[变频]压缩机等)、PLC控制模块。希望能和大家一起,通过学习这个系列的文章,初步实现大型工控蜜网的自动化部署。
先前说了,官方是有提供一个 Dockerfile 的,但是里面有点问题(比如使用国外源导致的网络中断,然后整个镜像就没法编译),官方的 Dockerfile 是基于 python:2 镜像做的,然后下载依赖、编译源码、测试,过程有点麻烦,而且因为网络问题,安装依赖需要很长时间。我把官方的 Pre-Build 镜像传到了网易蜂巢上,可以直接拉取网易源(hub.c.163.com/mapchuan/conpot:latest),也可以改成 honeynet/conpot 使用官方源。如果使用Docker的频率比较大,可以考虑在本地部署私有镜像仓库服务,提高镜像拉取的速度。最后要说明的是,在这里我是假定大家已经做好模板,如果还没做,可以先用官方的模板文件代替。
我们下载官方的repo,提取出./conpot/template/default模板文件夹,并将文件夹重命名为 mytemplate ,大家可以根据实际情况做出修改。
# 在Conpot镜像基础上修改 # 官方源: FROM honeynet/conpot # 网易源:FROM hub.c.163.com/mapchuan/conpot:latest FROM hub.c.163.com/mapchuan/conpot:latest # 维护者信息 MAINTAINER mpc@besti # 导入模板文件 RUN mkdir /opt/conpot/template COPY ./ /opt/conpot/template # 切换工作目录 WORKDIR /opt/conpot/template # 根据需要发布端口 EXPOSE 80 # 指定自定义模板,--template ./mytemplate表示以mytemplate为模板生成蜜罐 CMD ["/usr/local/bin/conpot", "--template", "./mytemplate", "--logfile", "/var/log/conpot/conpot.log"]]
完成Dockerfile后,在conpot文件夹中运行docker build -t conpot .
编译镜像。
运行docker run -it -p 80:80 conpot
就OK啦。
既然考虑进行大规模的部署,像我们刚才做的镜像那样那样直接输出到屏幕显然是不合理的, Conpot 提供了多种日志收集的途径, Conpot 在 conpot.cfg 文件中配置了默认日志输出形式,用户可以通过修改 conpot.cfg 文件来自定义日志收集的配置。
[json] enabled = False filename = /var/log/conpot.json [sqlite] enabled = False [mysql] enabled = False device = /tmp/mysql.sock host = localhost port = 3306 db = conpot username = conpot passphrase = conpot socket = tcp ; tcp (sends to host:port), dev (sends to mysql device/socket file) [syslog] enabled = False device = /dev/log host = localhost port = 514 facility = local0 socket = dev ; udp (sends to host:port), dev (sends to device) [hpfriends] enabled = False host = hpfriends.honeycloud.net port = 20000 ident = 3Ykf9Znv secret = 4nFRhpm44QkG9cvD channels = ["conpot.events", ] [taxii] enabled = False host = taxiitest.mitre.org port = 80 inbox_path = /services/inbox/default/ use_https = False
可以看到,在 Conpot 中,我们可以使用 json 、 sqlite 、 mysql 、 syslog 、 hpfriends 和 taxii 等几种方式输出访问日志。
你可以在 honeynet 注册一个hpfriends账号,成为一名志愿者,将蜜罐日志上传到 honeynet ,为安全研究人员提供最新的威胁信息。
现在这个网页已经挂了,如果有需要可以自行搭建中心 hpfriends server ,收集来自设备的日志。
sqlite 文件存储在 ./logs/conpot.db ,MySQL 和 syslog 的
device 变量是从设备中获取连接,但是在容器中,一般不会用到这个feature,注意把socket设为udp/tcp即可。
如果有什么不清楚的,可以在 Conpot 的 logger 文件夹中看看日志输出的具体实现,源码的可读性比较高。这个项目整体上耦合度不高,所以能够比较容易地基于源代码二次开发,对接自己的日志收集系统。
虽然刚才我们已经初步写出了自己的 Docker image ,但是现在仍然是一个玩具,距离真正的部署还有一定距离,我们可以尝试着进一步改进刚才的 Dockerfile 。
先要修改 conpot 运行的 cfg 文件
[common] sensorid = default [session] timeout = 30 [daemon] ;user = conpot ;group = conpot [json] enabled = False filename = /var/log/conpot.json [sqlite] enabled = False [mysql] enabled = True device = /tmp/mysql.sock host = 172.16.43.116 port = 30005 db = conpot username = root passphrase = root socket = tcp ; tcp (sends to host:port), dev (sends to mysql device/socket file) [syslog] enabled = False device = /dev/log host = localhost port = 514 facility = local0 socket = dev ; udp (sends to host:port), dev (sends to device) [hpfriends] enabled = False host = hpfriends.honeycloud.net port = 20000 ident = 3Ykf9Znv secret = 4nFRhpm44QkG9cvD channels = ["conpot.events", ] [taxii] enabled = False host = taxiitest.mitre.org port = 80 inbox_path = /services/inbox/default/ use_https = False [fetch_public_ip] enabled = True urls = ["http://whatismyip.akamai.com/", "http://wgetip.com/"] [change_mac_addr] enabled = False iface = eth0 addr = 00:de:ad:be:ef:00
我在这里是让 conpot 把数据存储在 MySQL 容器中,将 enabled 改为 True ,并根据实际情况填写数据库的 IP 、端口、用户名、密码等信息,如果有多个节点,还需要修改 sensorid ,下图展示了当前文件夹中的文件。
我们现在开始写 Dockerfile ,基本上还是在前面的 Dockerfile 里面加一些功能。
# 在Conpot镜像基础上修改 # 官方源: FROM honeynet/conpot # 网易源:FROM hub.c.163.com/mapchuan/conpot:latest FROM hub.c.163.com/mapchuan/conpot:latest # 维护者信息 MAINTAINER mpc@besti # 导入模板文件 RUN mkdir /opt/conpot/template COPY ./ /opt/conpot/template # 切换工作目录 WORKDIR /opt/conpot/template # 根据需要发布端口 EXPOSE 80 # 指定自定义模板,--template ./mytemplate表示以mytemplate为模板生成蜜罐,加入--config,指定配置文件 CMD ["/usr/local/bin/conpot", "--template", "./mytemplate", "--logfile", "/var/log/conpot/conpot.log","--config","conpot.cfg"]]
运行 conpot ,访问容器的80端口,用 Navicat 连接 MySQL ,可以看到, conpot 已经在 conpot 数据库新建了 events 表,并添加了我们刚才的访问记录。
Now this is not the end. It is not even the beginning of the end. But it is, perhaps, the end of the beginning. ——Churchill
刚才已经基本上完成了 Conpot 蜜罐的部署和日志收集工作,但是现在很多操作比如 conpot.cfg 和 Dockerfile 的编写都需要手动一个个操作,距离大规模的部署仍然还有些距离,我们希望程序能够帮助我们完成 sensorid 、 conpot.cfg 和蜜罐模板的自动分发,在收集到攻击数据后如何挖掘,怎样与其他的安全系统产生联动······如果不出意外的话,我将在下一篇博客和大家进行更深入的研究。
我的博客是 https://pingch.top ,上面可以找到我的信息和联系方式,欢迎交流
参考文献