阿里云
阿里云多端小程序中小企业获客首选
发表主题 回复主题
  • 11476阅读
  • 4回复

[Web服务器]网站安全配置(Nginx)防止网站被攻击(包括使用了CDN加速之后的配置方法)

级别: 论坛版主
发帖
9349
云币
14165
— 本帖被 千鸟 执行加亮操作(2015-11-14) —
^4\0, >  
网站被攻击是一个永恒不变的话题,网站攻击的方式也是一个永恒不变的老套路。找几百个电脑(肉鸡),控制这些电脑同时访问你的网站,超过你网站的最大承载能力,然后你就瘫了。方法虽然老土,但却一直都很管用,就像怎么打败美帝国主义,最简单的方法就是 13 亿中国人都移民去美帝,吃他的、用他的、花他的,直接能让美帝破产,压根不需要用武力。土方法,然解决这个问题的方法也土,就是设置一个海关,控制进入的人口数量,只要不让你进来太多人,你就吃不穷他。 网站也一样,只要控制能够进入的访问数量,你就攻击不了我。 L 9cXgd  
Tl]yl$  
5^ ubXA  
Nginx 有 2 个模块用于控制访问“数量”和“速度”,简单的说,控制你最多同时有 多少个访问,并且控制你每秒钟最多访问多少次, 你的同时并发访问不能太多,也不能太快,不然就“杀无赦”。 >X"\+7bw  
_;S~nn  
 fWs*u[S  
HttpLimitZoneModule    限制同时并发访问的数量 H`q[!5~8  
Q:y'G9b  
$cm 9xW&  
HttpLimitReqModule     限制访问数据,每秒内最多几个请求 '`W6U]7>  
U^)`_\/;?  
lU$0e09  
请先检查你的 nginx 是否有这 2 个模块,否则~~~额~~~没戏,一边墙角哭去吧~~~ W* v3B.  
Vr %ef:uVV  
r/P}j4)b7  
9GTp};Kg  
1. 普通配置 @*=5a (#  
啥叫普通配置 ? 就是说,你的服务器直接面向普通用户,例如    普通用户IE浏览器  ——->  你的服务器,这也是你能 Google 到的 99% 的Nginx 安全配置例子,基本上就是抄了 Nginx 官方的一个 Sample。考虑到文章的完整性,我这里也就重复一下这个被 千百个网站 已经重复过无数次的 配置 ]TcQGW@'  
$2}%3{<j  
Rs"G8Q9Q  
普通用户IE浏览器  ——->  你的服务器      由于普通用户直接访问你的服务器,所以你可以直接得到用户的 IP 地址, 而我们的限制就是基于对 来源IP 地址的访问限制 6P,uy;PJ  
#ZnNJ\6  
@^g~F&Ta  
Nginx 里面设置一个限制 "oF)u1_?  
  1. ## 用户的 IP 地址 $binary_remote_addr 作为 Key,每个 IP 地址最多有 50 个并发连接
  2. ## 你想开 几千个连接 刷死我? 超过 50 个连接,直接返回 503 错误给你,根本不处理你的请求了
  3. limit_conn_zone $binary_remote_addr zone=TotalConnLimitZone:10m ;
  4. limit_conn  TotalConnLimitZone  50;
  5. limit_conn_log_level notice;
  6. ## 用户的 IP 地址 $binary_remote_addr 作为 Key,每个 IP 地址每秒处理 10 个请求
  7. ## 你想用程序每秒几百次的刷我,没戏,再快了就不处理了,直接返回 503 错误给你
  8. limit_req_zone $binary_remote_addr zone=ConnLimitZone:10m  rate=10r/s;
  9. limit_req_log_level notice;
  10. ## 具体服务器配置
  11. server {
  12.         listen   80;
  13.         location ~ \.php$ {
  14.                 ## 最多 5 个排队, 由于每秒处理 10 个请求 + 5个排队,你一秒最多发送 15 个请求过来,再多就直接返回 503 错误给你了
  15.                 limit_req zone=ConnLimitZone burst=5 nodelay;
  16.                 fastcgi_pass   127.0.0.1:9000;
  17.                 fastcgi_index  index.php;
  18.                 include        fastcgi_params;
  19.         }        
  20. }
91q  
这样一个最简单的服务器安全限制访问就完成了,这个基本上你 Google 一搜索能搜索到  90% 的网站都是这个例子,而且还强调用“$binary_remote_addr”可以节省内存之类的废话 JB.U&  
dq'f >S z}  
p:0X3?IG3  
2. 你 Google 不到的配置 N|Xm{@C  
很多时候,我们的网站不是简单的  普通用户IE浏览器  ——->  你的服务器  的结构, 考虑到网络访问速度问题,我们中间可能会有各种 网络加速(CDN)。以本网站  www.bzfshop.net 为例,考虑到网站的安全性和访问加速,我们的架构是: N&Ho$,2s  
SZR`uS  
普通用户浏览器  —–>  360网站卫士加速(CDN,360防 CC,DOS攻击) ——>  阿里云加速服务器(我们自己建的CDN,阿里盾) —-> 源服务器(PHP 程序部署在这里,iptables, nginx 安全配置) *8)va  
@tD (<*f+  
可以看到,我们的网站中间经历了好几层的透明加速和安全过滤, 这种情况下,我们就不能用上面的“普通配置”。因为上面基于  源IP的限制 结果就是,我们把 360网站卫士  或者  阿里云盾 给限制了,因为这里“源IP”地址不再是  普通用户的IP,而是中间  网络加速服务器 的IP地址。我们需要限制的是 最前面的普通用户,而不是中间为我们做加速的 加速服务器。 WNQ<XB qAw  
L2~'Z'q  
r}D#(G$  
2.1 现在我们面对的最直接的问题就是, 经过这么多层加速,我怎么得到“最前面普通用户的 IP 地址” U)aftH *Pk  
(这里只说明结果,不了解 Http 协议的人请自行 Google 或者 Wikipedia  http://zh.wikipedia.org/zh-cn/X-Forwarded-For  ) S)4p'cUwq  
$p$p C/:%  
当一个 CDN 或者透明代理服务器把用户的请求转到后面服务器的时候,这个 CDN 服务器会在 Http 的头中加入 一个记录 Y| ch ;  
_jg tZ  
X-Forwarded-For :  用户IP, 代理服务器IP _u~0t`f~  
uxh>r2Xr=  
如果中间经历了不止一个 代理服务器,像 www.bzfshop.net 中间建立多层代理之后,这个 记录会是这样 $z 5kA9  
6h %rt]g  
X-Forwarded-For :  用户IP, 代理服务器1-IP, 代理服务器2-IP, 代理服务器3-IP, …. WBm)Q#1:  
y=EVpd  
可以看到经过好多层代理之后, 用户的真实IP 在第一个位置, 后面会跟一串 中间代理服务器的IP地址,从这里取到用户真实的IP地址,针对这个 IP 地址做限制就可以了, jh`[ Y7RJO  
2.2 经过多层CDN之后取得原始用户的IP地址,nginx 配置 9tVV?Q@)  
  1. map $http_x_forwarded_for  $clientRealIp {
  2.         ## 没有通过代理,直接用 remote_addr
  3.         ""        $remote_addr;  
  4.         ## 用正则匹配,从 x_forwarded_for 中取得用户的原始IP
  5.         ## 例如   X-Forwarded-For: 202.123.123.11, 208.22.22.234, 192.168.2.100,...
  6.         ## 这里第一个 202.123.123.11 是用户的真实 IP,后面其它都是经过的 CDN 服务器
  7.         ~^(?P<firstAddr>[0-9\.]+),?.*$    $firstAddr;
  8. }
  9. ## 通过 map 指令,我们为 nginx 创建了一个变量 $clientRealIp ,这个就是 原始用户的真实 IP 地址,
  10. ## 不论用户是直接访问,还是通过一串 CDN 之后的访问,我们都能取得正确的原始IP地址
f:J-X~T_f  
2.3 测试、测试 i27)c)\BM  
Ud e?[6  
很多时候,你在网上搜到一堆配置,你照着做了,但是你怎么知道这个配置真的正确 ?是的,我们需要自己做一个有效的真实的测试,验证它是正确的之后才真的采用它 ?#z<<FR  
Nginx 这种配置怎么测试呢? 用 Echo 模块,如果你知道 Nginx 这个模块的话。 VYO1qj  
www.bzfshop.net 网站为例, 我们首先测试这个 $clientRealIp 是否真的是我们客户机的 IP 地址,在网站上增加一个访问地址,比如  www.bzfshop.net/nginx-test,配置如下: PB8g4-?p6  
  1. server {
  2.         listen   80;
  3.         server_name  www.bzfshop.net;
  4.         ## 当用户访问 /nginx-test 的时候,我们输出 $clientRealIp 变量,看看这个变量
  5.         ## 值是不是真的 用户源IP 地址
  6.         location /nginx-test {
  7.                 echo $clientRealIp;
  8.         }
  9. }
R:R<Xt N`5  
RgQs`aI  
接下来,用你的浏览器访问  www.bzfshop.net/nginx-test,这个时候会弹出框下载一个文件 nginx-test,下载完成用 notepad++ 打开,里面就是一个 IP 地址 N#t`ZC&m'  
V'MY+#  
Fkq^2o ]  
访问 www.ip138.com ,看看这个里面记录的IP地址是否和 ip138 侦测的IP 一致? 0(:SEiz6s  
h8(>$A-  
1+XM1(|c`  
通过这种方式,你就可以对 Nginx 的一些复杂配置做有效的测试。 M6Np!0G  
a_?b <  
RwOOe7mv  
经过测试,我们确认 通过多层CDN 之后,$clientRealIp 仍然是有效的原始用户IP地址 ; D/6e6  
CS(2bj^6 D  
xSSEDfq  
2.4 根据用户的真实 IP 做连接限制 TO"Md["GI  
下面是修改之后的 Nginx 配置: NVsaV;u  
  1. 接下来,用你的浏览器访问  www.bzfshop.net/nginx-test,这个时候会弹出框下载一个文件 nginx-test,下载完成用 notepad++ 打开,里面就是一个 IP 地址
  2. 访问 www.ip138.com ,看看这个里面记录的IP地址是否和 ip138 侦测的IP 一致?
  3. 通过这种方式,你就可以对 Nginx 的一些复杂配置做有效的测试。
  4. 经过测试,我们确认 通过多层CDN 之后,$clientRealIp 仍然是有效的原始用户IP地址
  5. 2.4 根据用户的真实 IP 做连接限制
  6. 下面是修改之后的 Nginx 配置:
e6J^J&`|4  
C])s'XTs  
后记: /sT?p=[.  
通过上面的配置,现在你的网站可以完美的配合任何 网络加速服务(CDN)的使用,并且同时能保证对“最终用户的限制”。 LyWY\K a  
} e+`Kxy  
[w|Klq5  
写这篇文章的原因是因为 我们最近把 www.bzfshop.net 迁移到  360网站卫士(wangzhan.360.cn)  上了,使用 360网站卫士 做我们的加速服务器和安全保护,同时我们网站自身 nginx 本身也配置了防止攻击的安全措施, 结果我们的安全配置把  360网站卫士的加速服务器给 盾 掉了,因为所有用户的访问都通过加速服务器过来,很明显加速服务器超过了我们的“连接限制”。经过上面的改造之后,现在我们的 Nginx 安全配置能够和 360加速服务器 完美配合,同时能对终端的用户访问作限制。 |('o g*$  
xz.Jmv  
jlU6keZh`  
写下这些文字,希望对看到这篇文章的朋友会有用。 9q_{_%G%  
PM#3N2?|E  
fi%i 2Wy  
本文来自:网站安全配置(Nginx)防止网站被攻击(包括使用了CDN加速之后的配置方法) [YHtBM:y  
F@f4-NR>  
[ 此帖被ivmmff在2015-08-09 12:11重新编辑 ]
本帖最近评分记录: 1 条评分 云币 +10
千鸟 云币 +10 你是我的偶像 2015-11-14
级别: 新人
发帖
3
云币
3
只看该作者 沙发  发表于: 2015-11-13
Re网站安全配置Nginx防止网站被攻击(包括使用了CDN加速之后的配置方
好文章!!
级别: 科学怪人
发帖
9441
云币
14683
只看该作者 板凳  发表于: 2015-11-13
Re:网站安全配置(Nginx)防止网站被攻击(包括使用了CDN加速之后的配置方 ..
感谢分享
级别: 分析狮
发帖
1559
云币
5022
只看该作者 地板  发表于: 2015-11-14
Re:网站安全配置(Nginx)防止网站被攻击(包括使用了CDN加速之后的配置方 ..
赞一个~
级别: 菜鸟
发帖
51
云币
65
只看该作者 4楼 发表于: 2016-04-20
Re网站安全配置Nginx防止网站被攻击(包括使用了CDN加速之后的配置方
求指点
发表主题 回复主题
« 返回列表上一主题下一主题

限100 字节
如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
 
验证问题: ECS是阿里云提供的什么服务? 正确答案:云服务器
上一个 下一个
      ×
      全新阿里云开发者社区, 去探索开发者的新世界吧!
      一站式的体验,更多的精彩!
      通过下面领域大门,一起探索新的技术世界吧~ (点击图标进入)