• nginx的详解(四)


    10.nginx的访问控制及DDOS预防
    1)访问控制配置
    基于各种原因,Ningx有时要进行访问控制。
    比如说,一般网站的后台都不能让外部访问,所以要添加 IP 限制,通常只允许公司的IP访问。
    访问控制就是指只有符合条件的IP才能访问到这个网站的某个区域。
    涉及模块:ngx_http_access_module
    模块概述:允许限制某些 IP 地址的客户端访问。
    对应指令:
    allow
    语法: allow address | CIDR | unix: | all;
    默认值: —
    作用域: http, server, location, limit_except
    允许某个 IP 或者某个 IP 段访问。如果指定 unix,那将允许 socket 的访问。注意:unix 在 1.5.1 中新加入的功能,如果你的版本比这个低,请不要使用这个方法。

    deny
    语法: deny address | CIDR | unix: | all;
    默认值: —
    作用域: http, server, location, limit_except
    禁止某个 IP 或者一个 IP 段访问。如果指定 unix,那将禁止 socket 的访问。注意:unix 在 1.5.1 中新加入的功能,如果你的版本比这个低,请不要使用这个方法。

    示例说明:
    server {
          listen 80;
         server_name forum.wangshibo.com;
         root /var/www/html;
         location / {
           deny 192.168.1.1;
           allow 192.168.1.0/24;
           allow 10.1.1.0/16;
           allow 103.10.67.56;
           deny all;
           }
    }
    规则按照顺序依次检测,直到匹配到第一条规则。
    在这个例子里,只有 10.1.1.0/16 、192.168.1.0/24和103.10.67.56允许访问,但 192.168.1.1 除外。

    如下实例:
    1)先是多域名绑定一个目录后的301跳转至同一个域名
    2)针对网站访问做来源ip白名单设置,并加上密码。(即用户认证配置)
    [root@test-huanqiu vhosts]# cat test.conf

    server {
         listen 80;
         server_name www.wangshibo.com web01.wangshibo.com hehe.wangshibo.com wangshibo.com;
         if ($host != 'www.wangshibo.com') {
         rewrite ^/(.*)$ http://www.wangshibo.com/$1 permanent;
         }
         root /var/www/html;
         index index.html index.php index.htm;
         access_log /usr/local/nginx/logs/image.log;
     
         allow  192.168.1.0/24;
         allow  124.65.197.154;
         deny  all;
         auth_basic "C1G_ADMID";
         auth_basic_user_file /usr/local/nginx/htpasswd;
    }
    htpasswd -c /usr/local/nginx/htpasswd wangshibo
    New password:
    Re-type new password:
    Adding password for user wangshibo
    访问站点http://www.wangshibo.com,效果如下:省略

    ngx_http_access_module 配置允许的地址能访问,禁止的地址被拒绝。这只是很简单的访问控制,而在规则很多的情况下,使用 ngx_http_geo_module 模块变量更合适。
    这个模块大家下来可以了解 : ngx_http_geo_module

    *******************************************************************************************************************************************************

    上面也用到了nginx的用户认证的配置,其中:
    auth_basic 认证时的提示信息
    auth_basic_user_file 认证时存放用户名和密码的文件

    # htpasswd -c /usr/local/nginx/htpasswd wangshibo       //第一次设置认证的用户
    # htpasswd /usr/local/nginx/htpasswd guohuihui           //追加认证的用户,后面再次追加认证用户时,不要加-c参数,否则就会覆盖之前添加的用户!

    下面顺便看几个认证部分的配置:

    location /admin/ {
    auth_basic "Admin Auth.";
    auth_basic_user_file /usr/local/nginx/htpasswd;
    }
     
     
    location /wangshibo/ {
    proxy_pass http://www.guohuihui.com/heng/;
    auth_basic "Test Auth.";
    auth_basic_user_file /usr/local/nginx/htpasswd;
    }
     
    location ^~ /auth/ {
    location ~ .*.(php|php5)?$ {
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    include fcgi.conf;
    }
    auth_basic "Authorized users only";
    auth_basic_user_file /usr/local/nginx/htpasswd;
    }
     

    2)DDOS预防配置
    DDOS的特点是分布式,针对带宽和服务攻击,也就是四层流量攻击和七层应用攻击,相应的防御瓶颈四层在带宽,七层的多在架构的吞吐量。
    对于七层的应用攻击,还是可以做一些配置来防御的,使用nginx的http_limit_conn和http_limit_req模块通过限制连接数和请求数能相对有效的防御。
    其中:
    ngx_http_limit_conn_module    可以限制单个 IP 的连接数
    ngx_http_limit_req_module      可以限制单个 IP 每秒请求数
    配置方法:
    (1)限制每秒请求数,即ip访问频率限制 
    涉及模块:ngx_http_limit_req_module
    通过漏桶原理来限制单位时间内的请求数,一旦单位时间内请求数超过限制,就会返回 503 错误。
    配置范例:
    http {
           limit_req_zone $binary_remote_addr zone=one:10m rate=20r/s;
    ...
           server {
    ...
          location ~ .php$ {
              limit_req zone=one burst=5 nodelay;
              }
          }
    }

    配置说明(上一部分解释过的就不再解释):
    定义一个名为one的limit_req_zone用来存储session,大小是10M内存,
    以$binary_remote_addr 为key,限制平均每秒的请求为20个,
    1M能存储16000个状态,rete的值必须为整数,
    rate=20r/s表示限制频率为每秒20个请求;如果限制两秒钟一个请求,可以设置成30r/m。
    限制每ip每秒不超过20个请求,漏桶数burst为5
    brust的意思就是,如果第1秒、2,3,4秒请求为19个,
    第5秒的请求为25个是被允许的。
    但是如果你第1秒就25个请求,第2秒超过20的请求返回503错误。
    nodelay,如果不设置该选项,严格使用平均速率限制请求数,
    第1秒25个请求时,5个请求放到第2秒执行,
    设置nodelay,25个请求将在第1秒执行。

    (2)限制IP连接数(上面已经说明,这里直接写配置)
    http {
           limit_conn_zone $binary_remote_addr zone=addr:10m;               //上面讲过
    ...
          server {
    ...
          location /ops/ {
          limit_conn addr 1;
             }
         }
    }

    总的来说:如何设置能限制某个IP某一时间段的访问次数是一个让人头疼的问题,特别面对恶意的ddos攻击的时候。其中CC攻击(Challenge Collapsar)是DDOS(分布式拒绝服务)的一种,也是一种常见的网站攻击方法,攻击者通过代理服务器或者肉鸡向向受害主机不停地发大量数据包, 造成对方服务器资源耗尽,一直到宕机崩溃。
    cc攻击一般就是使用有限的ip数对服务器频繁发送数据来达到攻击的目的。

    nginx可以通过Http LimitReq Modul和Http LimitZone Module配置来限制ip在同一时间段的访问次数来防cc攻击。
    1)Http LimitReq Modul用来限制连单位时间内连接数的模块,使用limit_req_zone和limit_req指令配合使用来达到限制。一旦并发连接超过指定数量,就会返回503错误。
    2)Http LimitConn Modul用来限制单个ip的并发连接数,使用limit_zone和limit_conn指令

    配置示例:
    Http LimitReq Modul限制某一段时间内同一ip访问数
    http{
    ......
          limit_req_zone $binary_remote_addr zone=allips:10m rate=20r/s;
    ......
         server{
    ...
         location {
    ......
           limit_req zone=allips burst=5 nodelay;
    ......
        }
    ......
       }
    ......
    }

    Http LimitZone Module 限制并发连接数实例
    limit_zone只能定义在http作用域,limit_conn可以定义在http server location作用域
    http{
    ...
        limit_conn_zone one $binary_remote_addr 10m;
    ......
        server{
    ......
        location {
    ......
          limit_conn one 20;
          limit_rate 500k;
    ......
         }
    ......
         }
    ......
    }

    (3)限速白名单设置(可参考:nginx利用geo模块做限速白名单以及geo实现全局负载均衡的操作记录
    http_limit_conn和 http_limit_req模块限制了单IP单位时间内的连接和请求数,但是如果Nginx前面有lvs或者haproxy之类的负载均衡或者反向代理,nginx 获取的都是来自负载均衡的连接或请求,这时不应该限制负载均衡的连接和请求,就需要 geo 和 map 模块设置白名单:
    geo $whiteiplist {
         default 1;
         10.11.15.1610;
    }
    map $whiteiplist$limit {
         1 $binary_remote_addr;
         0 "";
    }
    limit_req_zone $limit zone=one:10m rate=10r/s;
    limit_conn_zone $limit zone=addr:10m;

    geo 模块定义了一个默认值是 1 的变量 whiteiplist,当在 ip 在白名单中,变量 whiteiplist 的值为 0,反之为1.
    对上面设置的逻辑关系解释:
    如果在白名单中--> whiteiplist=0 --> $limit="" --> 不会存储到 10m 的会话状态(one 或者 addr)中 --> 不受限制;
    反之,不在白名单中 --> whiteiplist=1 --> $limit=二进制远程地址 -->存储进 10m 的会话状态中 --> 受到限制。

    (4)动手测试DDOS预防配置
    下面来测一下上面说到的配置是否起到了作用。
    安装nginx+php环境
    写一个测试的PHP文件,修改nginx配置文件,使其能正常访问。
    在/home/shiyanlou目录下写一个test.php,内容如下:
    [root@server_web1 ~]# vim /home/shiyanlou/test.php
    <?php
    phpinfo ();
    ?>

    nginx配置文件参数

    location ~ .php$ {

      root /home/shiyanlou;

      fastcgi_split_path_info ^(.+.php)(/.+)$;

      fastcgi_pass unix:/var/run/php5-fpm.sock;

      fastcig_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

      include fastcgi_params;

      }

     访问:localhost/test.php

    用ab命令测试,比较修改nginx配置文件前后的测试结果(连接数和请求数分开测试)

    ab -n 10 -c 2 http://172.17.0.2/test.php

    对nginx配置做修改(添加http和php配置),重启,然后再进行测试

    http{

      limit_conn_zone $binary_remote_addr zone=addr:1m;

      limit_req_zone $binary_remote_addr zone=one:1m rate=5r/5;

    }

    location ~ .php$ {

      limit_conn addr 1;

      limit_req zone=one burst=5 nodelay;

    }

    ab -n 10 -c 2 http://172.17.0.2/test.php

    11.访问白名单
    参考:nginx访问白名单设置以及根据$remote_addr分发

    12.nginx的上传下载设置
    参考:nginx限制上传大小和超时时间设置说明/php限制上传大小

    13.nginx目录浏览及其验证功能
    参考:nginx下目录浏览及其验证功能配置记录

    14.Nginx下禁止指定目录运行php脚本文件

    非常简单,直接通过location条件匹配定位后进行权限禁止。
     
    在server配置段中增加下面的的配置:
     
    1)如果是单个目录
    location ~* ^/uploads/.*.(php|php5)$ { 
        deny all;
     
    2)如果是多个目录
    location ~* ^/(attachments|uploads)/.*.(php|php5)$ {
       deny all;
     
    注意:这段配置文件一定要放在下面配置的前面才可以生效。
    location ~ .php$ {
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
    }
     
    配置完后记得重启Nginx生效。
     
    ------------------------------------------------------------------------------
    如果是Apache下禁止指定目录运行PHP脚本,在虚拟主机配置文件中增加php_flag engine off指令即可,配置如下
    "/website/uploads"
      Options FollowSymLinks 
      AllowOverride None 
      Order allow,deny 
      Allow from all  
      php_flag engine off
     
  • 相关阅读:
    Html、Vue——本地文件上传弹框+读取本地文件内容
    git-基本操作
    Selenium(二)---无界面模式+滑动底部
    Selenium(一)---Selenium的安装和使用
    Nginx+win10安装配置
    Tinghua Data Mining 9
    Tinghua Data Mining 8
    Tinghua Data Mining 7
    Tinghua Data Mining 6
    Tinghua Data Mining 5
  • 原文地址:https://www.cnblogs.com/fengzhongzhuzu/p/8855308.html
Copyright © 2020-2023  润新知