Nginx セキュリティのベスト プラクティス。
Nginx は業界で最も急速に成長している Web サーバーであり、現在市場シェアで第 2 位の地位を占めています。
2004 年に初めてリリースされて以来、優れた評判を獲得し、最もアクセス数の多い上位 100 万のサイトで使用されています。
それには理由があります。Nginx は 非常に高速 です。
この記事では、実稼働環境で Nginx を保護するための重要なガイドのいくつかについて説明します。それでは始めましょう。

SSL/TLS
SSL証明書の実装
Web セキュリティの最初のステップは、https を使用して Web アプリケーションにアクセスし、通信に暗号化層を追加できるように SSL を実装することです。
- OpenSSL を使用して 2048 ビットおよび sha-2 で CSR を生成する
openssl req -nodes -new -sha256 -newkey rsa:2048 -keyout bestflare.key -out bestflare.csr
- 上記のコマンドは、現在の作業で直接 CSR とキー ファイルを生成します。 .csr と .key ファイル名を変更することを忘れないでください。
認証局によって署名された CSR を取得し、署名された証明書を取得したら、以下のように Nginx にそれらを実装できます。
- Nginxサーバーにログインする
- ssl.conf ファイルがある conf フォルダーに移動します。
注: Linux でのデフォルトのインストールでは、このファイルは /etc/nginx/conf.d の下にあります。
- ファイルを編集して以下を追加します。これにより、Nginx が 443 ポートでリッスンできるようになります。
server {
listen 443 ssl;
server_name bestflare.com;
ssl on;
ssl_certificate /opt/cert/bestflare.pem;
ssl_certificate_key /opt/cert/bestflare.key;
}
注: 証明書とキー ファイルのパスを変更することを忘れないでください。
- 設定を保存し、Nginx を再起動します。 SSL 証明書が正常に実装されました。
SSL/TLSの最適化
SSL があるからといって完全に安全であるというわけではないため、Web セキュリティの専門家として、Web サーバーを保護するための構成を適用する必要があります。
まず、Web サイトに対して SSL スキャン を実行して、スコアと重大な脆弱性を見つけることをお勧めします。
したがって、現在の SSL Labs の評価は 「C」 であり、目標は「A」にすることです。
弱いSSL/TLSプロトコルを無効にする
SSL 3、TLS 1.0、および TLS 1.1 には脆弱性があるため、強力な TLS 1.2 プロトコルのみを許可します。
- ssl.conf ファイルを編集し、server ブロックに以下を追加します
ssl_protocols TLSv1.2;
- ssl.conf ファイルを保存し、Nginx を再起動します。
弱い暗号スイートを無効にする
弱い暗号スイートはログジャムのような脆弱性を引き起こす可能性があるため、強力な暗号のみを許可する必要があります。
- ssl.confファイルのserverブロックに以下を追加します。
ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA HIGH !RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS";
- ファイルを保存してNginxを再起動します
チェーン証明書のインストール
チェーン証明書がないことも全体的な評価に影響し、Chrome などの最新のブラウザで閲覧するとエラーが表示される場合があります。当局からチェーン証明書を取得する必要があります。ほとんどの場合、Web サイトまたは Google で見つけることができます。
- 以下のようにWebサイト証明書にチェーン証明書の内容を追加します。私の例では、/opt/cert/bestflare.pem になります。
- ファイルを保存してNginxを再起動します
TLS 用の安全な Diffie-Hellman
ディフィー・ヘルマンは、信じられていたほど安全ではありません。最近リストに追加されたベスト プラクティスの 1 つは、Diffie-hellman を保護することです。これを行うには、一意の DH グループを生成し、ssl.conf ファイルに ssl_dhparam を追加します。
- OpenSSL を使用して一意の DH グループを生成する
openssl dhparam -out dhparams.pem 4096
- 数分かかり、現在の作業ディレクトリに dhparams.pem ファイルが生成されます。
- dhparams.pem を証明書フォルダーにコピーします
- ssl.confを変更し、serverブロックに以下を追加します。
ssl_dhparam /opt/cert/dhparams.pem;
- ファイルを保存してNginxを再起動します
SSL/TLS の最適化にはこれで十分です。URL を再度テストして評価を確認してみましょう。
うおおお!これで、SSLLabs による評価が 「A」 であることがわかります。よくやった!
これが完全な ssl.conf です
# HTTPS server configuration
server {
listen 443 ssl;
server_name bestflare.com;
ssl on;
ssl_certificate /opt/cert/bestflare.pem;
ssl_certificate_key /opt/cert/bestflare.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA HIGH !RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS";
ssl_dhparam /opt/cert/dhparams.pem;
}

