nginxでベーシック認証をかける方法
2017/01/31
こんにちは、okutani(@okutani_t)です。本記事ではオープンソースのWebサーバー「nginx」にベーシック認証をかける方法について解説しています。
nginxの導入と初期設定方法は、過去に記事にしているので参考にしてください。
ベーシック認証とは、サイトのアクセス時にIDとPasswordを設定し、アクセスを制限する認証のことを言います。
最初のアクセスでエラーコード401を返信し、入力したIDとPasswordが一致した場合にサイトを閲覧できます。最もかんたんに利用でき、ほとんどのWebサーバーで対応しています。
Apacheでは.htpasswdを作成し、.htaccessでベーシック認証を設定します。nginxでも似たような設定でベーシック認証をかけることができます。
本記事ではCentOS7を利用していますが、他のUNIX系OSでも同じ手順で設定できるかと思いますので、ぜひチャレンジしてみてください。
では、さっそくnginxでベーシック認証を利用する方法を見ていきましょう。
スポンサーリンク
htpasswdコマンドで.htpasswdファイルを作成する
まずは「.htpasswd」ファイルを作成します。
.htpasswdファイルは「htpasswdコマンド」を使って作成します。まずは、htpasswdコマンドが使えるか確認。
$ which htpasswd
無い場合は下記のコマンドで導入。
・CentOS
$ sudo yum install -y httpd-tools
・Ubuntu
$ sudo apt-get install apache2-utils
次のコマンドで.htpasswdを作成します。ユーザー名とパスワードを定義し、nginxで読み込ませるようにしていきます。usernameには、認証時に使うIDを入力してください。
$ sudo htpasswd -c /etc/nginx/.htpasswd username
続けて、Passwordを入力します。お好きなものを入力してください。
New password: Password入力
Re-type new password: Password入力
Adding password for user username
きちんと作成されたか確認してみましょう。
$ cat /etc/nginx/.htpasswd
username:$apr1$O1FZm1xW$IutjxIfkEPQ28xOqxwMOc0
「ID:エンコード済みのPassword」となっていればOKです。Passwordは平文で利用しないので覚えておきましょう。
ちなみに、今回作成した.htpasswdファイルは、Apacheで利用する.htpasswdファイルと互換性があります。覚えておくと良いですね。
では、作成した.htpasswdをnginxで読み込んでみましょう。
.htpasswdファイルをnginxで設定
「/etc/nginx/nginx.conf」もしくは「/etc/nginx/conf.d/default.conf」もしくは「/etc/nginx/sites-available/example.com.conf」などのいづれかのファイルで、.htpasswdファイルを読み込みます。
example.com.confという形式の場合は、ご自身で設定したファイル名に置き換えてください。
ここら辺の設定は、記事冒頭で紹介した過去記事を参考にしてください。
プロジェクトの設定が記述されたファイルに追記していけばOKです。今回私の場合は「/etc/nginx/sites-available/example.com.conf」に、プロジェクトの設定を個別に書いていたのでそちらで読み込んでいきます。
server {
listen 80 default_server;
server_name example.com;
root /usr/share/nginx/html;
# 認証領域名
auth_basic "Private Property";
# .htpasswdファイルの場所
auth_basic_user_file /etc/nginx/.htpasswd;
...省略...
}
上記のように「auth_basicに認証領域名(任意)」と「auth_basic_user_fileに.htpasswdファイルのパス」をそれぞれ設定します。
設定が済んだら、nginxを再起動。以下はCentOS7(systemctl対応OS)の場合の再起動方法です。
$ sudo systemctl reload nginx
ブラウザで確認します。
上記のようにベーシック認証が設定され、サイトを閲覧するのにIDとPasswordが必要になりました。
これでセキュリティのかかったサイトをかんたんに公開することができますね。
また、SSL/TLS対応していないサイト(httpsでないサイト)では、ベーシック認証時のIDとPasswordは第三者に盗み見られる可能性があります。
きっちりセキュリティのかかったサイトで運用したい場合は、SSLの対応をしておくことが必須です。
おまけ: 特定のIPアドレスにはベーシック認証をかけない方法
社内からのアクセスにはベーシック認証をかけたくない場合があるかと思います。
その場合は、「satisfy any」ディレクティブを利用します。.confファイルを次のように編集。
server {
listen 80 default_server;
server_name example.com;
root /usr/share/nginx/html;
satisfy any;
allow 許可するIPアドレス1;
allow 許可するIPアドレス2;
...省略...
deny all;
# 認証領域名
auth_basic "Private Property";
# .htpasswdファイルの場所
auth_basic_user_file /etc/nginx/.htpasswd;
...省略...
}
satisfy anyとdeny allで、allowで指定したIPアドレスを挟んであげればOKです。許可したいIPアドレスは上記のように複数記述することができます。
.confファイルを変更したので、nginxを再起動させるのを忘れずに。
$ sudo systemctl reload nginx
これで、特定のIPアドレスからベーシック認証せずに、そのままサイトを閲覧することができますね。
nginxユーザーの参考になれば幸いです。
Web開発のお仕事を募集しています
フリーランスのエンジニアとして、Webシステム開発のお仕事依頼を随時募集しています(現在の業務量によってお受けできない場合もあります)。
「Ruby on Rails」「JavaScript(jQuery, Reactなど)」「HTML + CSS」を用いたシステム開発、「Heroku」等を用いたサーバー構築・運用、「Git」や「GitHub」を利用したソーシャルコーディングなどに対応しています。
ご依頼を検討している方は、下記リンク本ブログからのお問い合わせ、もしくはokutaniのポートフォリオからご連絡ください。
LINKお問い合わせ
スポンサーリンク