WEB应用

阿里云盾网站安全防御(WAF)的正确使用方法

将2个网站搬到阿里云,一个是因为阿里云稳定,另一个就是牛逼轰轰的云盾了。之前在博客联盟群里模拟CC攻击过搭建在阿里云ECS上的博客,结果云盾毫无反应,而网站已经挂了。 这次特意细看了一下云盾上的CC防护功能,发现有部分朋友估计并未正确使用WAF。所以,我在本文就简单的分享一下阿里云盾-WAF网站防御的正确使用方法。 一、域名解析 大部分朋友,只是开启了云盾就不管了,这也就是很多朋友受到CC攻击后,云盾却毫无反应的原因了。实际上WAF防御必须配合域名解析来使用。 阿里云的WAF网站防御实际上相当于没有缓存机制的百度云加速或360网站卫士,不过只能用cname接入方式,后续是否会结合万网解析,新增NS接入方式就不得而知了: 如上图所示,要开启WAF网站防御,就必须在域名解析那,将主机记录cname到云盾生成的CNAME地址。这时用户访问网站是这样一个情况: 用户浏览器 → 域名解析 →cname到云盾服务器 → 源服务器 当受到攻击时,流量会经过云盾节点,并触发清洗机制,起到CC/DDoS防护作用。 当然,也有部分朋友知道WAF使用方法,但可能是出于SEO考虑,这些朋友也只会在网站受到攻击的时候才会修改为CNAME解析,因为CNAME解析到阿里云WAF域名后,IP并不是固定的,这点和云加速之类的是一致的,不过遗憾的是WAF并没有搜索引擎自动回源机制,所以使用cname之后,IP的频繁变更会对SEO造成不良影响! 如下图所示,使用WAF之后,网站IP也就变成了云盾节点IP了: 那该如何解决这个问题呢?想必看过张戈博客上一篇文章的朋友已经了然于心了吧?没错!和备案不影响SEO的做法一样:将默认线路cname到阿里云WAF地址,然后再新增一条搜索引擎线路,指定到源服务器IP即可!这样就可以长期开启云盾WAF防御,而不影响SEO了! 本想,百度自家的云加速解析,对搜索引擎线路的判断应该是最靠谱的(对于做百度流量的网站来说),毕竟是自家的产品,有哪些蜘蛛IP,都一清二楚,不会搞错!但实际测试发现,百度云加速目前并不支持cname默认线路的同时,新增搜索引擎线路,会提示该记录已存在! Ps:尝鲜版的百度云加速倒是支持,地址是 http://next.su.baidu.com,感兴趣的可以自行测试下。 后来仔细一想,百度虽然对自己的蜘蛛了解透彻,但是对其他几家呢?比如搜狗,比如360?估计是个半吊子。处于完整性考虑,我推荐使用DNSPOD解析,原因无它,看图: DNSPOD和百度有过合作,所以有一个百度专属线路,额外的还有搜索引擎线路,想必比百度云加速收集的蜘蛛IP更加完善吧! 所以,正确的解析如下所示: 这样解析不但可以放心使用阿里云WAF防御,还可以隐藏你的网站真实IP,避免发生源站被攻击只能换IP的尴尬(通过hosts本地解析进行攻击,啥CDN防护都没了作用!) 二、防护设置 可能开启了云盾,也正确解析了域名,但是被CC攻击时,云盾还是毫无反应?!实际上还要设置下DDoS防护高级设置,因为云盾默认的DDoS防护阈值还是太高,如下所示: 清洗触发值: 每秒请求流量:180M 每秒报文数量:30000 每秒HTTP请求数:1000 我们这种搭建在阿里云的小博客,大部分带宽都只有1~2M,别人2M请求流量或100+并发就已经把你的网站打出了翔咯!所以很多朋友就算正确开启了WAF防御,被攻击的时候还是非常卡! 因此,我们必须根据自己网站的流量设置下阈值。 看了下,最低的请求流量是10Mbps,也就是10M带宽,所以一般ECS服务器根本不够看,因为水管太小了。。因此,我们需要设置另一个阈值:http并发请求。 对于我这种1M带宽的ECS,相信100并发已经卡出了翔。所以,我们考虑设置在50以下: Ps:当然做好了CDN动静分离的网站可以设置到100+,比如用了七牛CDN的朋友,总之得根据实际情况而定。 阈值只是触发的前提,下面还有一个触发之后的清洗限制,也就是发现并发超过阈值时,云盾对来访的单IP做连接数限制,超过了这个限制就返回503: 原则上,触发清洗阈值之后,单一IP连接数限制得越小越好,但是又不能将正常的访问阻挡在门外。所以这个限制该如何定义还得看实际情况!当然,你可以通过模拟攻击去测试出一个合理的限制值,但是也得考虑一些局域网公用一个公网IP上网的情况(得看网站的受众人群)。 看到这,相信不少用阿里云服务器的朋友已经有所收获吧?再我看来,使用阿里云WAF的作用主要有2个,一个是基础DDoS防护,另一就是隐藏网站真实IP。当你的网站经常被攻击,而云盾都无法完全清洗时,我们还可以在本文的基础上再套上一层百度云加速,平常不被攻击时,百度云加速设置回源,关闭加速即可,具体做法我就不多说了,看图即懂: 这种方案的网站访问模式如下: 用户浏览器 → 域名解析  →  百度云加速节点(缓存开启时) → 阿里云盾节点 → 源服务器 当然,这个方案只适用于百度云加速3.0尝鲜版,地址:http://next.su.baidu.com/ ,感兴趣的自己去研究下吧!就写这么多,洗洗睡。 最新补充:提了好几次工单,才弄清楚云盾中的DDoS和WAF是2个不同的功能,看来是我理解错了!最后纠正下,DDoS中的DD/CC防护和WAF设置并无关系,也就是你不设置WAF的CNAME也没关系,只要开启了DDoS防护就可以了!所以本文中的部分描述是不到位的,但是必须说明的是,参考本文开启WAF之后,确实可以实现隐藏真实IP的妙用!强烈建议使用!
阅读全文
zabbix监控在lnmp环境下编译安装小记 WEB应用

