Basic認証とは?

今更ながらBasic認証についてまとめておきます。教える時に間違った情報を教えないように頭の整理もかねて。まずはBasic認証とは?以下Wikipedia引用。

Basic認証(ベーシックにんしょう、Basic Authentication)とは、HTTPで定義される認証方式の一つ。基本認証と呼ばれることも。
Basic認証では、ユーザ名とパスワードの組みをコロン “:” でつなぎ、Base64でエンコードして送信する。このため、盗聴や改竄が簡単であるという欠点を持つが、ほぼ全てのWebサーバおよびブラウザで対応しているため、広く使われている。

出典: フリー百科事典『ウィキペディア(Wikipedia)』:Basic認証より引用

公開前のWebサイトを閲覧できないようにBasic認証をかけることがよくあります。また特定のファイルやディレクトリに対してもBasic認証をかけることもあったりとするので、忘れないようにメモしておきます。

.htpasswdファイルの作成

Basic認証は、IDとパスワードを使用して認証するのですが、サーバー側にそのIDとパスワードが設定された特殊なファイルを配置する必要があります。それが「.htpasswd」ファイルになります。Basic認証を設定するディレクトリに.htaccessと共に配置します。

作り方は簡単で、htpasswdコマンドで実行すれば作成できます。

sudo htpasswd -b -c -m .htpasswd foo foopass
htpasswdコマンドオプション(Apacheのバージョンで使用できるオプションが異なる?)
オプション解説
-bパスワードを、対話式入力ではなくて、コマンドライン引数として指定できるようにします。
-c新しいパスワードファイルを作成します。もし、同名のパスワードファイルがすでに存在する場合は、既存の内容が削除されます。
-dパスワードをファイルに書き込む際、CRYPTでハッシュします。
-mパスワードをファイルに書き込む際、MD5でハッシュします。
-nどのような結果になるかのみを標準出力して終了します。パスワードファイルを変更しません。
-pパスワードをファイルに書き込む際、ハッシュしないで、プレーンなテキストのまま書き込みます。
-sパスワードをファイルに書き込む際、SHAでハッシュします。

できたがった.htpasswdファイルの中身を見てみます。

foo:wvj530Hk1WcUU

ID:暗号化されたパスワードの形式で保存されているのが確認できます。できあがったこのファイルをBasic認証かけたいディレクトリに保存します。(最初からそのディレクトリでコマンドを実行するといいですね)

htpasswdコマンドが使用できないケース

コマンドが使用できる環境なら良いのですが、レンタルサーバーなどでコマンドが実行できない環境の場合があります。その場合は、ローカル上で作成したものをFTPでアップロードすればOKです。IDと平文のパスワードを入力して実行すれば、パスワードを暗号化してくれるサイトがあるのでそちらを利用してみてはどうでしょう?

.htaccessのBasic認証設定

.htpasswdファイルを配置したディレクトリの.htaccessファイルに以下のように記述します。

<Files ~ "^\.(htaccess|htpasswd)$">
Deny from all
</Files>
AuthType Basic
AuthUserFile /home/foo/html/.htpasswd
AuthName "Please enter your ID and password"
Require valid-user

1〜3行目は、.htaccessファイルと.htpasswdファイルを外部からアクセスできないようにしています。正規表現なので、もっと簡易的に <Files ~ “^\.ht”> と書いてもいいのですが、わかりやすさ優先で。

4行目以下のディレクティブ設定は以下の通り。

ディレクティブ説明
AuthTypeBASICを指定すると基本認証
AuthUserFileパスワードファイル名
AuthName認証名(認証ウィンドウの表示)
Require認証ユーザー(valid-user : ファイルに書かれた全ユーザー)

特定のファイルにBasic認証をかける方法

特定のディレクトリにBasic認証をかける場合は、その対象ディレクトリに.htaccessと.htpasswdファイルを配置すればよいのですが特定のファイルの場合は、.htaccessにそのファイルを指定しなければいけません。以下、foo.phpというファイルにBasic認証をかける場合。

<Files ~ "^\.(htaccess|htpasswd)$">
Deny from all
</Files>
AuthType Basic
AuthUserFile /home/foo/html/.htpasswd
AuthName "Please enter your ID and password"
Order deny,allow
<Files foo.php>
Require valid-user
</Files>

これはファイルを1つ指定した場合で、ファイルを複数指定したい場合は、以下のように書き換えます。

<Files ~ "^\.(htaccess|htpasswd)$">
Deny from all
</Files>
AuthType Basic
AuthUserFile /home/foo/html/.htpasswd
AuthName "Please enter your ID and password"
Order deny,allow
<Files ~ (foo.php|bar.php)>
require valid-user
</Files>

できた!\(^o^)/
.htpasswdファイルを生成するプログラムを今度自分用に作成してみようかな。

参考サイト

Apacheマニュアル:htpasswd
https://httpd.apache.org/docs/2.4/ja/programs/htpasswd.html
Apacheマニュアル:認証、承認、アクセス制御
https://httpd.apache.org/docs/2.4/ja/howto/auth.html
.htpasswdファイル生成
https://tech-unlimited.com/makehtpasswd.html