应对CC攻击的自动防御系统——原理与实现

0x00 系统效果


此DDOS应用层防御系统已经部署在了http://www.yfdc.org网站上(如果访问失败,请直接访问位于国内的服务器http://121.42.45.55进行在线测试)。

此防御系统位于应用层,可以有效防止非法用户对服务器资源的滥用:

其实现的基本思想是:

在线效果测试:

进入http://www.yfdc.org -> 点击右上侧在线查询,此时将会进入/shell/yf域内,/shell/yf是一个用bash scripts写的动态web-cgi程序,用户每一次提交信息,此程序将会执行一些服务器端的查询操作,然后将数据处理后返回到客户端。

为了防止非法用户高频率地访问这个程序,而影响到其他正常用户的访问,故需要进行一些保护措施。

最终效果:

enter image description here

被封信息页面

0x01 系统原理


操作系统: CentOS 6.5 x86_64 开发语言: Bash Shell Scripts Web服务器: Apache Httpd

enter image description here

(此图为系统结构的鸟瞰图 可存至本地后放大查看)

2.1 自定义日志:/etc/httpd/logs/yfddos_log


enter image description here

(自定义日志文件的格式)

在httpd.conf的日志参数中,加入如下两行:

我们接下来重点分析日志文件/etc/httpd/logs/yfddos_log.

LogFormat "%a \"%U\" %{local}p %D %{%s}t " yfddos

解释:

例子:

译为:IP为192.168.31.1的主机,在时间戳为1417164313的时候,访问了/shell/yf,并由服务器的80端口向其提供服务,共耗时118231微秒

或为:IP为192.168.31.1的主机,在2014-11-28 16:45:13的时候,访问了/shell/yf,并由服务器的80端口向其提供服务,共耗时0.118231秒

至于为什么不使用httpd.conf中官方定义的日志,原因如下:

2.2 yfddosd黑名单文件格式


enter image description here

黑名单文件格式

yfddosd黑名单文件/etc/yfddos/web-yf-search.b格式如下:

每一行为一个黑名单条目,上面第一个条目的意义为:

直观意义为:

IP地址:1.2.3.4,从2014-11-15 18:12:15开始,被封杀1分钟,在2014-11-15 18:13:15时自动解封。

这个文件将由驻留在系统中的daemon守护进程yfddosd进行维护更新。

2.3 守护进程yfddosd:防御系统的逻辑核心


enter image description here

守护进程的原理图

守护进程yfddosd是整个CC防御系统的核心,而function analyze_and_insert_black()则是yfddosd的核心。

yfddosd的配置参数:

函数analyze_and_insert_black有三个输入参数:

例子: analyze_and_insert_black "4" "10" "5"

例子: analyze_and_insert_black "150" "2700" "905"

简记为: analyze_and_insert_black "limit" "ttl" "time"

从上述中可看出,守护进程yfddosd至少需要完成如下三个任务:

  • 分析日志文件/etc/httpd/logs/yfddos_log中指定时间内的用户访问记录
  • 将资源滥用者的IP加入文件/etc/yfddos/web-yf-search.b,并设置封杀TTL参数值
  • 将/etc/yfddos/web-yf-search.b中已经过期的条目全部及时删除

守护进程yfddosd是如何实现上面三个逻辑的:

  • 分析日志文件/etc/httpd/logs/yfddos_log中指定时间内的用户访问记录:
  • 将资源滥用者的IP加入文件/etc/yfddos/web-yf-search.b,并设置封杀TTL参数值
  • 将/etc/yfddos/web-yf-search.b中已经过期的条目全部及时删除

下面是守护进程yfddosd状态机的伪代码:(略去了一些处理细节)

防御者应斟酌调整每个检测时间点的参数值(封杀时间ttl与判定阈值limit),以调节系统应对CC攻击到来时的反应时间。

0x02 源代码