情報漏洩
デフォルトの Nginx インストールでは、多くの機密情報が公開されるため、ハッカーが攻撃に備えるのに役立ちます。
PCI コンプライアンス環境で作業している場合、これは情報漏洩の脆弱性とみなされ、この項目を修正する必要があります。
情報漏洩を無効にするには、server_tokens off を使用する必要があります。これについては前回の記事で説明しました。 Nginxのサーバーヘッダーバナーからバージョンを削除する
Web アプリケーションのセキュリティ
デフォルトの Nginx 構成は完璧ではなく、多くの脆弱性がある可能性があるため、セキュリティを強化するために構成を強化しています。
不要なHTTPメソッドを無効にする
ほとんどの場合、Web アプリケーションで必要なのは HTTP リクエストの GET、HEAD、POST だけです。 TRACE または DELETE を許可すると、クロスサイト トラッキング攻撃が許可され、ハッカーが Cookie 情報を盗む可能性があるため、危険です。
- nginx.confを変更し、serverブロックの下に以下を追加します。
if ($request_method !~ ^(GET|HEAD|POST)$ )
{
return 405;
}
ファイルを保存し、Nginx を再起動します。誰かが TRACE、DELETE、PUT、OPTIONS を使用しようとすると、「405 Not allowed」と表示されるようになります。
Chandans-iMac:~ chandan$ telnet bestflare.com 80
Trying 128.199.100.162...
Connected to bestflare.com.
Escape character is '^]'.
TRACE / HTTP/1.1
Host: testing
HTTP/1.1 405 Not Allowed
Server: nginx
Date: Sat, 11 Jul 2015 06:04:34 GMT
Content-Type: text/html
Content-Length: 166
Connection: close
クリックジャッキング攻撃
クリックジャッキング攻撃を防ぐために、HTTP ヘッダーに X-FRAME-OPTIONS を挿入できます。
これは、nginx.conf ファイルに以下を追加することで実現されます。
add_header X-Frame-Options "SAMEORIGIN";
上記のヘッダーは、同じオリジンからのみリソースをロードするようにブラウザーに指示します。
X-XSS 保護
X-XSS 保護を備えた HTTP ヘッダーを挿入して、クロスサイト スクリプティング攻撃を軽減します。
- nginx.conf ファイルを変更して以下を追加します
add_header X-XSS-Protection "1; mode=block";
- 設定ファイルを保存し、Nginx を再起動します。実装後にヘッダー テスト ツールを使用して検証できます。
ここで説明する OWASP 推奨のセキュア ヘッダーの実装にも興味があるかもしれません。
ModセキュリティWAFを実装する
OWASP コア ルール セットを使用して Web アプリケーション ファイアウォール ModSecurity を実装することで、セキュリティ層を追加します。
あるいは、Nginx サーバーの前で SUCURI のようなクラウドベースのセキュリティを使用することを検討してください。
Nginxを最新の状態に保つ
最後になりましたが、多くのパフォーマンス強化、セキュリティ修正、新機能が追加されているため、Nginx を最新の状態に保つ必要があります。
これが Nginx の安全性を保つのに役立つことを願っています。
次に、 高パフォーマンスを実現する Nginx を最初から構築する 方法を学ぶことに興味があるかもしれません。