Apache | アクセス権限 | ダイジェスト認証の設定(htdigest)

基本(Basic)認証はほぼすべてのブラウザで使用できるが、ユーザー名とパスワード情報をサーバーへ送信するとき、平文(Plain)テキストで送信されるため、通信内容を途中で盗聴されるとユーザー名とパスワードが露出してしまう。

そこで、ブラウザとサーバー間で行われる通信に流れる情報をMD5で暗号化して通信する方式がダイジェスト認証である。

設定方法は基本認証の場合と似ている。順番に見ていく。

パスワードファイルの作成

まずパスワードファイルを作成する。基本認証の場合はApacheが提供するhtpasswd.exeを使用したが、ダイジェスト認証の場合はhtdigest.exeを使用する。このファイルが置かれている場所はhtpasswdと同じく、(Apacheインストールディレクトリ)/Apache24/binにある。

実行時の形式は次のとおりである。

htdigest オプション パスワードファイル 領域名 ユーザー名

作成するパスワードファイルを指定し、追加するユーザー名を指定する。パスワードファイルを新しく作成する場合は、オプション-cを指定する。既存のパスワードファイルにユーザーを追加する場合は、オプションを何も指定しない。

基本認証の場合と異なる点は、領域名を正しく指定することである。この領域名は、AuthNameで指定する領域名と同じでなければならない。

htdigest -c "C:/apache/passwd/digestpass" "Digest Auth" devkuma

上の例では、パスワードファイルをC:/apache/passwd/digestpass、領域名をDigest Auth、ユーザー名をdevkumaとして指定し、新しいパスワードファイルを作成している。作成時には、設定するパスワードを2回入力する必要がある。

C:\apache\Apache24\bin>htdigest -c "C:/apache/passwd/digestpass" "Digest Auth" devkuma
Adding password for devkuma in realm Digest Auth.
New password: ****
Re-type new password: ****

C:\apache\Apache24\bin>

作成されたパスワードファイルはテキストファイルなので、テキストエディタで開くことができる。

devkuma:Digest Auth:511a7e57972fad36f7687cf36cd57d6e

ユーザー名:領域名:パスワードの形式で、ユーザー1人につき1行で記述される。

httpd.confの設定

httpd.confの設定は、基本認証の場合とほぼ同じである。

AuthTypeにはBasicの代わりにDigestを指定し、AuthNameにはパスワードファイルを作成するときに指定したものと同じ領域名を指定する。パスワードファイルの指定は、以前のバージョンではAuthDigestFileを使用していたようだが、Apache 2.2以降ではAuthUserFileを使用する。

<Directory "${SRVROOT}/htdocs/admin">
    AuthType Digest
    AuthName "Digest Auth"
    AuthUserFile "C:/apache/passwd/digestpass"
    Require valid-user
</Directory>

モジュールの追加

ダイジェスト認証を使用する場合は、auth_digest_moduleモジュールをロードする必要がある。デフォルトではロードしないようになっている。httpd.confファイルでauth_digest_moduleを検索してみる。71行目付近に説明がある。

LoadModule allowmethods_module modules/mod_allowmethods.so
LoadModule asis_module modules/mod_asis.so
LoadModule auth_basic_module modules/mod_auth_basic.so
#LoadModule auth_digest_module modules/mod_auth_digest.so <--------- デフォルトではロードしないようコメントになっている。
#LoadModule auth_form_module modules/mod_auth_form.so
#LoadModule authn_anon_module modules/mod_authn_anon.so

auth_digest_moduleに対するLoadModuleの前に#が書かれている場合は、#を削除する。これで次回からauth_digest_moduleモジュールがロードされる。

LoadModule asis_module modules / mod_asis.so
LoadModule auth_basic_module modules / mod_auth_basic.so
LoadModule auth_digest_module modules / mod_auth_digest.so  <--------- `#`を削除してコメントを解除した。
#LoadModule authn_anon_module modules / mod_authn_anon.so
#LoadModule authn_dbm_module modules / mod_authn_dbm.so

ダイジェスト認証を試す

では、ドキュメントルート配下のadminディレクトリでダイジェスト認証を設定する。使用するパスワードファイルは、先ほど作成したものをそのまま使用する。

<Directory "${SRVROOT}/htdocs/admin">
    AuthType Digest
    AuthName "Digest Auth"
    AuthUserFile "C:/apache/passwd/digestpass"
    Require valid-user
</Directory>

ブラウザでhttp://localhost/admin/admin.htmlにアクセスすると、次のように認証ダイアログが表示される。

Chromeで接続した場合

ダイジェスト認証

Microsoft Edgeで接続した場合

ダイジェスト認証

認証ダイアログ画面は基本認証の場合とは少し異なるが、基本的には同じである。正しいユーザー名とパスワードを入力して認証を通過すると、そのページが表示される。

ダイジェスト認証

認証ダイアログ画面で「キャンセル」ボタンをクリックすると、次のようなエラー表示が行われ、リクエストは終了する。

ダイジェスト認証

なお、パスワードファイルを作成するときにユーザーへ設定した領域名と、AuthNameで設定した領域名が異なる場合、ユーザー名とパスワードが一致していても認証されない。