zabbix监控在lnmp环境下编译安装小记

最近在复习运维常见的监控告警软件的时候,想起了zabbix,于是先用军哥的lnmp一键安装包快速搭建了lnmp环境,然后成功编译安装了zabbix,特地将安装过程和遇到的问题记录在此,以便自己或有需要的人来参考翻阅。 由于已有php运行环境,所以只需要编译安装zabbix即可。 一、安装依赖组件 二、编译安装zabbix ①、下载zabbix ②、编译安装 Ps:configure可能出现下列错误: a. 找不到mysqlclient library: 如下建立软链接之后,重新编译即可: b. 找不到 MySQL library: 这是未安装mysql-devel组件产生的错误,先用yum安装,然后重新编译即可: 三、配置zabbix Ps:以下步骤如果不是绝对路径,均位于zabbix解压后的文件夹目录,即/usr/local/src/zabbix-2.4.3 ③、创建zabbix数据库,并导入初始数据 ③、修改配置 ④、部署WEB ⑤、增加服务端口 ⑥、启动zabbix服务 四、WEB端的安装 因为我是放到lnmp的default目录,所以直接在浏览器访问http://ip地址/zabbix进入安装向导,和一般的php建站程序的安装一样,非常简单。 下一步会检测运行环境,若出现红色的,就自查并解决即可,比如这次出现了一个这样的提示: 提示max_input_time的值应该改成300,所以只需要编辑php.ini,找到max_input_time并修改为300,保存后执行service php-fpm restart,再刷新安装向导已经没有问题了,继续按照向导直到安装完毕: 完成后进入zabbix登陆界面: 输入默认的用户名:admin 和 密码:zabbix 即可登入: 五、问题与解决 ①、监控报错 登陆zabbix后,发现仪表盘报如下错误: 看了下后台日志: 原来是mysql.sock路径问题。 解决方法: 方法(1). 修改/usr/local/zabbix/etc/zabbix_server.conf,找到#DBSocket=/tmp/mysql.sock,取消注释: 方法(2). 建立软链接: 推荐第一种方法,保存后,使用service zabbix_server restart 重启zabbix服务即可解决此问题。 ①、中文设置 修改为中文界面的步骤是:Profile -> Language -> Chinese (zh_CN)  ->Save 可当我安装之后,却没有Chinese (zh_CN)这这个下拉选项。 解决办法: 1、在zabbix网站目录(/home/wwwroot/default/zabbix)找到 include/locales.inc.php 文件 2、编辑 locales.inc.php,找到 修改为: Ps:里面好多语言默认都是false屏蔽了,想开启只需要改成true即可在语言配置中开启。 修改保存后,刷新网页,已经可以找到Chinese (zh_CN)了: ②、图形中文显示为方框 由于还没有添加受监控的客户端,所以先把server自身的监控打开: 步骤:组态(配置) -> 主机 -> 激活主机 进入图形后,发现文字都是方框: 看来是字体问题,只需要用 Windows 下的常用字体替换一下即可。 具体步骤: 1). 我比较喜欢微软雅黑,所以在 C:\windows\fonts 下找到微软雅黑字体:msyh.ttc 2). 上传到zabbix字体目录:/home/wwwroot/default/zabbix/fonts/ 3.). 用msyh.ttc覆盖默认的字体文件 DejaVuSans.ttf 即可: 刷新页面,已经正常了: 好了,关于zabbix服务端的安装就记录到这,后续有时间在来记录下zabbix客户端的安装及使用。
阅读全文
WEB应用

