Apache2 の Basic 認証 (Debian系)

今まで、めんどくさそうで避けていた Basic 認証の設定方法を勉強してみた。
(いやぁ、遅すぎだよね……)


手順は、、、

  1. .htpasswd を作る
  2. basic 認証用設定ファイルを置く
  3. basic 認証用設定ファイルを有効にする
  4. Apache2 をリロードする。


環境は Raspberry Pi で sudo apt-get install apache2 を使ったインストール後のデフォルト環境を利用している。
(/var/www/html/ が index.html の置いてあるデフォルト)
また、ありきたりな「.htaccess」は使わない手順であることに注意。

.htpasswd を作る

Raspberry Pi で Apache2 を使うなら、基本的には全部のディレクトリへアクセスが可能だと思う。
(自分の作ったサーバにアクセス権限がないとか、ありえないよね?)
また .htpasswd ファイルを置く場所は、.htpasswd を利用するプロセスはアクセスできて、外部からアクセスできなければどこでも良い。
なので、自分としては次のディレクトリにパスワード用ファイルを置く。


/etc/apache2/.htpasswd


ってことで、初回のみ -c を付けてパスワードファイルを作成する。

$ cd /etc/apache2
$ sudo htpasswd -m -c .htpasswd tester
New password: 
Re-type new password: 
Adding password for user tester


もちろん、パスワードは2回とも同じものを入力する。
オプション -m は、MD5 でのパスワード暗号化指定。
オプション -c は create のことで、指定のファイルが無い場合に作る。すでにある場合は上書きされる。


2回目以降(2人目以降)は、こんな感じ。

$ cd /etc/apache2
$ sudo htpasswd -m .htpasswd tester2
New password: 
Re-type new password: 
Adding password for user tester2


パスワードを 2 回も入力したくなかったら -b オプションを使って、こんな感じで平文で書く。

$ cd /etc/apache2
$ sudo htpasswd -b -m .htpasswd tester3 P@ssW0rd
Adding password for user tester3


これで、Basic 認証用アカウントファイル /etc/apache2/.htpasswd を作った。
なお、P@ssW0rd というパスワードは、2017年に辞書攻撃でよく利用されたパスワードらしい。
なので、そのまま使わないこと。

basic 認証用設定ファイルを置く

つぎに、Apache2 にさっきの Basic 認証用ファイルを利用するよう設定しなければならない。


設定ファイル:/etc/apache2/conf-available/basic-auth.conf
対象ディレクトリ:/var/www/html
パスワードファイル:/etc/apache2/.htpasswd


これらを盛り込んだファイルを作る。
ファイル名やらなにやらは、自身の環境に合わせて適切に指定すること。

$ sudo vi /etc/apache2/conf-available/basic-auth.conf
(書き書き)
$ sudo cat /etc/apache2/conf-available/basic-auth.conf
<Directory /var/www/html>
	AllowOverride None
	AuthType Basic
	AuthName Documents
	AuthBasicProvider file
	AuthUserFile /etc/apache2/.htpasswd
	Require valid-user
</Directory>


この辺の書き方は、APACHE HTTP SERVER PROJECT サイトの書き方を参考にしている。
http://httpd.apache.org/docs/2.4/mod/mod_authn_core.html


あと、AllowOverride None は .htaccess を無効にする設定。
Apache2 の設定ファイルに Basic 認証設定を書いているのに、わざわざ .htaccess ファイルを読み込もうとしてパフォーマンスを落とす必要はない。


.htaccess はできるだけ使うなって、公式が言っていることだし。
http://httpd.apache.org/docs/2.4/howto/htaccess.html

basic 認証用設定ファイルを有効にする

Debian 系の仕様として、conf-available 配下に置いた設定ファイル (*.conf) は、次のコマンドで有効にしてあげないといけない。

$ sudo a2enconf basic-auth


basic-auth 部分は、basic-auth.conf の .conf より前の部分なので、もしファイル名を変えている場合は指定を適切に変更すること。
sudo a2enconf と実行して、表示された有効な設定ファイル名を手入力しても良い。
a2enconf は apache2 eneble config と覚えると、a2enmod や a2ensite というコマンドも覚えやすい。

Apache2 をリロードする。

最後に、有効にした設定ファイルを反映してあげないといけないので、apache2 をリロードする。

$ sudo systemctl reload apache2


悲しいことに下記のようなエラーがでたら、どこか記入を間違えているので丹念に見直す必要あり……orz

$ sudo systemctl reload apache2
Job for apache2.service failed because the control process exited with error code.
See "systemctl status apache2.service" and "journalctl -xe" for details.


http://example.co.jp/ には Basic 認証でアクセスできるようになった。
https にするには、別途証明書が必要だなぁ……あう。



追記しておく。
手順は記載していなかったけど Raspberry Pi で作った Web サーバに、上記のドメインでアクセスするには DNS 登録が別途必要。
また、http://example.co.jp/https://example.co.jp/ としてアクセスするには、DNS に登録したドメイン名で証明書を取得して、設定を追加する必要がある。
そして IP アドレスや Dynamic DNS では ssl 証明書を取れない。
自分みたいに趣味の延長として家庭で Web サーバを作っている場合、きちんとやろうと思ったら、ドメイン登録費用と証明書取得費用がかかってくる。
他に、いわゆるオレオレ認証局をつくって自己証明書を発行しても似たようなことができることは分かっているんだけど、root 証明書のインストールとか、本来必要ない手順がたくさん必要になってくるのでめんどくさがりな自分としてはちょっと手を出したくない。
……こうして宿題が溜まっていくんだけどね。