Nginx安全配置研究
x00 测试环境

|
1
2
3
|
操作系统:CentOS6.5Web服务器:Nginx1.4.6Php版本: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
2
3
4
5
6
|
1. linux下,要读取一个文件,首先需要具有对文件所在文件夹的执行权限,然后需要对文件的读取权限。2. php文件的执行不需要文件的执行权限,只需要nginx和php-fpm运行账户的读取权限。3. 上传木马后,能不能列出一个文件夹的内容,跟php-fpm的运行账户对文件夹的读取权限有关。4. 木马执行命令的权限跟php-fpm的账户权限有关。5. 如果木马要执行命令,需要php-fpm的账户对相应的sh有执行权限。6. 要读取一个文件夹内的文件,是不需要对文件夹有读取权限的,只需要对文件夹有执行权限。 |
0x03 Nginx服务器涉及到的安全配置
|
1
2
3
4
|
1. Nginx.conf的配置2. php-fpm.conf的配置3. nginx和php-fpm的运行账户对磁盘的权限配置4. Php.ini的配置 |
0x04 常见需要配置的操作方法
1. 禁止一个目录的访问
示例:禁止访问path目录
|
1
2
3
|
location ^~ /path {deny all;} |
可以把path换成实际需要的目录,目录path后是否带有"/",带"/"只禁止访问目录,不带"/"禁止访问目录中的文件;注意要放在fastcgi配置之前。
2. 禁止php文件的访问及执行
示例:去掉单个目录的PHP执行权限
|
1
2
3
|
location ~ /attachments/.*\.(php|php5)?$ {deny all;} |
示例:去掉多个目录的PHP执行权限
|
1
2
3
4
|
location ~/(attachments|upload)/.*\.(php|php5)?$ {deny all;} |
3. 禁止IP的访问
示例:禁止IP段的写法:
|
1
|
deny 10.0.0.0/24; |
示例:只允许某个IP或某个IP段用户访问,其它的用户全都禁止
|
1
2
3
4
|
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。
命令:
|
1
|
chown -R root:root html/ |

2. 修改nginx及php-fpm的运行账户及组为nobody
nginx.conf

Php-fpm.conf

3. 取消nobody对所有目录的的读取权限,然后添加对网站目录的读取权限
命令:
|
1
2
|
chmod o-r –R / chmod o+r –R html/ |
4. 取消nobody对于/bin/sh 的执行权限
|
1
|
chmod 776 /bin/sh |
5. 确认网站目录对于nobody的权限为可读可执行,对网站文件的权限为可读
6. 对于上传目录或者写入写文件的目录添加nobody的写入权限
7. 配置nginx.conf 对于上传目录无php的执行权限
8. 配置nginx.conf禁止访问的文件夹,如后台,或者限制访问ip
9. 配置nginx.conf禁止访问的文件类型,如一些txt日志文件
Nginx安全配置研究的更多相关文章
- Nginx源码研究五:NGINX的配置信息管理
配置信息是nginx系统重要的组成部分,配置信息的使用,实际上包含两层,一层是用户针对参数定义了值,例如下面nginx参数文件中的 keepalive_timeout 65,还有一部分是用户没有定义值 ...
- 高性能Web服务器Nginx的配置与部署研究(13)应用模块之Memcached模块+Proxy_Cache双层缓存模式
通过<高性能Web服务器Nginx的配置与部署研究——(11)应用模块之Memcached模块的两大应用场景>一文,我们知道Nginx从Memcached读取数据的方式,如果命中,那么效率 ...
- 高性能Web服务器Nginx的配置与部署研究(7)核心模块之主模块的非测试常用指令
1. error_log 含义:指定存储错误日志的文件 语法:error_log <file> [debug|info|notice|warn|error|crit] 缺省:${prefi ...
- 高性能Web服务器Nginx的配置与部署研究(4)Nginx常用命令
1. 启动 Nginx poechant@ubuntu:sudo ./sbin/nginx 2. 停止 Nginx poechant@ubuntu:sudo ./sbin/nginx -s stop ...
- Nginx安全配置
nginx本身不能处理PHP,它只是个web服务器,当接收到请求后,如果是php请求,则发给php解释器处理,并把结果返回给客户端.nginx一般是把请求发fastcgi管理进程处理,fastcgi管 ...
- Nginx源码研究七:nginx的location指令分析
在nginx的配置文件nginx.conf中,我们在配置server的时候,会配置一下location指令,这个location指令是提供给用户来配置对于符合指令的http请求,采用该指令内部的处理方 ...
- Nginx 参数配置相关
Nginx参数配置相关 by:授客 QQ:1033553122 目的: 对Nginx配置的点滴学习总结,主要目的在于分析Nginx与性能相关的一些参数设置,以便性能调优时选择最优配置 环境: $ ...
- nginx中配置404错误页面的教程
什么是404页面如果网站出了问题,或者用户试图访问一个并不存在的页面时,此时服务器会返回代码为404的错误信息,此时对应页面就是404页面.404页面的默认内容和具体的服务器有关.如果后台用的是NGI ...
- 如何在Nginx下配置PHP程序环境
1.nginx与PHP的关系 首先来看nginx与php的关系, FastCGI的关系(而不是像apache那样安装成nginx的模块) FastCGI的意思是, 快速的通用网关接口:CGI Comm ...
随机推荐
- 静态方法被override
其实这并不是真正意义上的java override,因为如果在子类的方法上面加上@override编译不通过 而且如果使用父类引用指向子类实例,那么调用被改写的子类和父类都有的静态方法,执行的还是父类 ...
- 更新安装xcode7插件
mkdir -p ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-inscurl -fsSL https://raw.github ...
- Chapter 2: A Simple Servlet Container
一.这一章从头构建一个简单的Servlet容器,可以处理Servlet和静态资源(如html文件/图片等). 要处理Servlet,必须遵循javax.servlet.Servlet规范,而处理静态资 ...
- C# virtual和abstract的
virtual和abstract都是用来修饰父类的,通过覆盖父类的定义,让子类重新定义. 它们有一个共同点:如果用来修饰方法,前面必须添加public,要不然就会出现编译错误:虚拟方法或抽象方法是不能 ...
- HDU5441 Travel 并查集
http://acm.hdu.edu.cn/showproblem.php?pid=5441 无向图,n个点,m条带权边,q次询问,给出数值d,点a可以到点b当且仅当存在一条路线其中最大的权值不超过d ...
- 【大胃王】2013暴食女王巅峰战(安吉拉x三宅x正司x木下)熟肉+高能
一边说着“不可以还没试就先放弃”,一边认真吃饭的女生真的让人抵抗不了啊. http://www.bilibili.com/video/av2395980/
- HDU 5820 (可持久化线段树)
Problem Lights (HDU 5820) 题目大意 在一个大小为50000*50000的矩形中,有n个路灯.(n<=500000) 询问是否每一对路灯之间存在一条道路,使得长度为|x1 ...
- C#基础指针类型
在C#的不安全的代码书写中,类型可以是指针类型.值类型或引用类型. 指针类型声明具有下列形式之一: type* identifier; void* identifier; //allowed bu ...
- 直接用bat命令对Inno Setup的脚本文件.iss进行编译
直接用bat命令对Inno Setup的脚本文件.iss进行编译 2010-06-17 15:17 qjn0059 | 浏览 2163 次 编程语言外语学习 分享到: 2010-06-29 11: ...
- Entityframework批量删除
UI层 <a href="#" onclick="DelData(0);return false;" id="a_del" class ...