PHP彩蛋还是漏洞?expose_php彩蛋的触发和屏蔽方法

最近在折腾网站XSS漏洞修复的时候,当我把XSS漏洞和谐成功之后,360扫描送来了一个"彩蛋": 本以为又是360误报,结果点击看了下,还真能打开PHPinfo: PHP彩蛋我也是第一次听说,貌似老一辈的程序员们都知道,因为PHP是由黑客语言发展而来,所以各方面都透露着放荡不羁的极客精神! 一、如何触发PHP彩蛋? 我们只要在运行PHP的服务器上,在域名后面输入下面的字符参数,就能返回一些意想不到的信息。当然有些服务器是把菜单屏蔽了的。彩蛋只有这4个,PHP是开放源代码的,所以不必担心还有其他。 我2个网站目前都已屏蔽了PHP彩蛋,所以我们一起来看下腾讯的招聘网站: 原网站是这样的 点击跳转 加上“彩蛋之后”是这样: 1). PHP信息列表 点击跳转 2). PHP的LOGO 点击跳转 3). Zend LOGO 点击跳转 4). PHP LOGO 蓝色大象  点击跳转 二、如何看待PHP彩蛋? 如果你在自己的博客上也发现了这个问题,请不要惊慌,也莫要想着必须马上去解决他。其实这不算是漏洞。只是开源团队开的一个玩笑,全世界都认可的玩笑。没必要上纲上线,将它列为PHP的漏洞,连360都戏称为。 三、如何屏蔽PHP彩蛋? 方法①、我们可以通过apache或者nginx的伪静态规则去屏蔽,比如apache的服务器,我们可以在 .htaccess 里面加入以下2条规则即可拦截此类访问: 方法②、 直接编辑PHP的配置文件php.ini,找到expose_php,将值改为Off,然后重启或重载PHP服务即可: 我是懒得去想nginx规则该如何写了,直接修改php.ini来屏蔽的。屏蔽后,再去触发彩蛋发现已经无效了。再用360检测已经没有任何问题了: 如果你也发现你的网站有这个问题,也不必太在意。当然,强迫症还是去折腾修复下,免得坐立不安,哈哈!
阅读全文
WEB应用

