#freeze
[[Apache/Tips]]
#contents
----
* [[mod_auth_digest.soのセットアップ・インストール>Apache/Tips/mod_auth_digest.soのセットアップ・インストール]] [#re40f186]
* .htaccess を用いた Digest 認証(ダイジェスト認証) [#faeaab14]
** Digest 認証って? [#ycde1212]
 一般的に Apache 上の認証としては Basic 認証(基本認証)が有名です。ですが、Basic 認証でやりとりされるユーザ名とパスワードの情報は暗号化されていない平文でネットワーク上をネットワーク上を流れています。対して mod_auth_digest を用いた場合にはユーザ名・パスワード・認証領域の名前を元にした MD5 ハッシュ値を用いた認証を行う仕組みです。簡単に説明してしまうと、暗号化されたユーザ情報を元に認証できるという訳です。

 .htaccess ファイルで指定する場合、認証を必要とするディレクトリ毎に別々のユーザ名とパスワードの入ったファイルを準備する必要がありました。ですが Digest 認証では1つのファイルで複数のディレクトに対する認証情報をまとめて管理することができます(realm としてディレクトリを区別します)。.htpasswd のようなファイルがディレクトリ毎に設置しなくていいという点だけでも、管理者にとっては有り難いです。

 しかも、それだけではない便利な点もあります。ダイジェスト認証用は Basic 認証同様に .htaccess や httpd.conf で指定されているディレクトリは Options +Indexes と指定してディレクトリ一覧が表示するような設定になっていても、そこでリストに表示されることはありません。


** Apache 側に必要な事は? [#cb9c2154]
 Apache 側に必要なのは mod_auth_digest モジュールが組み込まれている事です。httpd.conf に次のような行があれば組み込まれていると思って問題ありません。利用可能です。
 LoadModule auth_digest_module modules/mod_auth_digest.so
 もし DSO (動的な組み込みモジュール)が Apache に対応していなくてソースからコンパイルされている Apache であれば再構築が必要となってしまいます。とはいえ、よりセキュリティの高い Digest 認証を実装するためですから、ここは仕方がないとあきらめてコンパイルしましょうか……。


** とにかく Digest 認証を使ってみる [#hb6ffa22]

 これまで Basic 認証を設定したことがあるのであれば、Digest 認証も殆ど同じような手順で設定することが出来ます。Basic 認証では htpasswd コマンドを使ってユーザ名とパスワード情報をファイルに作成します。対して Digest 認証では htdigest コマンドを使って認証用のユーザ名とパスワードといった情報を入力することができます。

 もう1つ Digest  認証で扱う概念に realm というものがあります。これは認証するディレクトリ毎につける名前のようなものです。AuthName で指定する名前と AuthDigestFile として指定するパスワードファイの中の realm が一致しないと認証されません。つまり realm が認証する場所を区別するためのもの、という風に考えることもできます。

 理屈はさておき、とにかく試してみましょう

 認証するファイルの置き場所は "/home/akane/digestpass" とします。.htpasswd のような Basic 認証と同様に public_html 配下に置くのは好ましくないとされます(サーバの設定によっては中身が晒されてしまう危険性があるためです)。

 認証する realm は "BIOHAZARD LEVEL 4" とします。

 認証するユーザ名は "admin" とします。パスワードは適当です。

 さて、まずは htdigest コマンドを使って認証用のファイルを作成します。htdigest の書式は次のようなものです。
 $ htdigest -c 認証ファイル名 "realm" ユーザ名
 先の例で指定してみると、
 $ htdigest -c /home/akane/digestpass "BIOHAZARD LEVEL 4" admin
 Adding password for admin in realm BIOHAZARD LEVEL 4.
 New password:
 Re-type new password:
 このようになります。あわせてパスワード入力を求めてきますので、同じパスワードを入れます。cat で中を見てみると、このような感じになります。
 $ cat digestpass
 admin:BIOHAZARD LEVEL 4:b28b9c50895dacaa50655efbcf01f8db
 もう一人 admin2 というユーザを追加しましょう。-c オプションは初回のみです。ファイルがなければ新規作成し、既にファイルが作成されていれば上書きします。-c を省いて、ユーザ名を admin2 としてコマンドを入力します。
 $ htdigest /home/akane/digestpass "BIOHAZARD LEVEL 4" admin2
 Adding user admin2 in realm BIOHAZARD LEVEL 4
 New password:
 Re-type new password:
 $ cat digestpass
 admin:BIOHAZARD LEVEL 4:b28b9c50895dacaa50655efbcf01f8db
 admin2:BIOHAZARD LEVEL 4:ebc432e44550e90df6ec230de0c453ce
 このように admin, admin2 ユーザに対して "BIOHAZARD LEVEL 4" という場所に対する認証情報が書き込まれるようになります。

 ちなみに他の場所を認証する場合でも同じファイルに書き込みが出来ます。例えば "BIOHAZARD LEVEL 1" という場所で guest ユーザに対しての設定を行いたい場合は
 $ htdigest /home/akane/digestpass "BIOHAZARD LEVEL 1" guest
 Adding user guest in realm BIOHAZARD LEVEL 1
 New password:
 Re-type new password:
 このように指定することができます。cat でファイルをのぞくと、新しく LEVEL 1 という場所に対して guest ユーザの認証情報が登録されたことが分かります。

 $ cat digestpass
 admin:BIOHAZARD LEVEL 4:b28b9c50895dacaa50655efbcf01f8db
 admin2:BIOHAZARD LEVEL 4:ebc432e44550e90df6ec230de0c453ce
 guest:BIOHAZARD LEVEL 1:7061b4a856732e77a93c9c2d0213cf33

 さて次に .htaccess ファイルの設置です。もう一度設置条件を見直してみます。


 認証するファイルの置き場所は "/home/akane/digestpass" とします。
 認証する realm は "BIOHAZARD LEVEL 4" とします。
 認証するユーザ名は "admin" とします。パスワードは適当です。

 そして認証する URL は http://192.168.11.253/~akane/auth/ 、サーバ内のディレクトリは /home/akane/public_html/auth というパスになります。

 .htaccess ファイルは /home/akane/public_html/auth/.htaccess に設置します。ファイルの中身は次のようなものです。

 AuthType Digest
 AuthName "BIOHAZARD LEVEL 4"
 AuthDigestFile /home/akane/digestpass
 Require admin

//Apache2.2からAuthDigestFileの代わりにAuthUserFileにをつかう。
 あとはブラウザからアクセスしてみます。

 もし、Internal Server Error が出てしまって、エラー内容が
 /home/sakura/public_html/.htaccess: Invalid command 'AuthDigestFile', perhaps mis-spelled or defined by a module not included in the server configuration
 であれば、 [[mod_auth_digest.soのセットアップ・インストール>Apache/Tips/mod_auth_digest.soのセットアップ・インストール]]を参照して、mod_auth_digest.so の再コンパイルが必要です。

#ref(http://pocketstudio.jp/r_images/wiki_linux/2005/apache_digest.gif);

 ちょっと変わった認証画面になりますね。これは Internet Explorer 6 での画面表示です。realm = AuthName で指定した名前が認証する場所の名前として表示されます。あとは普通どおりユーザ名とパスワードを使って認証します。

 注意点としては Require に valid-user の指定が使えなくなりました。使おうとしても Internal Server Error になります。ログにも次のようなエラーが残るようになります。

 access to /~akane/auth/ failed, reason: unknown require directive:"valiid-user"

 実際試してみると、ほとんど Basic 認証と変わりません。もしサーバが Digest 認証に対応しているのであれば、安全に認証できる Digest 認証を用いるようにしたほうが何かと安全でしょう。

* うまくいかない時は [#aa6af680]

** エラー failed, reason: unknown require directive "xxxx" [#fd9f577b]

 .htaccess の記述が正しくないか、ユーザ名の指定が正しくない可能性があります。

 この場合は、まず動作確認のために

 Require valid-user

 このように、任意ユーザでの認証を受け付けられるように書き換えてみてみると良いです。あとは、

 tail -f /usr/local/apache/logs/error_log

 などのようにして、エラーログをリアルタイムで把握していくと、原因解決につながると思います。

----
** 参考資料 [#ud14fe7d]
- http://httpd.apache.org/docs-2.0/ja/mod/mod_auth_digest.html

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS