这周的企业安全建设专题又来啦,这一期讨论的将是企业安全建设中的开源软件建设部分,百度的安全大牛对此进行了详细的解读并提出了建设性意见,感兴趣的同学们快来看一看吧!
前言
大多数互联网公司的业务的开展都离不开web服务,web防护也成为众多甲方安全团队需要面对的问题,本文结合实战经验讲述如何使用开源软件搭建大规模WAF集群。为了更有通用性,部分自研模块使用了开源组件代替。自建大型WAF集群开发维护需要相当人力,大家需谨慎,我们经历了2年多才算稳定下来,BAT3和传统4强都有解决方案,大家真可以考虑商业成熟方案。
WAF集群架构
主要组成为:四层负载均衡、WAF服务、WAF日志处理、WAF配置管理,均支持集群部署,快速横向扩展。
四层负载均衡 从基础网络安全的角度讲,应该严格限制直接使用公网IP对外提供服务的形式,这样攻击面会非常大且不可控。应该所有经过测试的服务才使用负载均衡的方式对外发布WEB服务,其他服务都不直接对外发布,这样可以严格控制黑客的攻击面。
四层负载的主要作用是:四层负载均衡,讲用户请求转发给后端WAF服务;将后端的WAF服务以公网IP的形式发布出去,最好具备一定的抗四层攻击的能力。 常见的开源解决方案当属LVS。
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统,支持VS-NAT、VS-TUN、VS-DR三种模式: VS-NAT:就是把客户端发来的数据包的IP头的目的地址,在负载均衡器上换成其中一台RS的IP地址,并发至此RS来处理,RS处理完成后把数据交给经过负载均衡器,负载均衡器再把数据包的原IP地址改为自己的IP,将目的地址改为客户端IP地址即可期间,无论是进来的流量,还是出去的流量,都必须经过负载均衡器 VS-TUN:把客户端发来的数据包,封装一个新的IP头标记(仅目的IP)发给RS,RS收到后,先把数据包的头解开,还原数据包,处理后,直接返回给客户端,不需要再经过负载均衡器注意,由于RS需要对负载均衡器发过来的数据包进行还原,所以说必须支持IPTUNNEL协议所以,在RS的内核中,必须编译支持IPTUNNEL这个选项。 VS-DR:负载均衡器和RS都使用同一个IP对外服务,由于负载均衡器要对二层包头进行改换,所以负载均衡器和RS之间必须在一个广播域,也可以简单的理解为在同一台交换机上 由于我们希望仅LVS暴露在公网,后端WAF和WEB服务的部署不要有太多物理机柜网段限制,推荐使用VS-NAT模式,虽然全部请求和应答都会过LVS,LVS可能会成为整个系统的瓶颈,但是实际经验是LVS性能足够好,单机性能瓶颈往往是网卡,万兆网卡打满的情况下CPU还有余力。
以上图为例,在LVS上配置如下: /sbin/ipvsadm -C /sbin/ipvsadm -a -t 201.114.5.36:80 -r 192.168.1.100:80 -m -w 1 /sbin/ipvsadm -a -t 201.114.5.36:80 -r 192.168.1.101:80 -m -w 1 /sbin/ipvsadm 注:两台LVS之间可以起vrrp虚拟出VIP起到高可用的效果,更多生产环境的优化请自行补充。
WAF服务 常见的开源WAF有mod_security和nginx lua,由于nginx卓越的性能以及lua的编程级灵活性,nginx lua成为了更多人的选择,一个代码示例如下: location / { default_type 'text/plain'; access_by_lua ' local waf = require "waf" waf.execute() '; } 其中所有真实的WAF工作被用lua写的waf模块做了。这部分在loveshell写的非常清楚了(https://github.com/loveshell/ngx_lua_waf) ,春哥的也不错(https://github.com/openresty) 我稍微简化了下安装过程: 安装luajit wget http://luajit.org/download/LuaJIT-2.0.0.tar.gz tar zxvf LuaJIT-2.0.0.tar.gz cd LuaJIT-2.0.0 make make install PREFIX=/usr/local/lj2 ln -s /usr/local/lj2/lib/libluajit-5.1.so.2 /lib64/ 安装devel_kit wget https://github.com/simpl/ngx_devel_kit/archive/v0.2.17rc2.zip unzip v0.2.17rc2 安装lua-nginx-module wget https://github.com/chaoslawful/lua-nginx-module/archive/v0.7.4.zip unzip v0.7.4 安装pcre wget http://blog.s135.com/soft/linux/nginx_php/pcre/pcre-8.10.tar.gz tar zxvf pcre-8.10.tar.gz cd pcre-8.10/ ./configure make |