NGINXは、高性能なWebサーバーおよびリバースプロキシとして広く使用されています。Ubuntu 16.04において、NGINXを適切にセキュアに設定することは、Webアプリケーションやサービスの安全性を確保するために非常に重要です。この記事では、Ubuntu 16.04にインストールされたNGINXを安全に設定するためのステップを詳細に説明します。
1. 初期設定
NGINXをインストールした後、最初に行うべきことは、サーバーの基本的なセキュリティ設定です。まず、NGINXが最新のパッチとセキュリティ更新を適用していることを確認しましょう。
最新のアップデートを適用する
まず、以下のコマンドを使用して、Ubuntu 16.04システムとNGINXのすべてのパッケージを最新の状態にします。
bashsudo apt update sudo apt upgrade sudo apt dist-upgrade
NGINXがインストールされていない場合は、次のコマンドでインストールします。
bashsudo apt install nginx
サーバーのファイアウォール設定
次に、ファイアウォールを設定して、不要なポートをブロックします。ufw
(Uncomplicated Firewall)を使って、NGINXが適切にアクセスされるように設定します。
bashsudo ufw allow 'Nginx Full'
これで、HTTP(80番ポート)およびHTTPS(443番ポート)にアクセスできるようになります。ファイアウォールの設定を確認するには、以下のコマンドを使用します。
bashsudo ufw status
2. NGINXのセキュリティ設定
不要なHTTPメソッドの無効化
NGINXがサポートしているHTTPメソッドには、GET
やPOST
の他にDELETE
やPUT
などがありますが、これらのメソッドはセキュリティリスクを伴う場合があるため、必要のないものは無効化するのが望ましいです。NGINXの設定ファイルでこれらを無効にする方法は以下の通りです。
/etc/nginx/nginx.conf
を開き、以下のコードを追加します。
nginxserver {
...
limit_except GET POST {
deny all;
}
...
}
この設定により、GET
とPOST
以外のHTTPメソッドが拒否されます。
サーバーバージョンの情報の非表示
NGINXは、Server
ヘッダーでサーバーのバージョン情報を送信しますが、この情報を隠すことで攻撃者からのターゲットを避けることができます。これを行うには、nginx.conf
で次の設定を追加します。
nginxserver_tokens off;
これにより、NGINXはレスポンスヘッダーにサーバーバージョンを表示しなくなります。
3. SSL/TLSの設定
セキュアな通信を実現するためには、SSL/TLSを設定することが必須です。NGINXでSSLを設定するためには、まずSSL証明書を取得する必要があります。Let’s Encryptを使って無料でSSL証明書を取得する方法を紹介します。
Let’s Encryptのインストール
まず、Let’s Encryptのクライアントであるcertbot
をインストールします。
bashsudo apt install certbot python3-certbot-nginx
インストールが完了したら、以下のコマンドでSSL証明書を取得します。
bashsudo certbot --nginx
このコマンドは、NGINXの設定を自動的に更新し、HTTPSが有効な状態にします。
自動更新の設定
証明書は90日ごとに更新する必要があるため、certbot
が自動で証明書を更新できるように設定します。cron
またはsystemd
を使って自動更新を設定することができます。
bashsudo certbot renew --dry-run
このコマンドを使って、更新が正常に機能するかどうかを確認します。
4. セキュリティヘッダーの追加
NGINXでHTTPレスポンスヘッダーを適切に設定することも重要です。セキュリティを強化するために、以下のヘッダーを追加します。
nginxadd_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はデフォルトでログを保存していますが、適切に設定して監視できるようにすることが重要です。
まず、ログの保存先とフォーマットを確認します。
bashsudo nano /etc/nginx/nginx.conf
ログの保存先として、次の設定を確認します。
nginxaccess_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
また、ログのローテーションを設定するために、logrotate
を使用します。これにより、ログファイルが大きくなりすぎないように定期的にローテーションが行われます。
bashsudo 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アドレスやユーザーエージェントをブロックすることができます。例えば、以下のように設定します。
nginxif ($http_user_agent ~* (bot|crawl|spider)) {
return 403;
}
これにより、ボットやクローラーがアクセスした場合に403エラーを返すことができます。
7. セキュリティの強化
- SELinuxやAppArmorの利用: これらのセキュリティフレームワークを使用して、NGINXのアクセス制御を強化します。
- 不要なモジュールの無効化: NGINXには多くのモジュールがありますが、使用しないモジュールを無効にすることで、攻撃のリスクを減らせます。
- OSのセキュリティ強化: 最新のセキュリティパッチを適用し、不要なサービスを無効化することも重要です。
まとめ
NGINXをセキュアに設定するための手順は、基本的なアップデートから始まり、SSL/TLS設定、セキュリティヘッダーの追加、ログの監視、ボット対策まで多岐に渡ります。これらの設定を実施することで、NGINXはより安全に運用でき、Webアプリケーションやサービスのセキュリティを大幅に向上させることができます。