Nginx在CDN加速之后,获取用户真实IP做并发访问限制的方法

最近一直在帮一个购买了张戈博客付费服务的朋友做网站防护,为了简单抵挡一下竞争对手的DDoS攻击,他给网站开启了Incapsula的免费CDN服务。 开启CDN之后,我之前给他写的Shell防护脚本也就宣告无效了,因为不管是正常访问还是攻击访问,脚本拿到的IP都是CDN节点的,而我不可能把CDN的节点IP也给禁用了,那就都不能访问了。 为了解决这个窘迫,我想到了以前看过的Nginx访问限制。通过查资料,让我拜读了一枚大神的神作,感觉收获颇丰!于是转过来整理一下,分享给更多需要的人! Nginx 有2个模块用于控制访问“数量”和“速度”,简单的说,控制你最多同时有 多少个访问,并且控制你每秒钟最多访问多少次, 你的同时并发访问不能太多,也不能太快,不然就“杀无赦”。 HttpLimitZoneModule    限制同时并发访问的数量 HttpLimitReqModule      限制访问数据,每秒内最多几个请求 一、普通配置 什么叫普通配置? 普通配置就是针对【用户浏览器】→【网站服务器】这种常规模式的nginx配置。那么,如果我要对单IP做访问限制,绝大多数教程都是这样写的: 这样一个最简单的服务器安全限制访问就完成了,这个基本上你 Google 一搜索能搜索到  90% 的网站都是这个例子,而且还强调用“$binary_remote_addr”可以节省内存之类的云云。 二、CDN之后 目前国内已经争相出现了百度云加速、加速乐、360网站卫士以及安全宝等免费CDN。让我们这些小网站也能免费享受以前高大上的CDN加速服务。 于是,网站的访问模式就变为: 用户浏览器 → CDN节点 → 网站源服务器 甚至是更复杂的模式: 用户浏览器 → CDN节点(CDN入口、CC\DDoS攻击流量清洗等) → 阿里云盾 → 源服务器 可以看到,我们的网站中间经历了好几层的透明加速和安全过滤, 这种情况下,我们就不能用上面的“普通配置”。因为普通配置中基于【源IP的限制】的结果就是,我们把【CDN节点】或者【阿里云盾】给限制了,因为这里“源IP”地址不再是真实用户的IP,而是中间CDN节点的IP地址。 我们需要限制的是最前面的真实用户,而不是中间为我们做加速的加速服务器。 其实,当一个 CDN 或者透明代理服务器把用户的请求转到后面服务器的时候,这个 CDN 服务器会在 Http 的头中加入一个记录 X-Forwarded-For :  用户IP, 代理服务器IP 如果中间经历了不止一个代理服务器,这个记录会是这样 X-Forwarded-For :  用户IP, 代理服务器1-IP, 代理服务器2-IP, 代理服务器3-IP, …. 可以看到经过好多层代理之后, 用户的真实IP 在第一个位置, 后面会跟一串中间代理服务器的IP地址,从这里取到用户真实的IP地址,针对这个 IP 地址做限制就可以了。 那么针对CDN模式下的访问限制配置就应该这样写: 三、echo模块 作者原文提到了nginx的一个echo模块,特意玩了下感觉挺有意思的,下面贴一下简单集成步骤。 ①、给nginx集成echo模块: ②、echo用法举例: 其实就和shell的echo差不多,能否输出自定义信息。 比如,在nginx里面配置如下: 访问http://yourdomain.com/hello 就会在浏览器里面输出hello, world! 了(如果域名开了CDN可能会报404)。 又比如,测试本文提到的真实用户的IP,只要在本文第二步配置基础上,加上如下规则并reload即可: 生效后,访问http://yourdomain.com/realip 就能显示你所用电脑(宽带)的真实IP了(可在ip138查验准确性): Ps:感兴趣又喜欢学习的童鞋可以看下相关wiki文档:http://wiki.nginx.org/HttpEchoModule 本文介绍到这就差不多结束了,也是在神作的基础上精简整理并测试的,如果看完还有些许疑问,请前往查看神作原文,也许还是大神写的比较好理解(是否是原创我就不深究了,感觉也是转来转去,都没留链接,悲哀的互联网)! 本文整理自【棒主妇开源】,原文地址:《网站安全配置(Nginx)防止网站被攻击》。
阅读全文
WEB应用

