9.17. ユーザー認証(mod_auth、mod_auth_digest)

Apache は、ある特定のディレクトリへのアクセスに対してユーザー名とパスワードによるユーザー認証を行うことが可能です。Apcahe で利用可能なユーザー認証は、大きく以下の3種類があげられます。

ベーシック認証は、標準的なユーザー認証方法で広く一般的に利用されていますが、ユーザー名、およびパスワードが暗号化されることなく平文で送信されてしまうためセキュリティ上の問題があります。しかし、SSL を利用したセキュアな Web サイトを構築することで通信を暗号化することが可能です(項9.23を参照)。

ベーシック認証におけるセキュリティーの脆弱性を補い、ユーザー名とパスワードを暗号化してユーザー認証を行う方法がダイジェスト認証です。ダイジェスト認証は、HTTP 1.1 の規格として RFC 2069 でも定義されていますが、比較的新しい Web ブラウザ(Mozilla 1.0、Netscape 7.0、Internet Explorer 6.0以降)でなければダイジェスト認証を利用できません。一般的には、ベーシック認証が広く利用されているのが現状です。

データベース認証は、データベースに登録されたユーザー情報を利用してユーザー認証を行います。データベースを使用することで、特に登録するユーザーが多い場合などは、ユーザー情報のメンテナンスが容易となるメリットがあります。PostgreSQL、MySQL など、Linux で広く使用されているオープンソースデータベースは、Apache のデータベース認証に対応したモジュールが提供されています。利用するには、これらデータベースに対応するモジュール(mod_auth_pgsql、mod_auth_mysql)を組み込む必要があります。

このガイドでは、最も標準的に利用されているベーシック認証とダイジェスト認証を行うための手順を解説します。なお、Apache のユーザー認証で使用されるユーザー名とパスワードは、Linux システムにおけるユーザーとは関係がありませんので注意してください。システムにアカウントが登録されていても、Apache のユーザー認証で参照されるパスワードファイルに登録がなければ、そのユーザーで Web サイトにアクセスすることはできません。

9.17.1. ベーシック認証

ベーシック認証は、mod_auth モジュールにより提供されます。/etc/httpd/conf/modules には以下の記述があり、mod_auth はデフォルトで読み込まれています。

LoadModule auth_module          /usr/lib/httpd/modules/mod_auth.so

ベーシック認証を利用するには、パスワードファイルを作成し、そのファイルへユーザーを登録します。パスワードファイルを作成するには、htpasswd コマンドを使用します。以下の例では、/var/www/members ディレクトリにパスワードファイル .htpasswd を作成し、taro というユーザーを登録しています。

# mkdir /var/www/members/
# htpasswd -c /var/www/members/.htpasswd taro
New password:secret
Re-type new password:secret
Adding password for user taro

このように、新規にパスワードファイルを作成する場合のみ -c オプションを指定します。パスワードファイルのファイル名や作成するディレクトリは任意です。

注意

作成したパスワードファイルに新規ユーザーを登録する場合や既存のユーザーのパスワードを変更する場合は、-c オプションを指定する必要はありません。誤って指定すると、既存のパスワードファイルは上書きされますので注意してください。

作成したパスワードファイルを使用したユーザー認証を行うには、/etc/httpd/conf/httpd.conf または .htaccess の編集が必要です。以下は、/var/www/members/ ディレクトリでベーシック認証を利用するための設定例です。

<Directory "/var/www/members">
    AuthUserFile /var/www/members/.htpasswd
    AuthName "Members"
    AuthType Basic
    Require valid-user
</Directory>

ベーシック認証のために追加したディレクティブは以下の通りです。

AuthUserFile file-path

パスワードファイルのパスを指定します。

AuthName auth-domain

認証の対象となるディレクトリを識別するための名称を指定します。任意の名称を指定することができます。また、ここで指定した名称は Web ブラウザの認証ダイアログに表示されます。例えば、Web サーバー上で複数のディレクトリに異なる認証定義を行っていて、一人のユーザーがそれぞれにアクセスするための異なる権限のユーザー名とパスワードを保持している場合、いずれのユーザー名を Web サーバーに送信すべきであるのかを識別するための名称です。

AuthType Basic|Digest

認証方法を指定します。ベーシック認証の場合は Basic と指定し、ダイジェスト認証の場合は Digest と指定します。

Require entity-name [entity-name] ...

アクセスを許可するユーザーを指定します。valid-user というキーワードは、パスワードファイルに登録したすべてのユーザーにアクセスを許可することを意味します。ユーザーごとに指定したい場合は、アクセスを許可するユーザー名をスペースで区切って指定します。

/etc/httpd/conf/httpd.conf の編集後は変更を反映させるために Apache の再起動が必要です。

# /etc/init.d/httpd restart

Web ブラウザから、サーバーへアクセスすると認証ダイアログが表示されます。パスワードファイルに登録したユーザー名とパスワードに一致すれば、要求された Web ページが表示されます。

9.17.2. ダイジェスト認証(mod_auth_digest)

暗号化パスワードによるユーザー認証を定義します。ダイジェスト認証は、mod_auth_digest モジュールにより提供されます。/etc/httpd/conf/modules には以下の記述があり、mod_auth_digest はデフォルトで読み込まれています。

LoadModule auth_module_digest          /usr/lib/httpd/modules/mod_auth_digest.so

ベーシック認証の手順と大きな違いはありません。最初にパスワードファイルを作成し、そのファイルへユーザーを登録します。ダイジェスト認証のパスワードファイルを作成するには、htdigest コマンドを使用します。

# mkdir /var/www/members
# htdigest -c /var/www/members/.htdigest "Members" taro
Adding password for taro in realm Members.
New password:secret
Re-type new password:secret

htpasswd コマンドとの違いは、realm と呼ばれるパラメータを指定する必要があることです。この例では、Members を指定しています。realm には、認証の対象となるディレクトリを区別するための名前を任意に指定します。

注意

作成したパスワードファイルに新規ユーザーを登録する場合や既存のユーザーのパスワードを変更する場合は、-c オプションを指定する必要はありません。誤って指定すると、既存のパスワードファイルは上書きされますので注意してください。

以下は、/var/www/members/ ディレクトリ以下のアクセスにダイジェスト認証を利用するための httpd.conf の設定例です。

<Directory "/var/www/members">
    AuthDigestFile /var/www/members/.htdigest
    AuthName "Members"
    AuthType Digest
    Require valid-user
</Directory>

ダイジェスト認証の場合は、パスワードファイルの指定に AuthDigestFile ディレクティブを使用します。また、htdigest コマンドの実行時に指定した realm を、AuthName ディレクティブへ指定します。AuthType ディレクティブには、Digest と指定します。