原标題:PHP安全:Nginx的使用安全
Nginx是一個高性能的Web伺服器,對靜态頁面的支援相當出色,輕量且免費,是以被大量應用于高并發站點。
1、運作安全
嚴禁使用root賬戶運作Nginx(首字母大寫代表軟體,首字母小寫代表指令),應該使用nginx使用者或者nobody運作Nginx。在Nginx配置中使用user來指定Nginx worker程序運作使用者以及使用者組。
user nobody nobody;
2、項目配置檔案
配置檔案禁止放在Web目錄中,因為一旦攻擊者對Web目錄擁有讀寫權限後即可更改nginx.conf。
client_boby_temp_path /etc/shadow;
# optional but more fun :)
location /wat {
alias /etc;
}
當重新開機Nginx時,Nginx會執行。
# strace -e trace=chmod,chown -f nginx
+++exited with 0 +++
任何檔案或檔案夾一旦被攻擊者寫入到上述配置檔案中,它的所有者都會被更改,攻擊者将擁有相應的權限。
3、日志配置
線上上伺服器中一定要将Nginx通路日志啟用,日志不允許存放在Web目錄下,并且設定日志操作權限為root。Nginx中使用access_log來開啟并指定Nginx的通路日志記錄路徑,使用error_log來記錄錯誤日志。
access_log logs/access.log combined;
error_log logs/error.logerror;
使用log_format配置指令來配置Nginx日志格式。log_format有一個預設的無須設定的combined日志格式,相當于apache的combined日志格式。
log_format combined '$remote_addr - $remote_user [$time_local] ''"$request" $status $body_bytes_sent '' "$http_referer" "$http_user_agent" ';
Nginx日志格式允許包含的變量注釋如表1所列。

表1 Nginx日志變量含義
4、目錄和檔案安全
凡允許“上傳或寫入”目錄的權限,執行權限必須設定成禁止通路。在Nginx中使用deny all指令來實作。
禁止對目錄通路并傳回403 Forbidden,可以使用下面的配置。
location /dirdeny
{
deny all;
return 403;
}
location ~ ^/upload/.*.(php|php 5)$
{
deny all;
return 403;
}
5、隐藏版本号
為了防止Nginx的版本号指紋暴露,線上伺服器要對Nginx的資訊進行隐藏,通常可以通過修改配置檔案來實作。進入Nginx配置檔案的目錄,如/etc/nginx.conf,在http标簽裡加上server_tokens off。
http
{
……
server_tokens off; # 隐藏Nginx的版本号
……
}
同樣也可以對伺服器資訊進行混淆。可以采用編譯源碼的方法來改變傳回的伺服器的版本資訊,下載下傳好Nginx的源代碼,直接在源碼中修改src/http/ngx_http_header_filter_module.c檔案中ngx_http_server_string的值。
staticchar ngx_http_server_string[]="Server:nginx" CRLF;
staticchar ngx_http_server_full_string[]="Server: " NGINX_VER CRLF;
還要修改src/core/nginx.h檔案中NGINX_VERSION和NGINX_VER的值。
# define NGINX_VERSION "1.7.0"
# define NGINX_VER "nginx/" NGINX_VERSION
編輯php-fpm配置檔案中的配置,如fastcgi.conf或fcgi.conf,修改其中的版本号資訊。
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
可以通過以上方式将伺服器資訊修改為其他字元串辨別,以達到隐藏版本号、迷惑部分攻擊者的效果。
6、防止目錄周遊
Nginx預設是不允許列出整個目錄的,預設情況下不需要配置,配置不規範可造成目錄周遊漏洞。如果有開啟情況應該将其禁用,修改為off或者直接将其删除即可。
location / {
autoindex on;
autoindex_localtime on;
}
7、Nginx檔案類型錯誤解析漏洞
該漏洞導緻隻要使用者擁有上傳圖檔權限的Nginx+PHP伺服器,就有被入侵的可能。其實此漏洞并不是Nginx的漏洞,而是PHP PATH_INFO的漏洞。例如,使用者上傳了一張照片,通路位址為http://www.ptpress.com.cn/Upload/images/test.jpg,而test.jpg檔案内的内容實際上是PHP代碼時,通過http://www.ptpress.com.cn/Upload/images/test.jpg/abc.php就能夠執行該檔案内的PHP代碼。下面的修複方法務必先經過測試,以確定修改配置不會對應用帶來影響。
(1)修改php.ini,設定cgi.fix_pathinfo=0,然後重新開機php-cgi。此修改會影響到使用PATH_INFO僞靜态的應用。
(2)在Nginx的配置檔案中添加如下内容,該配置會影響類似http://www.ptpress.com.cn/software/v2.0/test.php(v2.0為目錄)的通路。
if($fastcgi__name~..*/.*php)
{
return 403;
}
(3)在CGI子產品中對PHP的檔案是否存在進行校驗,可以避免該漏洞的發生。
location ~ .php$ {
if($request_filename~*(.*).php) {
}
if(!-e $php_url.php) {
return 403;
}
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param _FILENAME $document_root $fastcgi__name;
include fastcgi_params;
}
(4)對于存儲圖檔的location{…},應隻允許純靜态通路,不允許PHP腳本執行。
location ~ *^/upload/.*.(php|php 5)$
{
deny all;
}
8、IP通路限制
Nginx與Apache一樣,也可以通過IP對通路者進行限制。
deny 10.10.1.0/24; # 禁止該IP段進行通路
allow 127.0.0.1; # 允許該IP進行通路
deny all; # 禁止所有IP進行通路
同時,可以使用GEO白名單方式來進行IP通路限制,具體配置如下。配置ip.config檔案。
default 0; //預設情況key=default,value=1
127.0.0.1 1;
10.0.0.0/8 1;//key=10.0.0.0, value=0 192.168.1.0/24 1;
配置nginx.conf檔案。
geo $remote_addr #ip_whitelist {
include ip.conf;
}
location /console {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_For;
# 白名單配置
if($ip_whitelist=1) {
proxy_pass http://10.10.1.5:8080;
break;
}
return 403;
責任編輯: