当前位置: 代码迷 >> 综合 >> nginx配置与详解8:安全与限制访问2
  详细解决方案

nginx配置与详解8:安全与限制访问2

热度:10   发布时间:2024-02-01 17:54:39.0

 

访问权限控制:

想更精准控制访问权限,其实还有auth_basic指令,用户必须输入有效的用户名和密码才能访问站点。而用户名和密码应该列在 auth_basic_user_file指令设置的文件中。

server {

    ...

    auth_basic "closed website";

    auth_basic_user_file conf/htpasswd;

}

auth_basic的off参数可以取消验证,比如对于一些公共资源,则可以取消验证。

server {

    ...

    auth_basic "closed website";

    auth_basic_user_file conf/htpasswd;

    location /public/ {

        auth_basic off;

    }

}

还需使用satisfy指令来组合来使用IP访问和Http验证。 其默认设置为all,即IP访问和HTTP验证同时通过时才允许用户访问,若设置为any,即IP访问和HTTP验证其一通过就允许用户访问

location / {

    satisfy any;

    allow 192.168.1.0/24;

    deny  all;

    auth_basic           "closed site";

    auth_basic_user_file conf/htpasswd;

}

 

连接权限控制:

在nginx0.7开始,出了两个新的模块:

HttpLimitReqModul:    限制单个 IP 每秒请求数

HttpLimitZoneModule:     限制单个 IP 的连接数

这两个模块,要先在http层定义,然后在 location, server, http上下文中作限制,他们用的是限制单ip访问的漏桶算法,也就是说超过定义的限制会报503错误,这样爆发的cc攻击就全部被限制住了。当然,有些时候可能是某个公司同一个ip有几十人一起访问网站,这是有可能被误伤的,做好503报错回调是很有必要的。

http {

    limit_req_zone $binary_remote_addr zone=test_req:10m rate=20r/s;

     …

     server {

         …

         location /download/ {

            limit_req zone=test_req burst=5 nodelay;

         }

     }

}

上面http层的就是定义,这是一个名为test_req的limit_req_zone空间,用来存储session数据,大小是10M内存,1M大约可以存16000个ip回话,看你访问量有多少就设多少。以$binary_remote_addr 为key,这个定义是客户端IP,可以改成$server_name等其他,限制平均每秒的请求为20个,写成20r/m就是每分钟了,也是看你访问量。

下面location层就是应用这个限制了,对应上面的定义,对访问download文件夹的请求,限制每个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秒执行。

就这个限制定义而言,把每个IP限制了请求数,对于海量的cc请求攻击,效果明显,例如限制到1r/s每秒一次请求,那就更明显了,不过也正如开头所说,对于大公司多人统一IP同时访问,难免出现误伤,所以还是得多考虑。

http {

  limit_conn_zone test_zone $binary_remote_addr 10m;

   server {

    location /download/ {

      limit_conn test_zone 10;

      limit_rate 500k;

    }

  }

}

和上面的类似,上面http层就是总定义,这是一个名为test_zone的limit_conn_zone空间,大小也是10M,key还是客户端IP地址,不过这个没有限制次数,改下面定义去了。

下面location层就是真正定义了,因为key定义是客户端ip,所以limit_conn就是一个IP限制了10个连接,如果是$server_name,那就是一个域名10个连接。然后下面limit_rate就是限制一个连接的带宽,如果一个ip两个连接,就是500x2k,这里是10,那就是最多可以有5000K速度给到这个ip了。

嫌弃503用户体验不好,也可以加个返回页面
error_page   503   /errpage/503.html;

上述的配置,是全网通用得,有时候难免有误伤,那怎么办呢,可以设置白名单制度。

#geo指令定义了一个白名单$whiteiplist变量,默认值为1,

#如果客户端ip在上面的范围内,$whiteiplist的值为0。

geo $whiteiplist  {

    default 1;

    10.11.15.161 0;

    127.0.0.1/32 0;

    }

#使用map指令映射上面geo匹配的客户端的ip为空串,如果不是就显示本身真实的ip,

#这样匹配的ip就不能存到limit_req_zone内存session中,所以不会被限制访问   

map $whiteiplist  $limit {

    1 $binary_remote_addr;

    0 "";

    }

#然后再制定这个$limit变量来设置规则,白名单制度就建立起来了

limit_req_zone $limit zone=one:10m rate=10r/s;

limit_conn_zone $limit zone=addr:10m;

 

 

 

 

  相关解决方案