>백엔드 개발 >PHP 튜토리얼 >Nginx 보안 구성 연구

Nginx 보안 구성 연구

WBOY
WBOY원래의
2016-08-08 09:22:521100검색



0x00 테스트 환경

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

0x01 Nginx 소개

nginx 자체는 PHP를 처리할 수 없으며 요청을 받을 때 웹 서버일 뿐입니다. , 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/ 

<img  src="http://image.codes51.com/Article/image/20150610/20150610084337_2340.png" border="0" alt="Nginx 보안 구성 연구" >

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

<img  src="http://image.codes51.com/Article/image/20150610/20150610084337_4840.png" border="0" alt="Nginx 보안 구성 연구" >

Php-fpm.conf

<img  src="http://image.codes51.com/Article/image/20150610/20150610084337_7965.png" border="0" alt="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/;



<p>使用Nginx防御CC攻击</p><p>本文主要介绍了有关使用Nginx防御CC攻击的一些配置。CC攻击针对的是服务器上面的内存和CPU资源,因此通常会找到一些比较高消耗的接口,例如search.php之类的需要大量sql查询的接口。因此,明白了这一点,我们就很好防御了,主要是针对单个ip地址的连接数和请求php文件的密度来控制的。</p><p>我们主要用到的是Nginx中提供的两个limit模块:</p><pre class="brush:php;toolbar:false"><ol>
<li><span><span>ngx_http_limit_conn_module  </span></span></li>
<li><span>ngx_http_limit_req_module </span></li>
</ol>

1. 화이트리스트

우선 이 두 모듈은 화이트리스트를 지원합니다. 즉, 검색 엔진 등 제한할 필요가 없는 특정 IP 주소가 있을 수 있습니다. 또는 자신의 IP이므로 화이트리스트를 설정해야 합니다. 필요하지 않은 경우 이 단계를 건너뛸 수 있습니다. 구체적인 방법:

다음 형식의 콘텐츠를 HTTP 세그먼트에 삽입하고 화이트리스트 IP를 선언합니다

<ol>
<li><span><span>http{    </span></span></li>
<li><span>.......    </span></li>
<li><span>geo $limited{    </span></li>
<li><span>      default 1;    </span></li>
<li><span>      #公司    </span></li>
<li><span>     119.123.5.0/24 0;   </span></li>
<li><span>  }    </span></li>
<li><span>.........    </span></li>
<li><span>}   </span></li>
</ol>

geo 지시어는 기본값 1로 화이트리스트 $limited 변수를 정의합니다. client IP가 위 범위에 속하며, $limited 값은 0입니다.

그런 다음 위 내용 바로 뒤에 map 명령을 사용하여 검색 엔진 클라이언트의 IP를 빈 문자열에 매핑합니다. 화이트리스트 IP가 아닌 경우 실제 IP가 표시되므로 검색 엔진이 표시됩니다. iIP는 제한 세션의 메모리에 저장될 수 없으므로 화이트리스트에 있는 IP 액세스는 제한되지 않습니다.

<ol>
<li><span><span>map $limited $limit {    </span></span></li>
<li><span>                  1 $binary_remote_addr;   </span></li>
<li><span>                  0 "";    </span></li>
<li><span>        }  </span></li>
</ol>

2. 접속 빈도 제한

접속 빈도 제한은 ngx_http_limit_req_module을 사용하는데, 먼저 HTTP 섹션에서 이 모듈의 일부 매개변수를 선언합니다. 화이트리스트를 설정한 경우 설정은 다음과 같습니다

<ol>
<li><span><span>http{    </span></span></li>
<li><span>...    </span></li>
<li>
<span>limit_req_zone $limit </span><span>zone</span><span>=one:10m </span><span>rate</span><span>=</span><span>20r</span><span>/m; ##平均20r/m 每分钟20个请求    </span>
</li>
<li><span>...    </span></li>
<li><span>}   </span></li>
</ol>

화이트리스트를 설정하지 않은 경우 모든 IP 수신이 제한되며 설정은 다음과 같습니다

<ol>
<li><span><span>http{    </span></span></li>
<li><span>...    </span></li>
<li>
<span>limit_req_zone $binary_remote_addr </span><span>zone</span><span>=one:10m </span><span>rate</span><span>=</span><span>20r</span><span>/m; ##平均20r/m 每分钟20个请求  </span>
</li>
<li><span>...   </span></li>
<li><span>}   </span></li>
</ol>

설명 위의 매개변수 중 첫 번째는 제한해야 할 IP 그룹을 나타냅니다. 두 번째 z/s는 이와 같습니다.

마지막으로 Nginx

<ol>
<li><span><span>location ~ \.php$ {    </span></span></li>
<li><span>...    </span></li>
<li>
<span>limit_req </span><span>zone</span><span>=one </span><span>burst</span><span>=</span><span>5</span><span> nodelay;   </span>
</li>
<li><span>...    </span></li>
<li><span>}   </span></li>
</ol>

에 구성된 PHP의 구문 분석 섹션은 1이라는 영역의 사용을 지정하고 지연이 설정되지 않은 경우 버퍼 큐는 5입니다. , 액세스가 중단됩니다.

3. 액세스 연결 제한

액세스 연결 제한은 ngx_http_limit_conn_module을 사용하며, 이 역시 두 군데에서 구성해야 합니다. 먼저 HTTP 섹션에 이 모듈의 일부 매개변수를 선언합니다. 설정 화이트리스트, 설정은 다음과 같습니다

<ol>
<li><span><span>http{   </span></span></li>
<li><span>...    </span></li>
<li>
<span>limit_conn_zone $limit </span><span>zone</span><span>=</span><span>addr</span><span>:10m;    </span>
</li>
<li><span>...    </span></li>
<li><span>}   </span></li>
</ol>

화이트리스트가 구성되지 않으면 들어오는 모든 IP가 제한되며 구성은 다음과 같습니다

<ol>
<li><span><span>view sourceprint?http{    </span></span></li>
<li><span>...    </span></li>
<li>
<span>limit_conn_zone $binary_remote_addr </span><span>zone</span><span>=</span><span>addr</span><span>:10m;   </span>
</li>
<li><span>...    </span></li>
<li><span>}   </span></li>
</ol>

매개변수의 의미 위와 비슷하고 더 이상의 설명은 없습니다.

다음 단계는 서버 세그먼트에 이를 설정하는 것입니다. 이는 디렉토리 등에 특정할 수 있습니다.

<ol>
<li><span><span>server {    </span></span></li>
<li><span>    location /download/ {   </span></li>
<li><span>        limit_conn addr 5;    </span></li>
<li><span>    }  </span></li>
</ol>

끝났습니다. 이제 nginx를 기억하세요. -새로고침~


【编辑推荐】

<ol>
<li>20个Nginx Web服务器最佳安全实践</li>
<li>nginx文件类型错误解析漏洞</li>
<li>nginx配置错误而导致目录遍历漏洞</li>
<li>设置安全的nginx+PHP网站目录权限</li>
<li>使用Nginx防御CC攻击</li>
</ol>



위의 내용은 내용의 측면을 포함하여 Nginx 보안 구성 연구를 소개합니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.