首页 > 安全 > 网络安全 > 正文
NGINX安全配置和限制访问
2017-08-10 09:40:56       个评论      
收藏    我要投稿

说起网络攻击,可能很多人只知道大名鼎鼎的DDOS攻击,这种攻击廉价且效果出众,直接通过第四层网络协议用他的带宽把你的带宽顶掉,造成网路阻塞,防不胜防,就连腾讯这种大鳄公司也被大流量DDOS搞过焦头烂额。暂时的解决方法只有三种,第一种就是你的带宽足够大,无视这些网络流量。第二种是个别有技术的大牛公司(阿里),开发出流量清洗服务,把垃圾网络包过滤掉,不过同时也会影响正常的网络包,增加延时。第三种就是换ip了(废话)。

不过还有一种网络攻击其实比起DDOS更频繁出现,就是CC(Challenge Collapsar)攻击,一般来说是利用网站代码漏洞,不停地发大量数据包请求,造成对方服务器回应这些请求导致资源耗尽,一直到宕机崩溃。这种攻击属于第七层的网络协议,一方面在服务器层面是正常的请求,所以这种情况想根本解决问题,只能从代码入手。但是另一方面,也就可以用其他来限制他访问,例如nginx的配置上也是能稍微防一下。

nginx基本安全配置

先说一些基本安全设置,由开始发展到现在,其实nginx的安全做得比以前已经好不少,不过有些还是要强调一下。

Nginx默认是不允许列出整个目录的,不过,我们为了安全,最好还是确认这个真的关闭了,不然代码被拉走了就悲剧了。

http {

autoindex off;

}

nginx默认是会在返回的数据包中显示版本号,原本这个并不是大问题,但是被别有用心的人专门攻击这个版本的话,那就不好了,所以,我们还是隐藏好一点。

http {

server_tokens off;

}

毫无疑问,nginx是可以做访问限制的,allow就是允许访问的ip和ip段,deny就是禁止访问的ip和ip段,不过这个需要看你网站的需求,现在满天飞的家用宽带IP,谁敢说IP一直是那一个。

#设置网站根目录的访问权限

location / {

allow 192.168.1.1/24;

allow 120.76.147.159;

deny 119.23.19.240;

deny 192.168.3.1/24;

deny all;

}

所以,我们再细化一点,限制访问个别目录或文件后缀名。

#在访问uploads、images目录时,访问php|php5|jsp后缀的文件会返回403代码,也就是不给执行代码了

location ~ ^/(uploads|images)/.*\.(php|php5|jsp)$ {

allow 192.168.1.1/24;

return 403;

}

#禁止访问所有目录下的sql|log|txt|jar|war|sh|py后缀的文件,这些是什么文件就不详细说了。

location ~.*\.(sql|log|txt|jar|war|sh|py) {

deny all;

}

#如果想用户体验好一点,可以建立一个报错页面,然后让这个页面跳转到其他页面

error_page 403 http://www.example.com/errorfile/404.html;

再高级一点,判断特定条件,然后拒绝服务

#判断当http_user_agent返回的结果中包含UNAVAILABLE关键字,则返回403错误。

location / {

if ($http_user_agent ~ UNAVAILABLE) {

return 403;

}

}

再次强调,这些要跟网站实际情况相结合,要不然影响范围被扩大,造成一些莫名其妙的事,那可不是好事,不过一般403都是自己控制,比较好判断,所以最好别直接deny all。

nginx高级安全配置

访问权限控制:

想更精准控制访问权限,其实还有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;

}

这样弄好像变得有点复杂,所以还是得看需求。

---------------------------------------------------------------------------------

连接权限控制:

实际上nginx的最大连接数是worker_processes乘以worker_connections的总数。

也就是说,下面的这个配置,就是4X65535,一般来说,我们会强调worker_processes设置成和核数相等,worker_connections并没有要求。但是同时这个设置其实给了攻击者空间,攻击者是可以同时发起这么多个连接,把你服务器搞跨。所以,我们应该更合理的配置这两个参数。

user www;

worker_processes 4;

error_log /data/logs/nginx_error.log crit;

pid /usr/local/nginx/nginx.pid;

events {

use epoll;

worker_connections 65535;

}

不过,也不是完全没有办法限制,在nginx0.7开始,出了两个新的模块:

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

HttpLimitZoneModule: 限制单个 IP 的连接数

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

先看HttpLimitReqModul:

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同时访问,难免出现误伤,所以还是得多考虑。

然后再看HttpLimitZoneModule:

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;503页面的源代码:

页面即将载入….

页面即将载入

你刷新页面的速度过快。请少安毋躁,页面即将载入…

[立即重新载入]

function update()

{

window.location.reload();

}

setTimeout(“update()”,2000);

-----------------------------------------------------------------------

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

#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;

点击复制链接 与好友分享!回本站首页
上一篇:老毛桃PE盘工具木马:一款“通杀”浏览器的主页劫持大盗
下一篇:浅谈web安全之手工检测sql注入以及获得信息
相关文章
图文推荐
文章
推荐
热门新闻

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做实用的IT技术学习网站