NGINX安全配置和限制访问
说起网络攻击,可能很多人只知道大名鼎鼎的DDOS攻击,这种攻击廉价且效果出众,直接通过第四层网络协议用他的带宽把你的带宽顶掉,造成网路阻塞,防不胜防,就连腾讯这种大鳄公司也被大流量DDOS搞过焦头烂额。暂时的解决方法只有三种,第一种就是你要够有钱,买强大的高级防火墙,或者使用的带宽足够大,无视这些网络流量。第二种是技术足够强,例如个别有技术的大牛公司(阿里),用类如DPDK的高效数据包处理驱动,开发出流量清洗服务,把垃圾网络包过滤掉,不过同时也会影响正常的网络包,增加延时。第三种就是钱不多的公司多数使用的方案,换ip(废话)。不过,现在有很多公司推出自己的流量清洗服务,细化到按小时收费,也是相当灵活了,按需购买。
不过还有一种网络攻击其实比起DDOS更频繁出现,就是CC(Challenge Collapsar)攻击,一般来说是利用网站代码漏洞,不停地发大量数据包请求,造成对方服务器回应这些请求导致资源耗尽,一直到宕机崩溃。这种攻击属于第七层的网络协议,一方面在服务器层面是正常的请求,所以这种情况想根本解决问题,只能从代码入手。但是另一方面,也就可以用其他来限制他访问,例如nginx的配置上也是能稍微防一下。
nginx基本安全配置
先说一些基本安全设置,由开始发展到现在,其实nginx的安全做得比以前已经好不少,不过有些还是要强调一下。
Nginx默认是不允许列出整个目录的,不过,我们为了安全,最好还是确认这个真的关闭了,不然代码被拉走了就悲剧了。
http {
autoindex off;
}
nginx默认是会在返回的数据包中显示版本号,原本这个并不是大问题,但是被别有用心的人专门攻击这个版本的话,那就不好了,所以,我们还是隐藏好一点。
http {
server_tokens off;
}
其他限制访问请求参数
http {
#设置客户端请求头读取超时时间,超过这个时间还没有发送任何数据,Nginx将返回“Request time out()”错误
client_header_timeout ;
#设置客户端请求主体读取超时时间,超过这个时间还没有发送任何数据,Nginx将返回“Request time out()”错误
client_body_timeout ;
#上传文件大小限制
client_max_body_size 100m;
#指定响应客户端的超时时间。这个超过仅限于两个连接活动之间的时间,如果超过这个时间,客户端没有任何活动,Nginx将会关闭连接。
send_timeout ;
#设置客户端连接保持会话的超时时间,超过这个时间,服务器会关闭该连接。
keepalive_timeout ;
}
毫无疑问,nginx是可以做访问限制的,allow就是允许访问的ip和ip段,deny就是禁止访问的ip和ip段,不过这个需要看你网站的需求,现在满天飞的家用宽带IP,谁敢说IP一直是那一个。
#设置网站根目录的访问权限
location / {
allow 192.168.1.1/;
allow 120.76.147.159;
deny 119.23.19.240;
deny 192.168.3.1/;
deny all;
}
所以,我们再细化一点,限制访问个别目录或文件后缀名。
#在访问uploads、p_w_picpaths目录时,访问php|php5|jsp后缀的文件会返回403代码,也就是不给执行代码了
location ~ ^/(uploads|p_w_picpaths)/.*\.(php|php5|jsp)$ {
allow 192.168.1.1/;
return ;
}
#禁止访问所有目录下的sql|log|txt|jar|war|sh|py后缀的文件,这些是什么文件就不详细说了。
location ~.*\.(sql|log|txt|jar|war|sh|py) {
deny all;
}
#有时候,有些访问记录不想保存到日志里面,例如静态图片
location ~ .*\.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF|png)$ {
access_log off;
}
#如果想用户体验好一点,可以建立一个报错页面,然后让这个页面跳转到其他页面
error_page http://www.example.com/errorfile/404.html;
再高级一点,判断特定条件,然后拒绝服务
#判断当http_user_agent返回的结果中包含UNAVAILABLE关键字,则返回403错误。
location / {
if ($http_user_agent ~ UNAVAILABLE) {
return ;
}
}
再次强调,这些要跟网站实际情况相结合,要不然影响范围被扩大,造成一些莫名其妙的事,那可不是好事,不过一般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/;
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 ;
error_log /data/logs/nginx_error.log crit;
pid /usr/local/nginx/nginx.pid;
events {
use epoll;
worker_connections ;
}
不过,也不是完全没有办法限制,在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= 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 ;
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页面的源代码:
<html>
<head>
<title>页面即将载入….</title>
<meta http-equiv=content-type c>
<META NAME=”ROBOTS” C>
</head>
<body bgcolor=”#FFFFFF”>
<table cellpadding=”″ cellspacing=”″ border=”″ width=”″ align=”center” height=”%”>
<tr align=”center” valign=”middle”>
<td>
<table cellpadding=”″ cellspacing=”″ border=”″ width=”%” align=”center” style=”font-family:
Verdana, Tahoma; color: #; font-size: 11px”>
<tr>
<td valign=”middle” align=”center” bgcolor=”#EBEBEB”>
<br /><b style=”font-size: 16px”>页面即将载入</b>
<br /><br />你刷新页面的速度过快。请少安毋躁,页面即将载入…
<br /><br />[<a href="JavaScript:window.location.reload();"><font color=#>立即重新载入</font></a>]
<br /><br />
</td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html>
<SCRIPT language=javascript>
function update()
{
window.location.reload();
}
setTimeout(“update()”,);
</script>
-----------------------------------------------------------------------
上述的配置,是全网通用得,有时候难免有误伤,那怎么办呢,可以设置白名单制度。
#geo指令定义了一个白名单$whiteiplist变量,默认值为1,
#如果客户端ip在上面的范围内,$whiteiplist的值为0。
geo $whiteiplist {
default ;
10.11.15.161 ;
127.0.0.1/ ;
}
#使用map指令映射上面geo匹配的客户端的ip为空串,如果不是就显示本身真实的ip,
#这样匹配的ip就不能存到limit_req_zone内存session中,所以不会被限制访问
map $whiteiplist $limit {
$binary_remote_addr;
"";
}
#然后再制定这个$limit变量来设置规则,白名单制度就建立起来了
limit_req_zone $limit zone=one:10m rate=10r/s;
limit_conn_zone $limit zone=addr:10m;
NGINX安全配置和限制访问的更多相关文章
- nginx https配置后无法访问,可能防火墙在捣鬼
同事发现nginx配置后https 无法访问,我帮忙解决的时候从以下出发点 1.防火墙未开放443端口 2.配置出错 1 2 3 于是就 netstat -anp 查看防火墙开的端口 发现已经在监听了 ...
- nginx修改nginx.conf配置可以https访问
修改nginx.conf,参照如下更改配置server { listen 443; server_name abc.com; // 访问域名 ssl on; root /var/www/bjubi.c ...
- docker安装nginx并配置通过https访问
1. 下载最新的nginx的docker image docker pull nginx:latest 创建挂载路径 2.准备nginx需要的文件 nginx的配置文件 首先是nginx.conf文件 ...
- nginx 安全配置和限制访问
nginx基本安全配置 配置ssl证书 listen 443 ssl; ssl_certificate /usr/local/nginx/conf/server.crt; ssl_certificat ...
- 在nginx中配置ip直接访问的默认站点
一台机子部署多个网站,我们直接访问ip (外网内网都一样)提示无法访问或404. 因为有多个网站,我们想指定某个网站为IP访问默认的网站,如何操作呢? 解:在Listen ip:port; 这个指令行 ...
- Nginx缓存配置之手动清除缓存
访问我的博客 前言 前文介绍了利用 nginx 的 nginx_ngx_cache_purge 模块来实现缓存功能,并设置了缓存时间为一天. 但是如果前端修改了页面,比如首页,由于 Nginx 缓存的 ...
- Ubuntu Nginx下配置网站ssl实现https访问
最近在看 HTTP权威指南 看到介绍了HTTPS的ssl,自己就动手测试了下,将步骤记录下 HTTPS简介 什么是HTTPS?百科是这样解释的.HTTPS(全称:Hyper Text Trans ...
- 【转】Linux下nginx配置https协议访问的方法
一.配置nginx支持https协议访问,需要在编译安装nginx的时候添加相应的模块--with-http_ssl_module 查看nginx编译参数:/usr/local/nginx/sbin/ ...
- linux nginx 配置ssl证书访问
http://www.linuxidc.com/Linux/2013-08/88271.htm 一.什么是 SSL 证书,什么是 HTTPSSSL 证书是一种数字证书,它使用 Secure Socke ...
随机推荐
- Kali Linux 2019.4中文乱码解决
1.先换源deb http://mirrors.aliyun.com/kali kali-rolling main non-free contribdeb-src http://mirrors.ali ...
- maven install
1. install maven under ubuntu apt install maven 2 speed up package download vim ~/.m2/settings.xml & ...
- C++函数声明后面加throw()的作用
原文地址:https://blog.csdn.net/to_baidu/article/details/53763683 C++里面为什么有时候在函数声明的时候在后面加throw()关键字? 解释: ...
- Cogs 727. [网络流24题] 太空飞行计划(最大权闭合子图)
[网络流24题] 太空飞行计划 ★★☆ 输入文件:shuttle.in 输出文件:shuttle.out 简单对比 时间限制:1 s 内存限制:128 MB [问题描述] W 教授正在为国家航天中心计 ...
- Cocos CreatorUI系统下
若本号内容有做得不到位的地方(比如:涉及版权或其他问题),请及时联系我们进行整改即可,会在第一时间进行处理. 请点赞!因为你们的赞同/鼓励是我写作的最大动力! 欢迎关注达叔小生的简书! 这是一个有质量 ...
- presto集成kerberos以及访问集成了kerberos的hive集群
1.创建主体 注: 192.168.0.230 为单节点集群 192.168.4.50为kdc服务器 192.168.0.9为客户端 1.1.Kdc服务器创建主体 # kadmin.local -q ...
- iwms后台编辑器无法粘贴word格式的解决方法
iwms后台编辑器用的是tiny_mce,默认会自动过滤word粘贴中的格式,以减小数据库的占用,但在word中辛苦做的字体和格式都不见了,可采用下方法关闭编辑器的自动清除格式功能. 编辑文件:\ti ...
- 第12组 Beta冲刺(5/5)
Header 队名:To Be Done 组长博客 作业博客 团队项目进行情况 燃尽图(组内共享) 展示Git当日代码/文档签入记录(组内共享) 注: 由于GitHub的免费范围内对多人开发存在较多限 ...
- mysql 常用字符串操作
SET @L=16, @i=3;SELECT *,CONCAT( LEFT(tag2,@i-1) ,'W', RIGHT(tag2,@L-@i)) from tb_main LIMIT 1,10;
- MYSQL事务的开启与提交
MYSQL 事务处理主要有两种方法: 1.用 BEGIN, ROLLBACK, COMMIT来实现 BEGIN 开始一个事务 ROLLBACK 事务回滚 COMMIT 事务确认 2.直接用 SET 来 ...