開発運用

NGINX セキュリティ設定ガイド

NGINXは、高性能なWebサーバーおよびリバースプロキシとして広く使用されています。Ubuntu 16.04において、NGINXを適切にセキュアに設定することは、Webアプリケーションやサービスの安全性を確保するために非常に重要です。この記事では、Ubuntu 16.04にインストールされたNGINXを安全に設定するためのステップを詳細に説明します。

1. 初期設定

NGINXをインストールした後、最初に行うべきことは、サーバーの基本的なセキュリティ設定です。まず、NGINXが最新のパッチとセキュリティ更新を適用していることを確認しましょう。

最新のアップデートを適用する

まず、以下のコマンドを使用して、Ubuntu 16.04システムとNGINXのすべてのパッケージを最新の状態にします。

bash
sudo apt update sudo apt upgrade sudo apt dist-upgrade

NGINXがインストールされていない場合は、次のコマンドでインストールします。

bash
sudo apt install nginx

サーバーのファイアウォール設定

次に、ファイアウォールを設定して、不要なポートをブロックします。ufw(Uncomplicated Firewall)を使って、NGINXが適切にアクセスされるように設定します。

bash
sudo ufw allow 'Nginx Full'

これで、HTTP(80番ポート)およびHTTPS(443番ポート)にアクセスできるようになります。ファイアウォールの設定を確認するには、以下のコマンドを使用します。

bash
sudo ufw status

2. NGINXのセキュリティ設定

不要なHTTPメソッドの無効化

NGINXがサポートしているHTTPメソッドには、GETPOSTの他にDELETEPUTなどがありますが、これらのメソッドはセキュリティリスクを伴う場合があるため、必要のないものは無効化するのが望ましいです。NGINXの設定ファイルでこれらを無効にする方法は以下の通りです。

/etc/nginx/nginx.conf を開き、以下のコードを追加します。

nginx
server { ... limit_except GET POST { deny all; } ... }

この設定により、GETPOST以外のHTTPメソッドが拒否されます。

サーバーバージョンの情報の非表示

NGINXは、Serverヘッダーでサーバーのバージョン情報を送信しますが、この情報を隠すことで攻撃者からのターゲットを避けることができます。これを行うには、nginx.confで次の設定を追加します。

nginx
server_tokens off;

これにより、NGINXはレスポンスヘッダーにサーバーバージョンを表示しなくなります。

3. SSL/TLSの設定

セキュアな通信を実現するためには、SSL/TLSを設定することが必須です。NGINXでSSLを設定するためには、まずSSL証明書を取得する必要があります。Let’s Encryptを使って無料でSSL証明書を取得する方法を紹介します。

Let’s Encryptのインストール

まず、Let’s Encryptのクライアントであるcertbotをインストールします。

bash
sudo apt install certbot python3-certbot-nginx

インストールが完了したら、以下のコマンドでSSL証明書を取得します。

bash
sudo certbot --nginx

このコマンドは、NGINXの設定を自動的に更新し、HTTPSが有効な状態にします。

自動更新の設定

証明書は90日ごとに更新する必要があるため、certbotが自動で証明書を更新できるように設定します。cronまたはsystemdを使って自動更新を設定することができます。

bash
sudo certbot renew --dry-run

このコマンドを使って、更新が正常に機能するかどうかを確認します。

4. セキュリティヘッダーの追加

NGINXでHTTPレスポンスヘッダーを適切に設定することも重要です。セキュリティを強化するために、以下のヘッダーを追加します。

nginx
add_header X-Content-Type-Options "nosniff" always; add_header X-Frame-Options "SAMEORIGIN" always; add_header X-XSS-Protection "1; mode=block" always; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; add_header Content-Security-Policy "default-src 'self';" always;

これらのヘッダーは、XSS攻撃、クリックジャッキング、コンテンツタイプのスニッフィング、そしてHTTPS強制などからWebアプリケーションを保護します。

5. ログの監視と設定

NGINXのアクセスログおよびエラーログは、セキュリティインシデントを早期に発見するための重要な手段です。NGINXはデフォルトでログを保存していますが、適切に設定して監視できるようにすることが重要です。

まず、ログの保存先とフォーマットを確認します。

bash
sudo nano /etc/nginx/nginx.conf

ログの保存先として、次の設定を確認します。

nginx
access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log;

また、ログのローテーションを設定するために、logrotateを使用します。これにより、ログファイルが大きくなりすぎないように定期的にローテーションが行われます。

bash
sudo nano /etc/logrotate.d/nginx

以下の設定を追加します。

bash
/var/log/nginx/*.log { weekly rotate 12 compress delaycompress missingok notifempty create 640 www-data adm }

これにより、NGINXのログは毎週ローテーションされ、古いログは圧縮されます。

6. ボットと不正アクセスの対策

NGINXでボットをブロックするためには、denyディレクティブを使用して特定のIPアドレスやユーザーエージェントをブロックすることができます。例えば、以下のように設定します。

nginx
if ($http_user_agent ~* (bot|crawl|spider)) { return 403; }

これにより、ボットやクローラーがアクセスした場合に403エラーを返すことができます。

7. セキュリティの強化

  • SELinuxやAppArmorの利用: これらのセキュリティフレームワークを使用して、NGINXのアクセス制御を強化します。
  • 不要なモジュールの無効化: NGINXには多くのモジュールがありますが、使用しないモジュールを無効にすることで、攻撃のリスクを減らせます。
  • OSのセキュリティ強化: 最新のセキュリティパッチを適用し、不要なサービスを無効化することも重要です。

まとめ

NGINXをセキュアに設定するための手順は、基本的なアップデートから始まり、SSL/TLS設定、セキュリティヘッダーの追加、ログの監視、ボット対策まで多岐に渡ります。これらの設定を実施することで、NGINXはより安全に運用でき、Webアプリケーションやサービスのセキュリティを大幅に向上させることができます。

Back to top button