Nginxは、静的ページの優れたサポートを備えた高性能Webサーバーであり、軽量で無料であるため、同時実行性の高いサイトで広く使用されています。
1.操作上の安全性
ルートアカウントを使用してNginxを実行することは固く禁じられています(大文字の最初の文字はソフトウェアを表し、小文字の最初の文字は命令を表します)。Nginxはnginxユーザーまたはnobodyとして実行する必要があります。Nginx構成でuserを使用して、Nginxワーカープロセスのユーザーとユーザーグループを指定します。
user nobody nobody;
2.プロジェクト構成ファイル
攻撃者がWebディレクトリへの読み取りおよび書き込み権限を取得すると、nginx.confが変更される可能性があるため、構成ファイルをWebディレクトリに配置することは許可されていません。
client_boby_temp_path /etc/shadow;
# optional but more fun :)
location /wat {
alias /etc;
}
Nginxを再起動すると、Nginxが実行されます。
# strace -e trace=chmod,chown -f nginx
chown("/etc/shadow",33,4294967295)=0
+++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には、設定する必要のないデフォルトの結合ログ形式があります。これは、Apacheの結合ログ形式と同等です。
log_format combined '$remote_addr - $remote_user [$time_local] ''"$request" $status $body_bytes_sent '' "$http_referer" "$http_user_agent" ';
Nginxログ形式では、表1にリストされているように変数コメントを含めることができます。
表1Nginxログ変数の意味
4.ディレクトリとファイルのセキュリティ
ディレクトリを「アップロードまたは書き込み」する権限は、アクセスを禁止するように設定する必要があります。Nginxのdenyallコマンドを使用して達成します。
ディレクトリへのアクセスを禁止して403Forbiddenを返すには、次の設定を使用できます。
location /dirdeny
{
deny all;
return 403;
}
location ~ ^/upload/.*.(php|php 5)$
{
deny all;
return 403;
}
5.バージョン番号を非表示にします
Nginxバージョン番号のフィンガープリントが公開されないようにするには、オンラインサーバーでNginx情報を非表示にする必要があります。これは通常、構成ファイルを変更することで実現できます。/etc/nginx.confなどのNginx構成ファイルのディレクトリを入力し、server_tokensoffをhttpタグに追加します。
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
fastcgi.confやfcgi.confなどのphp-fpm構成ファイルの構成を編集し、バージョン番号情報を変更します。
fastcgi_param SERVER_SOFTWARE nginx / $ nginx_version;
上記の方法でサーバー情報を他の文字列識別子に変更して、バージョン番号を非表示にし、一部の攻撃者を混乱させる効果を実現できます。
6.ディレクトリトラバーサルを防止します
デフォルトでは、Nginxはディレクトリ全体を一覧表示することを許可せず、デフォルトで構成は必要ありません。不規則な構成は、ディレクトリトラバーサルの抜け穴を引き起こす可能性があります。オンになっている場合は、無効にするか、オフに変更するか、直接削除する必要があります。
location / {
autoindex on;
autoindex_localtime on;
}
7.Nginxファイルタイプエラー解析の脆弱性
この脆弱性により、ユーザーが画像をアップロードする権限を持つNginx + PHPサーバーを持っている限り、ハッキングされる可能性があります。実際、この脆弱性はNginxの脆弱性ではなく、PHPPATH_INFOの脆弱性です。たとえば、ユーザーが写真をアップロードし、アクセスアドレスがhttp://www.ptpress.com.cn/Upl ...で、test.jpgファイルのコンテンツが実際にはPHPコードである場合、http:// wwwを渡します。 .ptpress .com.cn / Upl...。次の修復方法を最初にテストして、構成の変更がアプリケーションに影響を与えないことを確認する必要があります。
(1)php.iniを変更し、cgi.fix_pathinfo = 0に設定してから、php-cgiを再起動します。この変更は、PATH_INFO疑似静的を使用するアプリケーションに影響します。
(2)次のコンテンツをNginx構成ファイルに追加します。この構成はhttp://www.ptpress.com.cn/sof ...と同様のアクセスに影響します(v2.0はディレクトリです)。
if($fastcgi_script_name~..*/.*php)
{
return 403;
}
(3)CGIモジュールにPHPファイルが存在することを確認することで、この脆弱性を回避できます。
location ~ .php$ {
if($request_filename~*(.*).php) {
set $php_url$1;
}
if(!-e $php_url.php) {
return 403;
}
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root $fastcgi_script_name;
include fastcgi_params;
}
(4)画像が保存されている場所{...}については、純粋な静的アクセスのみを許可する必要があり、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へのアクセスを許可する
すべて拒否;#すべての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;
}