Linux+Nginx/Apache/Tomcat新增SSL证书,开启https访问教程

上上篇文章《nginx平滑升级&新增模块》提到了公司的https访问需求。当我新增了SSL模块之后,却发现以前还真没部署过https访问。 下面整理我的部署过程,并收集了一下Apache和Tomcat这2种Linux下常用的WEB软件配置SSL的简单简单步骤,以便回头翻阅。 一、下载证书 成功申请SSL证书之后,就可以下载到配置SSL的证书了!一般情况下,都可以选择下载相应WEB服务器的不同证书,或者直接打包下载主流WEB服务器的证书,如图所示: 下载后,就可以根据不同的WEB服务器来选择相应的证书了。 二、Nginx 先确认nginx安装时已编译http_ssl模块,也就是执行如下命令查看是否存在--with-http_ssl_module参数: 如果没有这个参数,说明没有编译SSL模块,那么请参考上上篇文章自行解决,此处就不赘述了。 ①、准备证书 Nginx需要用到2个证书文件: I.  证书公钥 (crt格式) II. 证书私钥(key格式) 拿到证书后,将其上传到nginx下的ssl目录(也可自定义位置)。 ②、修改配置 A. http和https全局共存 在原server模块新增监听443端口,然后新增如下代码(具体看注释)。 保存配置之后,先执行如下命令测试配置是否正确: 确认无误之后,执行如下命令重载nginx,让配置生效: 如无错误,现在应该可以顺利访问https://yourdomain.com/了!值得说明的是,这样配置后,http和https是全局共存的,你能http访问到的页面,https也可以访问得到。 B. 全局强制https 如果是全局https访问,那么额外写一个监听80的server,让http访问跳转到https上即可,下面是参考模板: C. 部分强制https,部分强制http 可能有部分强迫症会有这样的需求:我只要部分页面强制https访问,比如后台及登陆页面,其他常规页面强制http访问,我该如何设置? 思路:和B方案一样,分别2个server模块,并新增判断规则,指定部分页面http访问,部分页面https访问。 具体可以参考一下张戈博客的配置(主要修改中文注释部分,其他配置保持不变): 二、Apache 同样,先确认Apache安装时已添加SSL支持模块。如果没有请自行搜索搞定,本文不再赘述。 ①、准备证书 Apache需要用到三个证书文件: I. 根证书:root_bundle.crt II. 证书公钥:yourdomain.com.crt III. 证书私钥:yourdomain.com.key 将下载好的三个证书文件,上传到apache下的ssl目录中(可自定义位置)。 ②、修改配置 I. 编辑httpd.conf文件,取消以下内容的#注释符号: II. 编辑http-ssl.conf文件,如下修改: III. 保存退出,并重启Apache即可。 三、Tomcat ①、准备证书 Tomcat只需要用到一个jks格式的证书文件,比如yourdomain.com.jks。 拿到文件后,将其上传到Tomcat下的conf目录中。 ②、修改配置 打开conf目录下的server.xml文件,找到以下内容: 去掉前后的注释,并如下修改(或者直接其后添加以下代码亦可): 退出并保存,最后重启Tomcat即可。 四、解决警告 如果网页中存在不带https的资源,比如http协议的js、css或图片,那么访问这个https页面,某些浏览器(比如IE)就会发出警告,提示页面中存在不安全的内容,并且不会加载这些http协议的资源,导致页面错乱等问题: 解决办法: 方法①、使用相对地址 只要将这些http的资源链接,改为相对地址。比如原链接是<img src="http://yourdomain.com/images/demo.png">那么改成<img src="/images/demo.png">即可。 方法②、修改网站代码 如果是全局https访问,那么你将网站代码中的链接均改为https好了。如果是http和https混合的,那么准备2套网站文件也行。然后在nginx当中设置不同的root路径。 为了省事,我推荐方法①。 好了,本文就写到这,希望能解您的燃眉之急!
阅读全文
WEB应用

