NGINX优化之路(二)WEB安全篇

一、Nginx gzip 压缩的优点
 1.提升网站用户体验:由于发给用户的内容小了,用户访问单位大小的页面就快了,用户体验度提升。
 2.节约网站带宽成本,由于数据是压缩传输的,此举节省了网站的带宽流量成本,压缩时会稍微消耗一些CPU资源,这个可以抵消。此功能既能让用户体验增强,公司也少花钱。对于几乎所有的Web服务来说,这是一个非常重要的功能,当然Apache服务也有此功能。
 3.按照需求进行选择要压缩的对象

1、纯文本内容压缩比很高,因此纯文本内容是最好压缩,例如:html、js、css、xml、shtml等格式的文件
2、被压缩的纯文本文件必须要大于1KB,由于压缩算法的特殊原因,极小的文件压缩可能反而变大。
3、图片、视频(流媒体)等文件尽量不要压缩,因为这些文件大多数都是经历压缩的,如果再压缩很坑不会减小或减少很少,或者可能增加。而在压缩时还会消耗大量的CPU、内存资源

gzip on; #开启gzip压缩功能
gzip_min_length 1k;
#设置允许压缩的页面最小字节数,页面字节数从header头的Content-Length中获取,默认值是0,表示不管页面多大都进行压缩,建议设置成大于1K,如果小于1K可能会越压越大
gzip_buffers 4 16k;
#压缩缓冲区大小,表示申请4个单位为16K的内存作为压缩结果流缓存,默认是申请与原始是数据大小相同的内存空间来存储gzip压缩结果;
gzip_http_version 1.1
#压缩版本(默认1.1 前端为squid2.5时使用1.0)用于设置识别HTTP协议版本,默认是1.1,目前大部分浏览器已经支持GZIP压缩,使用默认即可。
gzip_comp_level 2;
#压缩比率,用来指定GZIP压缩比,1压缩比最小,处理速度最快;9压缩比最大,传输速度快,但处理最慢,也消耗CPU资源
gzip_types  text/css text/xml application/javascript; 
#用来指定压缩的类型,“text/html”类型总是会被压缩,这个就是HTTP原理部分讲的媒体类型。
gzip_vary on;
#vary hear支持,该选项可以让前端的缓存服务器缓存经过GZIP压缩的页面,例如用缓存经过Nginx压缩的数据。
配置在http标签端
 
http{
gzip on;
gzip_min_length  1k;
gzip_buffers     4 32k;
gzip_http_version 1.1;
gzip_comp_level 9;
gzip_types  text/css text/xml application/javascript; 
gzip_vary on;
}

二、配置Nginx expires缓存实现性能优化,当然httpd对应也有此功能

根据文件扩展名进行判断,添加expires功能范例。
 
    location ~.*\.(gif|jpg|jpeg|png|bmp|swf)$
       {
          expires 3650d;

三、业内知名网站缓存时间参考

  1. 企业网站缓存日期曾经的案例参考

  2.   若企业的业务和访问量不同,那么网站的缓存期时间设置也是不同的,比如:

  3. a.51CTP1

  4. b.sina15

  5. c.京东:25

  6. d.淘宝:10

**当然有些东西是不能缓存的,比如广告,这样就不能实现立体控制了。

Nginx日志相关的,很多公司都有ELK日志分析系统,有完整的一套基于日志做的安全分析、故障展示、告警、审计等ELK—Nginx配置实例

四、Nginx防止盗链

解决方案:
第一,对IDC及CDN带宽做监控报警。
第二,作为高级运维或者运维经理,每天上班的重要任务,就是经常查看网站流量图,关注流量变化,关注异常流量
第三,对访问日志做分析,对于异常流量迅速定位,并制定完善的响应处理机制,基准线等。

五、常见攻击应对方法及流量增大原因
常见问题
IDC带宽被占满的原因很多,常见的有:
a.真实遭受DDOS攻击。
b.内部服务器中毒,大量外发流量。
c.网站元素(如图片)被盗连,在门户页面被推广导致大量流量产生(接警3次以上)
d.合作公司来抓数据,如:对合作单位提供了API数据接口

要想防护好DDOS:
知己知彼,百战不殆,这永远是IT行业的名言
1、要想防护DDOS,就必须要了解DDOS技术
2、对网站进行DDOS压力测试
3、选择大牌国内国外的知名云服务商,例如:阿里、×××、腾讯云、亚马逊等
4、网站架构尽量不能出现单节点,集群架构
5、系统(包括web,db)自身优化及安全配置,不要动不动就配置65535
6、预留服务器空闲出30%-40%以上流量的突发情况的资源
7、网站架构优化、弹性扩展
8、尽量将95%以上的内容放在CDN上
9.智能DNS调度系统,根据监控数据,进行智能的分流
10.waf自动阻断、防火墙、公司有资本的情况下,可以考虑构建安全体系等如主动防御体系和被动防御体系等,主动的、例如主动测试探测器,威胁情报系统、蜜罐系统等
11.保留各种攻击证据,日志,最好有一套完整的审计系统,监控系统敏感文件,基于日志做安全告警及ELK展示,报警,大规模攻击都不是无目的的。
12.当发生DDOS攻击问题时,不要自己死扛,要第一时间主动和领导汇报,寻求更多的资源协助才是道理。

六、防爬虫优化
Robots协议(也成为爬虫协议、机器人协议等)的全称是网络爬虫排除标准(Robots Exclusin Protocol)网站通过Robots协议告诉引擎那个页面可以抓取,那些页面不能抓取。
Nginx防爬虫优化
  我们可以根据客户端的user-agents信息,轻松地阻止爬虫取我们的网站防爬虫
范例:阻止下载协议代理

 
 ## Block download agents ##
     if ($http_user_agent ~* LWP::Simple|BBBike|wget) {
            return 403;
     }
说明:如果用户匹配了if后面的客户端(例如wget)就返回403
 
范例:添加内容防止N多爬虫代理访问网站
 
 if ($http_user_agent ~* "qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot") { 
     return 403; 
} 
测试禁止不同的浏览器软件访问
 
 if ($http_user_agent ~* "Firefox|MSIE") 
{ 
rewrite ^(.*) http://blog.etiantian.org/$1 permanent;
}
如果浏览器为Firefox或者IE就会跳转到http:blog.etiantian.org
提示: 
这里主要用了$remote_addr这个函数在记录。 
查看更多函数
 
[root@web02 conf]# cat fastcgi_params
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  HTTPS              $https if_not_empty;
fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;
fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;
利用Nginx限制HTTP的请求方法
  HTTP最常用的方法为GET/POST,我们可以通过Nginx限制http请求的方法来达到提升服务器安全的目的, 
 例如,让HTTP只能使用GET、HEAD和POST方法配置如下:
 
 #Only allow these request methods
     if ($request_method !~ ^(GET|HEAD|POST)$ ) {
         return 501;
     }
#Do not accept DELETE, SEARCH and other methods
  设置对应的用户相关权限,这样一旦程序有漏洞,木马就有可能被上传到服务器挂载的对应存储服务器的目录里,虽然我们也做了禁止PHP、SH、PL、PY等扩展名的解析限制,但是还是会遗漏一些我们想不到的可执行文件。对于这种情况,该怎么办捏?事实上,还可以通过限制上传服务器的web服务(可以具体到文件)使用GET方法,来达到防治用户通过上传服务器访问存储内容,让访问存储渠道只能从静态或图片服务器入口进入。例如,在上传服务器上限制HTTP的GET方法的配置如下:
 
 ## Only allow GET request methods ##
     if ($request_method ~* ^(GET)$ ) {
         return 501;
     }