本文作者:netxfly ,原文发表在小米安全中心,
地址:https://sec.xiaomi.com/article/14
概述
峥嵘栋梁,一旦而摧;水月镜像,无心来去。
本次自制的欺骗防御系统名字叫镜花水月,镜花水月是《死神》中蓝染惣右介的斩魄刀(幻觉系最强斩魄刀)的名字,能力是完全支配对手的五感。
这个名字非常适合攻击欺骗防御类系统:把攻击者的流量从正常的请求中区分、剥离出来,并无缝地转移到伪造了正常业务和服务的沙盒中,让攻击者去沙盒环境中玩耍并会记录其详细的行为。
与传统的蜜罐相比,镜花水月的优点为:
- 零误报(只对内部或外部的攻击行为进行报警)
- 保护业务系统(第一时间会将攻击者从正常的服务中转移到沙箱环境中,攻击者却浑然不知)
- 方便取证及定位攻击者(沙盒中会记录攻击者的来源及详细的攻击行为)
技术架构
镜花水月由4个模块组成:
- Agent,部署于服务器中的Agent,用于实时获取用户的访问日志并传递到检测端Server中,如果是恶意攻击,则会将流量重定向到沙盒中。目前支持的服务有:
- WEB
- FTP
- SSH
- Rsync
- Mysql
- Redis
- Mongodb
- Server,攻击检测服务器,实时检测Agent传递过来的日志并判断是否为攻击者,并为Agent动态、实时地维护了一份攻击者的来源IP策略
- Manager,策略管理服务器,有为Agent和server提供策略、攻击log统计、查看的功能
- 沙盒由以下3部分构成:
- 安装了FTP、SSH、Rsync、Mysql、Redis和Mongodb的虚拟机或Docker,可实时将这些服务的访问log发送到远程的Rsyslog中
- 克隆的WEB站点
- 日志服务器,将沙盒通过Rsyslog发送过来的数据解析出来并入库,供Manager查询、分析
为了方便部署以及高性能的要求,镜花水月的各组件中除了WEB攻击检测模块是用lua开发的外,其余的全是用go语言开发的(WEB攻击检测模块是基于openresty+lua开发的)
Agent的实现
agent的架构
Agent支持以蜜罐、镜花水月、攻击反弹和防火墙4种模式运行。
这四种模式的区别及功能分别如下:
- 启动时会应用不同的策略:
- 蜜罐会将除了白名单IP和端口外的所有流量直接转向沙盒中
- 镜花水月只将被Server判定为恶意攻击者转向沙盒,不影响正常的请求(攻击欺骗防御模式)
- 反弹模式是将攻击者流量全部原封不动的返回,类似于金庸小说《天龙八部》中的斗转星移
- 防火墙模式是将识别出来的攻击者的IP Block掉
- 以镜花水月、攻击反弹和防火墙模式启动时,除了会应用从manager获取到的策略外,还会在Agent中启动4个服务监控的goroutine,这些goroutine会将收集到的Vsftpd、Rsync、mysql和Redis服务的日志实时发到Server端
Agent的整体工作流如下:
- 判断启动模式,如果启动参数为unreal,则以镜花水月模式启动,默认以蜜罐模式启动
- 从配置文件conf/app.ini读取配置参数,如果是蜜罐模式,按配置文件中指定的时间间隔,定期从Manager获取策略并应用,如果是镜花水月模式,则每10秒更新一次策略,并启动Vsftpd、Rsync、mysql和Redis的监控goroutine
关于蜜罐的详细实现,可以参考笔者之前的文章自制蜜罐之前端部分,本文只贴一些关键的部分代码。
项目的代码结构如下图所示:
Agent的日志配置
Agent是通过rsyslog向server实时汇报采集到的非WEB应用程序的数据的(web的攻击检测会在后面说明),在部署agent前需要做以下3步的配置:
- 配置服务器中运行的应用的日志参数,将能写syslog的写入到syslog中,不能写syslog的写入到指定的文件中
- 将写入文件中的log读取出来,转换成syslog格式再转存到本地的syslog中
- 配置rsyslog的规则,将我们需要分析的log转发到后端server中,rsyslog的转发策略如下图所示:
ssh和mongodb的日志可以写入到syslog中,直接配置rsyslog的转发策略即可。
redis的操作内容不支持写入syslog,需要先连接redis,然后利用monitor命令监控redis指令的执行,经测试无法监控到config指令,而且启用monitor后,性能会降低一半。所以redis的指令监控服务不适合部署在对性能要求很高的服务器中。
Vsftpd、Rsync和Mysql服务需要配置应用对日志的支持,以下为关键的配置项:
把Vsftpd、Rsync和mysql的日志转存为syslog方法一样,都是不断地Tail文件,并把新增的日志发送到syslog中,代码如下:
以下为将redis的monitor指令的结果转存为syslog的代码:
Agent的编码实现
启动模式的处理部分代码如下:
不同模式会应用不同的iptables的策略,部分代码如下:
WEB服务的攻击检测
WEB服务器的攻击检测是利用反向代理型的waf实现的,关于waf的自制,可以参考笔者之前的文章《中小企业如何自建免费的云waf》
WAF在检测到攻击后有3种处理模式:
- 跳转到指定的URL
- 输出自定义的HTML内容
- 镜花水月模式,攻击者的请求不再反代到正常的后端,而是反代到克隆的WEB业务后端,克隆的WEB站点可以伪造得和真实站点相同,并打开了详细的log,如access log、Debug log和orm log等,连接的是脱敏的测试数据库
waf检测到攻击后,开启镜花水月模式的处理代码如下:
在利用waf-admin添加需要保护的后端站点时,需要增加2种后端的地址:
- 正常的后端地址
- 克隆业务的后端地址
如下图所示(请不要在意安全后端工程师做的UI):
waf管理后台在生成新站点的配置文件时后,会在每个请求中都会调用waf.start_jingshuishuiyue()函数,waf.start_jingshuishuiyue()会判断用户的类型是好人或坏蛋,如果是坏蛋的话,直接转到克隆的后端中去。
以下为waf.start_jingshuishuiyue()的代码:
以下为waf管理端在录入新的网站并为其生成配置文件时的模板文件内容:
Server的实现
Server的架构
server的主要功能是在TCP和UDP的514端口上启动Rsyslog服务,接收各个Agent发来的Rsyslog数据并判断Agent的启动类型、各服务是否被攻击。
- 如果收到的是蜜罐模式传过来的数据,则会根据规则进行报警
- 如果收到的是镜花水月模式传递过来的数据,则会检测是否为攻击,攻击了几次,是否需要对该攻击者发动镜花水月,如果需要发动的话,则会实时修改manager中的策略,Agent会在几秒后拿到新策略,将攻击者转移到沙盒中
Server端支持水平扩展,只要能连接到邮件服务器,后端的mongodb与Redis即可,关于蜜罐的实现部分请参考笔者之前的文章,本文只写攻击检测部分
server端的项目结构如图所示:
如上图所示,如果不是蜜罐的日志,则会判断应用日志的类型,并调用相应的威胁检测模块,检测的方法都是通过正则匹配中攻击的特征,比如暴破密码、rsync列目录、上传、下载文件等。然后将攻击者的IP,攻击次数记录到manger的Redis中。
以下为VSFTP密码暴力破解的检测示例:
Manager的实现
Manager的架构
Manager是整套系统的管理后台,支持的功能有:
- 用户管理
- Agent资产管理
- 蜜罐策略管理
- 攻击日志、报警日志展示
- 为Agent和server提供策略拉取服务
Manager的代码结构如下:
Manager的代码实现
从manager获取策略时,需要进行认证,防止攻击者无意间获取到蜜罐或镜花水月的所有策略后,进行针对性的避开去攻击其他系统。
获取策略的api接口只支持post方法:
Agent和Server配置文件中的key必须与manager中的一致,否则会因认证失败无法获取到策略,如下代码所示:
每次获取策略的接口时,Manager会从redis中查出所有满足策略的攻击者的IP,然后返回给Agent,Agent便可以对这些攻击者的IP发动镜花水月模式了。
以上代码中,ListRealTimePolicy()表示从redis中筛选出攻击者的IP,并由ListPolicy()方法一起返回蜜罐的策略。
沙盒的实现
沙盒可以装在虚拟机中或者封装到docker中,沙盒产生的数据的记录方式有以下2种:
- 利用tcpdump在宿主机中抓出相应协议的包,然后利用dpkt解析pcap文件,然后存入manager的DB中
- 在沙盒中部署类似Agent中的日志分析脚本,并将结果发送到rsyslog中,然后再由rsyslog转发到我们的server中,server收到后再存入manager中的DB中