Nginx在线服务状态下平滑升级或新增模块的详细操作记录

今天,产品那边发来需求,说有个APP的IOS版本下载包需要新增https协议,在景安购买了免费的SSL证书。当我往nginx上新增ssl时,发现服务器上的nginx居然没编译SSL模块! 看了下旧版本nginx的configure选项: 可能是出于最小化安装的考虑,就只有一个prefix参数,而版本也挺低的,干脆就升级一下好了!由于服务器处于在线服务状态,为了避免升级带来的不良影响,我决定给nginx来个平滑升级,结果发现还真是如丝般顺滑。。。 下面记录一下平滑升级和新增模块的过程。 一、半自动平滑升级 所谓半自动,其实就是在最后迁移的时候使用源码自带的升级命令:make upgrade来自动完成。 ①、按需编译新版本的nginx 根据需求,常规编译新版本nginx,不过只要执行到make就打住,不要make install! ②、重命名nginx旧版本二进制文件,即sbin目录下的nginx(期间nginx并不会停止服务!): ③、然后拷贝一份新编译的二进制文件: ④、在源码目录执行make upgrade开始升级: 完成后,最后确认一下 nginx -V : 正常了,平滑升级成功! 二、纯手动平滑升级 纯手动模式,指的是在最后做迁移的时候,全部使用手动命令来搞定,避免编译可能存在不一致的参数啥的。 实际上,在make之后,我们可以查看nginx源码目录下的Makefile内容如下: 所以,说白了纯手动就是执行upgrade标签下的命令行而已,实际上只要确认Makefile下的命令路径都是正确的,用命令自动迁移是没有任何问题的。 总是有人会不放心的,喜欢手动一步一步的搞定,我也来整理下纯手动步骤: ①~③和半自动一样,按常规步骤先编译nginx,不过只执行到make就打住,然后将旧的sbin下的nginx文件移走,再将编译得到的objs目录下的nginx文件放到原来的sbin目录。 ④、测试新版本的nginx是否正常: ⑤、给旧nginx发送平滑迁移信号(若不清楚pid路径就用可用命令(2)): Ps:后面其实就是旧nginx的pid,所以先用ps aux找到正在运行的nginx主进程pid,再执行 kill -USR2 PID值亦可。 ⑥、等待旧版本Nginx的pid变为oldbin(执行如下命令查看是否生成) ⑦、  从容关闭旧版本的Nginx进程 此时,旧的工作进程就都会慢慢随着任务执行完毕而退出,新版的Nginx的工作进程会逐渐取代旧版工作进程。 ⑧、此时,不重载配置启动旧工作进程(个人感觉是为了将任务完全切换到新的nginx上) ⑨、结束工作进程,完成此次升级操作: ⑩、最后,验证nginx是否升级成功: 特意测试了下纯手动的做法,下面是我的操作记录,仅供参考: 为了验证平滑升级确实不影响在线业务,我特意在升级的时候,利用ab命令一直在发送请求: 直到升级完成,使用ctrl +C 终止并查看ab结果,可以发现几十万次的请求全部成功,没有失败!证明平滑升级的可行性!可惜忘记了截图,感兴趣的童鞋可以自行测试下! 好了,关于nginx的平滑升级和在线新增模块的操作记录就到这里结束了,希望对你有所帮助。
阅读全文