Nginx安全配置研究



0x00 测试环境

操作系统:CentOS6.5 
Web服务器:Nginx1.4.6 
Php版本:Php5.4.26


0x01 Nginx介绍


nginx本身不能处理PHP,它只是个web服务器,当接收到请求后,如果是php请求,则发给php解释器处理,并把结果返回给客户端。nginx一般是把请求发fastcgi管理进程处理,fastcgi管理进程选择cgi子进程处理结果并返回被nginx。


nginx涉及到两个账户,一个是nginx的运行账户,一个是php-fpm的运行账户。如果访问的是一个静态文件,则只需要nginx的运行账户对文件具有读取权限;而如果访问的是一个php文件,则首先需要nginx的运行账户对文件有读取权限,读取到文件后发现是一个php文件,则转发给php-fpm,此时则需要php-fpm账户对文件具有读取权限。


0x02 研究发现的结论

1. linux下,要读取一个文件,首先需要具有对文件所在文件夹的执行权限,然后需要对文件的读取权限。
2. php文件的执行不需要文件的执行权限,只需要nginx和php-fpm运行账户的读取权限。
3. 上传木马后,能不能列出一个文件夹的内容,跟php-fpm的运行账户对文件夹的读取权限有关。
4. 木马执行命令的权限跟php-fpm的账户权限有关。
5. 如果木马要执行命令,需要php-fpm的账户对相应的sh有执行权限。
6. 要读取一个文件夹内的文件,是不需要对文件夹有读取权限的,只需要对文件夹有执行权限。


0x03 Nginx服务器涉及到的安全配置

1. Nginx.conf的配置
2. php-fpm.conf的配置
3. nginx和php-fpm的运行账户对磁盘的权限配置
4. Php.ini的配置
 
0x04 常见需要配置的操作方法
 
1. 禁止一个目录的访问
 
示例:禁止访问path目录
location ^~ /path {
deny all;
}
可以把path换成实际需要的目录,目录path后是否带有"/",带"/"只禁止访问目录,不带"/"禁止访问目录中的文件;注意要放在fastcgi配置之前。
2. 禁止php文件的访问及执行
示例:去掉单个目录的PHP执行权限
location ~ /attachments/.*\.(php|php5)?$ {
deny all;
}
示例:去掉多个目录的PHP执行权限
location ~
/(attachments|upload)/.*\.(php|php5)?$ {
deny all;
}
3. 禁止IP的访问
示例:禁止IP段的写法:
deny 10.0.0.0/24;
示例:只允许某个IP或某个IP段用户访问,其它的用户全都禁止
allow  
x.x.x.x;  
allow 10.0.0.0/24;  
deny all;
0x05 需要解决的常见问题
1. 让木马上传后不能执行
针对上传目录,在nginx配置文件中加入配置,使此目录无法解析php。
2. 让木马执行后看不到非网站目录文件
取消php-fpm运行账户对于其他目录的读取权限。
3. 木马执行后命令不能执行
取消php-fpm账户对于sh的执行权限。
4. 命令执行后权限不能过高
Php-fpm账户不要用root或者加入root组。
 
0x06 Nginx安全配置方案
 
1. 修改网站目录所有者为非php-fpm运行账户,此处修改所有者为root。
 
命令:
chown -R root:root html/ 
 
Nginx安全配置研究
 
2. 修改nginx及php-fpm的运行账户及组为nobody
 
nginx.conf
 
Nginx安全配置研究
 
Php-fpm.conf
 
Nginx安全配置研究
 
3. 取消nobody对所有目录的的读取权限,然后添加对网站目录的读取权限
 
命令:
chmod o-r –R / 
chmod o+r –R html/
 
4. 取消nobody对于/bin/sh 的执行权限
chmod 776 /bin/sh
 
5. 确认网站目录对于nobody的权限为可读可执行,对网站文件的权限为可读
 
6. 对于上传目录或者写入写文件的目录添加nobody的写入权限
 
7. 配置nginx.conf 对于上传目录无php的执行权限
 
8. 配置nginx.conf禁止访问的文件夹,如后台,或者限制访问ip
 
9. 配置nginx.conf禁止访问的文件类型,如一些txt日志文件
 
 

nginx配置错误而导致目录遍历漏洞

漏洞描述:nginx是一款高性能的web服务器,使用非常广泛,其不仅经常被用作反向代理,也是一个 IMAP/POP3/SMTP 代理服务器。 Nginx 
是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 
站点开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。
 
在nginx中开启autoindex,配置不规范而造成目录遍历漏洞。
 
配置如下:
 
1.    server {
 
2.    listen    80;
 
3.    server_name sebug.net;
 
4.    index index.htm index.html;
 
5.    root  /home/wwwroot/www;
 
6.    access_log off;
 
7.    location /paper {
 
8.    alias /home/wwwroot/paper/;
 
9.    autoindex on;
 
10.   }
 
11.   }
 
注意 这里/home/wwwroot/paper/;  有个/
 
当你浏览http://sebug.net/paper/,正常情况应该遍历/home/wwwroot/paper/这个目录,但是如果访问http://sebug.net/paper../, 
这个的话就会遍历/home/wwwroot/这个目录了<* 参考
 
http://luoq.net/ais/1191/
 
*>
 
安全建议:sebug建议:
 
使用如下配置
 
