Nginxで名前ベースのバーチャルホストを構成している環境では、要求されたドメイン名に応じてそれぞれのサイトに振り分けられますが、想定外の名前(たとえば、IPアドレス直打ちなど)でアクセスしてきた場合にどのような動作になるかご存知ですか?
Nginxの既定の動作では、振り分け先が設定ファイル(nginx.conf)に書いていない未定義の名前でアクセスされた場合、設定ファイルの先頭に記述してあるserverブロックに振り分けられます。
この既定の動作は、1サイトの運用なら特に気にする必要はないかもしれませんが、バーチャルホスト環境で複数のサイトを運用している場合だと、意図しないサイトへアクセスされる可能性があります。
そこで、ここでは想定外の名前でアクセスしてきた場合にアクセスを遮断する方法を紹介します。
目次
手順
serverブロック内で、listenポート番号の後ろに「default_server」を付けると、未定義の名前を使ったアクセスは、すべてそのserverブロックで処理されます。
この仕様に従い、未定義の名前を使ったアクセスに対して、エラーコード「444」を応答する設定を追記します。
注意点としては、443番ポートについても設定する場合は、証明書が必要となります。(ここで使用する証明書は、⾃⼰署名証明書で構いません)
以上を設定ファイルに追記すると以下のようになります。
server {
listen 80 default_server;
listen 443 ssl default_server;
server_name _;
ssl_certificate /usr/local/ssl/selfcert.crt;
ssl_certificate_key /usr/local/ssl/selfcert.key;
return 444;
}
すでに別のserverブロックに「default_server」をつけている場合は、削除しておいてください。
おまけ
上で使用する自己署名証明証の作成方法は以下のとおりです。以下のコマンドで10年間有効な証明書ができあがります。
流れは「秘密鍵ファイル作成」>「CSRファイル作成」>「証明書ファイル作成」です。
openssl genrsa 2048 > selfcert.key
openssl req -new -key selfcert.key > selfcert.csr
openssl x509 -days 3650 -req -signkey selfcert.key < selfcert.csr > selfcert.crt