Apache は、ある特定のディレクトリへのアクセスに対してユーザー名とパスワードによるユーザー認証を行うことが可能です。Apcahe2.2 では認証に関連するモジュールが機能ごとに分割されるなど変更されています。主な関連モジュールは以下の表の通りです。
表 9-12. ユーザー認証に関連するモジュール
| モジュール | 説明 |
|---|---|
| mod_auth_basic | HTTPベーシック認証のフロントエンド提供。実際の認証機能は、mod_authn_file や mod_authn_dbm で提供されます。 |
| mod_auth_digest | HTTPダイジェスト認証のフロントエンド提供。実際の認証機能は、mod_authn_file や mod_authn_dbm で提供されます。 |
| mod_authn_file | ユーザーとパスワードのリストを格納したテキストファイルを使用したユーザー認証バックエンドを提供します。 |
| mod_authn_dbm | dbm パスワードファイルを使用したユーザー認証バックエンドを提供します。 |
| mod_authn_dbd | SQL データベースを使用したユーザー認証バックエンドを提供します。 |
| mod_authz_user | 認証されたユーザーに対するアクセス制御機能を提供します。 |
| mod_authz_groupfile | 認証されたユーザーがグループのメンバーかどうかによってWebページへのアクセスを制御します。 |
| mod_authz_owner | 認証されたユーザーがファイルシステムの所有ユーザー/所有グループかどうかによってWebページへのアクセスを制御します。 |
ベーシック認証は、標準的なユーザー認証方法で広く一般的に利用されていますが、ユーザー名、およびパスワードが暗号化されることなく平文で送信されてしまうためセキュリティ上の問題があります。しかし、SSL を利用したセキュアな Web サイトを構築することで通信を暗号化することが可能です(項9.22を参照)。
ベーシック認証におけるセキュリティーの脆弱性を補い、ユーザー名とパスワードを暗号化してユーザー認証を行う方法がダイジェスト認証です。ダイジェスト認証は、HTTP 1.1 の規格として RFC 2069 でも定義されていますが、比較的新しい Web ブラウザ(Mozilla 1.0、Netscape 7.0、Internet Explorer 6.0以降)でなければダイジェスト認証を利用できません。一般的には、ベーシック認証が広く利用されているのが現状です。
データベース認証は、データベースに登録されたユーザー情報を利用してユーザー認証を行います。データベースを使用することで、特に登録するユーザーが多い場合などは、ユーザー情報のメンテナンスが容易となるメリットがあります。
![]() | Apache2.0 で使用していた、PostgreSQL および MySQL 用のモジュール mod_auth_pgsql 、mod_auth_mysql は Apache2.2 では動作しない場合もありますので注意してください。 |
このガイドでは、最も標準的に利用されているベーシック認証とダイジェスト認証を行うための手順を解説します。なお、Apache のユーザー認証で使用されるユーザー名とパスワードは、Linux システムにおけるユーザーとは関係がありませんので注意してください。システムにアカウントが登録されていても、Apache のユーザー認証で参照されるパスワードファイルに登録がなければ、そのユーザーで Web サイトにアクセスすることはできません。
ベーシック認証のフロントエンド部分は、mod_auth_basic モジュールにより提供されます。また、バックエンドとして .htpasswd ファイルによる認証を利用するには mod_authn_file モジュールの読み込みが必要になります。/etc/httpd/conf/httpd.conf には以下の記述があり、それぞれがデフォルトで読み込まれています。
LoadModule auth_basic_module modules/mod_auth_basic.so LoadModule authn_file_module modules/mod_authn_file.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/html/ ディレクトリでベーシック認証を利用するための設定例です。
<Directory "/var/www/html/">
AuthUserFile /var/www/members/.htpasswd
AuthName "Members"
AuthType Basic
Require valid-user
</Directory> |
ベーシック認証のために追加したディレクティブは以下の通りです。
パスワードファイルのパスを指定します。
認証の対象となるディレクトリを識別するための名称を指定します。任意の名称を指定することができます。また、ここで指定した名称は Web ブラウザの認証ダイアログに表示されます。例えば、Web サーバー上で複数のディレクトリに異なる認証定義を行っていて、一人のユーザーがそれぞれにアクセスするための異なる権限のユーザー名とパスワードを保持している場合、いずれのユーザー名を Web サーバーに送信すべきであるのかを識別するための名称です。
認証方法を指定します。ベーシック認証の場合は Basic と指定し、ダイジェスト認証の場合は Digest と指定します。
アクセスを許可するユーザーを指定します。valid-user というキーワードは、パスワードファイルに登録したすべてのユーザーにアクセスを許可することを意味します。ユーザーごとに指定したい場合は、アクセスを許可するユーザー名をスペースで区切って指定します。
/etc/httpd/conf/httpd.conf の編集後は変更を反映させるために Apache の再起動が必要です。
# /etc/init.d/httpd restart |
Web ブラウザから、サーバーへアクセスすると認証ダイアログが表示されます。パスワードファイルに登録したユーザー名とパスワードに一致すれば、要求された Web ページが表示されます。
暗号化パスワードによるユーザー認証を定義します。ダイジェスト認証のフロントエンド部分は、mod_auth_digest モジュールにより提供されます。また、バックエンドとして .htpasswd ファイルによる認証を利用するには mod_authn_file モジュールの読み込みが必要になります。/etc/httpd/conf/httpd.conf には以下の記述があり、mod_auth_digest はデフォルトで読み込まれています。
LoadModule auth_digest_module modules/mod_auth_digest.so LoadModule authn_file_module modules/mod_authn_file.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/html/ ディレクトリ以下のアクセスにダイジェスト認証を利用するための httpd.conf の設定例です。
<Directory "/var/www/html">
AuthUserFile /var/www/members/.htdigest
AuthName "Members"
AuthType Digest
Require valid-user
</Directory> |
![]() | Apache2.2 では、ダイジェスト認証の場合にもパスワードファイルの指定に AuthUserFile ディレクティブを使用します。また、htdigest コマンドの実行時に指定した realm を、AuthName ディレクティブへ指定します。AuthType ディレクティブには、Digest と指定します。 |