location /paper {
 
alias /home/wwwroot/paper;
 
 
location /paper/ {
 
alias /home/wwwroot/paper/;
 
 
 

使用Nginx防御CC攻击

本文主要介绍了有关使用Nginx防御CC攻击的一些配置。CC攻击针对的是服务器上面的内存和CPU资源,因此通常会找到一些比较高消耗的接口,例如search.php之类的需要大量sql查询的接口。因此,明白了这一点,我们就很好防御了,主要是针对单个ip地址的连接数和请求php文件的密度来控制的。

我们主要用到的是Nginx中提供的两个limit模块:

  
  
  1. ngx_http_limit_conn_module  
  2. ngx_http_limit_req_module 

一、白名单

首先这两个模块是支持白名单的,就是可能有某些IP地址,我们是不需要进行限制的,比如可能会是搜索引擎啦什么的或者自己的IP,因此需要设置一个白名单,不需要的可跳过本步。具体方法:

在HTTP段中插入如下格式内容,声明白名单IP

  
  
  1. http{    
  2. .......    
  3. geo $limited{    
  4.       default 1;    
  5.       #公司    
  6.      119.123.5.0/24 0;   
  7.   }    
  8. .........    
  9. }   

geo指令定义了一个白名单$limited变量,默认值为1,如果客户端IP在上面的范围内,$limited的值为0。

然后紧跟在上面内容后使用map指令映射搜索引擎客户端的ip为空串,如果不是白名单IP就显示本身真实的IP,这样搜索引擎iIP就不能存到limit模块的内存session中,所以不会限制白名单的IP访问。

  
  
  1. map $limited $limit {    
  2.                   1 $binary_remote_addr;   
  3.                   0 "";    
  4.         }  

二、访问频率限制

访问频率限制使用到的是ngx_http_limit_req_module,需要在两个地方配置,首先在HTTP段中,声明好这个模块一些参数,如果有设置白名单,设置如下

  
  
  1. http{    
  2. ...    
  3. limit_req_zone $limit zone=one:10m rate=20r/m; ##平均20r/m 每分钟20个请求    
  4. ...    
  5. }   

如果没有配置白名单,所有来访IP都会限制,配置如下

  
  
  1. http{    
  2. ...    
  3. limit_req_zone $binary_remote_addr zone=one:10m rate=20r/m; ##平均20r/m 每分钟20个请求  
  4. ...   
  5. }   

解释一下上面的参数,第一个代表的是需要限制的ip群,这个很好理解,第二个zone=one表示这个limit_zone的名字叫做one,后面的使用中可以用这个one来进行指代,后面的15m,代表为这个zone分配10m的内存,1m可以保存16000的$binary_remote_addr。最后一个是频率,如果要按秒来算可以设置20r/s这样。

最后是配置到Nginx的php的解析段

  
  
  1. location ~ \.php$ {    
  2. ...    
  3. limit_req zone=one burst=5 nodelay;   
  4. ...    
  5. }   

指定了使用名字为one的zone,然后缓冲队列为5,无延迟,如果不设置无延迟,访问会卡住。

三、访问连接限制

访问连接限制使用到的是ngx_http_limit_conn_module,也是需要在两个地方配置,首先在HTTP段中,声明好这个模块一些参数,如果有设置白名单,设置如下

  
  
  1. http{   
  2. ...    
  3. limit_conn_zone $limit zone=addr:10m;    
  4. ...    
  5. }   

如果没有配置白名单,所有来访IP都会限制,配置如下

  
  
  1. view sourceprint?http{    
  2. ...    
  3. limit_conn_zone $binary_remote_addr zone=addr:10m;   
  4. ...    
  5. }   

参数的意思跟上面的差不多也就不多解释了。

后面的就是在server段中进行设置了,可以具体到某个目录什么的了

  
  
  1. server {    
  2.     location /download/ {   
  3.         limit_conn addr 5;    
  4.     }  

大功告成,打完收工,记得要nginx -s reload一下哦~


 
【编辑推荐】
 
 
 
  1. 20个Nginx Web服务器最佳安全实践
  2. nginx文件类型错误解析漏洞
  3. nginx配置错误而导致目录遍历漏洞
  4. 设置安全的nginx+PHP网站目录权限
  5. 使用Nginx防御CC攻击

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
众所周知,人工智能是当前最热门的话题之一, 计算机技术与互联网技术的快速发展更是将对人工智能的研究推向一个新的高潮。 人工智能是研究模拟和扩展人类智能的理论与方法及其应用的一门新兴技术科学。 作为人工智能核心研究领域之一的机器学习, 其研究动机是为了使计算机系统具有人的学习能力以实现人工智能。 那么, 什么是机器学习呢? 机器学习 (Machine Learning) 是对研究问题进行模型假设,利用计算机从训练数据中学习得到模型参数,并最终对数据进行预测和分析的一门学科。 机器学习的用途 机器学习是一种通用的数据处理技术,其包含了大量的学习算法。不同的学习算法在不同的行业及应用中能够表现出不同的性能和优势。目前,机器学习已成功地应用于下列领域: 互联网领域----语音识别、搜索引擎、语言翻译、垃圾邮件过滤、自然语言处理等 生物领域----基因序列分析、DNA 序列预测、蛋白质结构预测等 自动化领域----人脸识别、无人驾驶技术、图像处理、信号处理等 金融领域----证券市场分析、信用卡欺诈检测等 医学领域----疾病鉴别/诊断、流行病爆发预测等 刑侦领域----潜在犯罪识别与预测、模拟人工智能侦探等 新闻领域----新闻推荐系统等 游戏领域----游戏战略规划等 从上述所列举的应用可知,机器学习正在成为各行各业都会经常使用到的分析工具,尤其是在各领域数据量爆炸的今天,各行业都希望通过数据处理与分析手段,得到数据中有价值的信息,以便明确客户的需求和指引企业的发展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值