Web業界で10年以上(もうすぐ20年か)働いているのに、やるたびに「どうやるんだっけ」となってしまうので、自身の備忘録としてApacheのDigest認証についてまとめます。(Nginxについてはまた別途)
つい先日、ググりながら実装したのにうまく動作させることができませんでいた。(お恥ずかしい)
その時に何をミスったのかも記しておきます。
なお、この記事はBasic認証については触れません。
もし「BasicなのかDigestなのかよくわからないけど、認証入れたい」という方がいたら、Digest認証を導入してください。
Basic認証はセキュリティ面が甘いです。サーバのセキュリティに詳しく、『Digest認証を入れる必要がない』という判断ができる場合はBasic認証でも大丈夫です。(あえてBasic認証を選ぶ理由が筆者にはわかりませんが…)
Digest認証をとりあえず入れる
/etc/httpd/conf/httpd.conf に以下記述を追加します。(末尾に追記すればOK)
<Directory "/var/www/html">
AuthType Digest
AuthName "Digest Auth"
AuthUserFile "/etc/httpd/.digest"
Require valid-user
</Directory>
ターミナル(WinSCPを使っていればPuttyなど、AWSならセッションマネージャー)を使って以下コマンドを打ちます。
htdigest -c /etc/httpd/conf/.digest "Digest Auth" digest
すると、パスワードを聞かれます。
画面上は変化がないですが、パスワードを入力しましょう。
Adding password for digest in realm Digest Auth. New password:
パスワードを入力してEnterキーを押すと、パスワードの入力確認でもう一度パスワードを聞かれます。
同じパスワードをもう一度入力しましょう。
Re-type new password:
パスワード生成ツールなどであらかじめ用意したパスワードを張り付けて使いたい場合はPuttyであれば右クリック、AWSのセッションマネージャーであればCtrl+Shift+Vで貼り付けができます。(画面上何も変わらないので、2回張り付けたりしないように注意)
上記設定が完了したらApacheを再起動します。
以下いずれかのコマンドで再起動ができるはずです。
systemctl restart httpd.service
systemctl restart httpd
/etc/init.d/httpd restart
service httpd restart
再起動が完了したらサイトにアクセスして認証が表示されるか確認してください。
表示された認証ウィンドウにユーザー名『digest』パスワード『設定したパスワード』でログインができるはずです。
Digest認証の設定について解説
Digest認証を実装する全体像は以下になります。
- (基本的には不要)Apacheモジュール『auth_digest_module』を有効にする
- Digest認証の設定を記述する(*.conf、または.htaccess)
- パスワードを設定する
「(基本的には不要)」とした、Apacheモジュール『auth_digest_module』については、サーバにApacheを導入した時点で有効になっているはずです。古すぎる環境や何やら特殊なインストール方法を行っていない限り問題ないです。
有効になっていなければパスワードの設定ができないだけなので(アクセスできなくなったりしない)
先ステップがうまくいかない事態が発生してからモジュールが有効になっているのか調べればよいです。
Digest認証の設定を記述する(*.conf、または.htaccess)
Digest認証を使う場合、Apacheの設定を行う*.confファイルか、.htaccessファイルに記述する必要があります。
どちらが正解ということはないので、慣れ親しんだ方を使いましょう。
導入しやすくてわかりやすいのは.htaccessだと思いますが、後々の管理や他の人へのわかりやすさを考慮するなら*.confを使うほうが良いと思います。
個人サイトなら.htaccessでもOK、仕事や複数人開発している場合は*.confが好ましいと思います。(筆者は個人サイトでも*.confを使うようにしています)
*.confでDigest認証の設定をする
前述した方法は『/etc/httpd/conf/httpd.conf』にDigest認証の設定を記述しました。
それで全然構わないのですが、できるだけ初期設定ファイルをいじりたくない場合や カスタマイズした設定はわかりやすくしたい場合などに簡単に別ファイルに設定を切り出すことができます。
新しいファイル『/etc/httpd/conf.d/{任意の名前}.conf』を作成してその中に以下設定を書き込みます。
<Directory "/var/www/html">
AuthType Digest
AuthName "Digest Auth"
AuthUserFile "/etc/httpd/.digest"
Require valid-user
</Directory>
こうすることで、自分が書いた設定だけを別ファイル管理することができます。
ファイル名はドメイン名(exsample.conf)や開発者の名前(tanaka.conf)などとするとわかりやすいでしょう。
間違えたり、何かうまくいかないことが発生したら『{任意の名前}.conf』を削除すればよいです。
Digest認証の設定について少し解説します。
<Directory "/var/www/html"> ←①対象とするディレクトリ
AuthType Digest ←②認証タイプDigestを利用する
AuthName "Digest Auth" ←③Digest認証の名前
AuthUserFile "/etc/httpd/.digest" ←④パスワード情報を格納するファイル
Require valid-user ←⑤認証するユーザー
</Directory>
『①対象とするディレクトリ』は、Digest認証をかけるディレクトリを指定します。
例えば<Directory “/var/www/html/sample”>とすれば、「トップページは認証不要、サンプルページは認証」という設定ができます。
『②認証タイプDigestをりようする』は、Digest認証を使うための設定なので必ず記述します。
『③Digest認証の名前』は、Digest認証を使い分ける場合に利用する名称になります。複数の異なる認証を実装したい場合などに必要になります。
後に出てくるパスワードを設定するときに使います。
『④パスワード情報を格納するファイル』は、パスワードデータが保存されているファイルを示します。
後に出てくるパスワードを設定するときに使います。
『⑤認証するユーザー』は、ユーザー名・パスワードが一致した時に承認ユーザーを指定します。
「valid-user」は、『設定された全ユーザー』の意味になります。(valid-userというユーザー名ではない)
ここを「tanaka」とすると、ユーザー名「tanaka」しか認証しなくなります。複数指定したい場合はスペースで区切りますtanaka suzuki
など
パスワードをたくさん発行したあとに、公開範囲を絞るときに便利です。(パスワードデータの方を整理するべきだとは思いますが)
.htaccessでDigest認証の設定をする
『.htaccess』ファイルを認証をかけたいフォルダに以下内容で作成します。
AuthType Digest
AuthName "Digest Auth"
AuthUserFile /etc/httpd/.digest
Require valid-user
*.confと内容は一緒で、<Directory>の記述がないだけになります。
.htaccessは設置したディレクトリに対して行う設定なので、ディレクトリの指定が不要ということですね。
各設定内容は*.confと同じなので割愛します。
パスワードを設定する
ターミナルで以下コマンドを打ちます。
htdigest -c /etc/httpd/conf/.digest "Digest Auth" digest
この内容は、前述したDigest認証の設定により内容が変わります。
スペース毎に区切られたそれぞれの意味は以下になります。
【htdigest】Digest認証のパスワード設定を行うコマンド。
【-c】(オプション)初めてのパスワード設定(同じDigest認証に2つめのユーザーを追加するときは不要)。
【/etc/httpd/conf/.digest】パスワードデータを保存するファイル。
階層もファイル名も任意だが、Digest認証の設定で指定した「AuthUserFile」と同じにする必要がある。
【”Digest Auth”】Digest認証の名前。Digest認証の設定で指定した「AuthName」と同じにする必要がある。
【digest】認証するユーザー名。
Enterキーを押すと、パスワードを2回求められるので 設定したいパスワードを2回入力する。
ちなみに、Digest認証の設定(*.confか.htaccessの用意)とパスワードの設定はどちらが先でも構いません。
どちらも揃ってApacheを再起動することでDigest認証が動作します。
Digest認証が動かない場合
単純なスペルミスやパスワードの打ち間違えが原因として多くなると思いますが、なんで動かないのかの切り分けが大変しずらいです。
認証ウィンドウが出てこない場合
Digest認証の設定がうまくいっていないです。
試しに以下コマンドを打ってApacheの設定がうまくいっているか確認しましょう。
#構文チェック
httpd -t
エラーが出れば*.confや.htaccessの書き方をミスっています。
エラーがない場合は構文は間違っていませんが、必要な記述が無い場合が考えられます。
パスワードを入れても通らない
Digest認証を実装したら認証ウィンドウが表示されるようになったが、正しいパスワードを入れても通らない場合以下の原因が考えられます。
- パスワードファイルの指定が間違っている
- 認証ユーザーの指定が間違っている
- 入力しているパスワードが間違っている
パスワードファイルの指定が間違っている
例えば、Digest認証の設定でAuthUserFile "/etc/httpd/.digestPass"
を指定し
パスワード設定コマンドで以下を打った場合、認証は通りません。
htdigest -c /etc/httpd/conf/.digestpass "Digest Auth" digest
指定されているパスワードファイルが『.digestPass
』と『.digestpass』で P の大文字/小文字が異なるためです。
上記の場合、パスワード設定コマンドで作られた/etc/httpd/conf/.digestpass
に設定を合わせればいいので、設定ファイルの方を小文字の p に変更すればOKです。
認証ユーザーの指定が間違っている
Digest認証の設定で『Require valid-user』を変更した場合に発生します。
筆者がやったミスはこれで、なかなか気が付かず時間を無駄にしました。
変更したつもりがなく、スペルミスした場合も認証が通らなくなるので注意しましょう。
一文字違うだけでも動作しなくなるので『Require user』『Require valid user』『Require velid-user』『Require validuser』など気を付けましょう。
なお、『Require user』『Require valid user』などと設定ミスをした場合に、パスワード設定コマンドでユーザー名をuserとした場合Digest認証は動きます。
htdigest -c /etc/httpd/conf/.digest "Digest Auth" user
入力しているパスワードが間違っている
このミスは最初に疑うと思いますが、パスワード設定時に入力内容が確認できないのでなかなか曲者です。
結果、設定パスワードミスってなかったのに 自分が間違えたのかもと思って何度も確かめることになります。
合ってるはずなのに通らない…となってしまったら設定ファイルとパスワードを簡単にして動作確認しましょう。
Digest認証の設定を AuthUserFile /etc/httpd/.test
とでもして
htdigest -c /etc/httpd/conf/.test "Digest Auth" test
入力するパスワードも『test』『test』としてみるなどして、まずはちゃんと動いているのかを確認してみます。
これでDigest認証が通るなら、ちゃんと動作してることは確認できます。
コメント