組み合わせ可能な認証系モジュール
Apache 2.2で変更された認証モジュールの仕組み
「第1回:モジュールのインストール!(http://www.thinkit.co.jp/article/120/1/)」の後半で、Apacheの認証系モジュールについてふれました。認証系モジュールはApache 2.2で大きく変更された点の1つです。Apache 2.0で使用できたモジュールファイルや設定内容でも、2.2ではそのまま使用できない場合があります。また2.2では役割や機能でモジュールを組み立てられるよう改善されています。
今回は最初にBasic認証のインストールを例に、3タイプのモジュールの基本的な役割を解説します。後半ではモジュールの組み合わせで認証システムのバリエーションを増やす方法を紹介します。
Apacheで利用な可能な認証方式には、「ホストベース認証」と「パスワード認証」があります。ホストベース認証はIPアドレスやドメイン名でクライアントを認証し、パスワード認証はユーザー名とパスワードでクライアントを認証します。
さらにパスワード認証には、パスワードの送信方法の違いで、「Basic認証」方式と「Digest認証」方式に分類されます。クライアントとWebサーバー間で行われる、認証要求とそれに対するレスポンスの過程で、「Basic認証」方式では平文パスワードを使用し、「Digest認証」ではパスワードから導かれたハッシュ値を使用します。
なお、Basic認証は実際にはBase64でエンコードされていますが、Base64は簡単な手続きで復号できます。Base64は暗号化のための手段というより、バイナリデータをテキストデータに変換するような用途で使用されるため、ここでは平文パスワードとしました。
セキュリティーに配慮した場合、Digest認証方式が好ましい場合もありますが、ユーザー情報の管理が複雑になるため、あまり使用されることはありません。ネットバンキングやオンライントレードなど、ユーザー認証が要となるWebサイトでは、HTMLフォームを使った独自の認証アプリケーションが利用されています。
Apacheのパスワード認証、とりわけBasic認証は、一時的なフォルダーの共有や、限られたメンバーに短期間だけコンテンツを公開するといった、手っ取り早く認証機能を利用する場合に用いられます。
3タイプの認証モジュールの役割
「第1回:モジュールのインストール!(http://www.thinkit.co.jp/article/120/1/)」で、1つの認証方法を実現するために、役割の異なる3タイプのモジュールを組み合わせて使用することを解説しました。
各モジュールは役割が分かるよう命名されており、「mod_auth_○○」は認証の方法を提供するモジュール、「mod_authz_○○」は承認(アクセス制御)を提供するモジュール、「mod_authn_○○」は認証バックエンド(ユーザー情報の保存読み出し)をサポートするモジュールとして利用します。
「認証」はユーザーを特定し、識別するための手順です。ユーザー名とパスワードの組み合わせで、本人と特定するようなプロセスになります。「承認」では識別されたユーザーやクライアントに対し、どのようなアクセスが許可(または禁止)されているかを照合し、アクセスを受け入れるか拒絶するか判断します。これら認証、承認するためのユーザー情報や、制限の内容を記載した情報へのアクセス方法が「認証バックエンド」で提供されます。
Basic認証を使ったパスワード認証では、「mod_auth_basic」「mod_authz_user」「mod_authn_file」の3つのモジュールを組み合わせ使用します。mod_auth_basicはBasic認証を提供するモジュールとして、mod_authz_userはユーザー単位でアクセス制限を実施するためのモジュールとして、mod_authn_fileはユーザー情報の保存や読み出しのためのモジュールとして利用します。
これら3つのモジュールは、Apacheのインストール時に標準でインストールされます。意図的にモジュールを除外してApacheをインストールしていない限り、利用するための新たな作業は発生しません。「httpd -M」を実行しモジュール一覧を表示すると、その中にauth_basic_module、authz_user_module、authn_file_moduleが含まれていることが確認できるでしょう。
次のページでは、Basic認証が正常に設定されたApacheで、認証系モジュールをわざと外しエラーを発生させます。そのエラー内容からそれぞれのモジュールの働きを読み取ります。
Basic認証の設定
Basic認証のための設定は図2のとおりです。これはhttpd.confファイルに記述します。Apache起動時に、読み込むモジュールを追加するには、冒頭3行のような「LoadModule」を使用しますが、Basic認証のためのモジュールは、標準で設定されているため追加の必要はありません。
続く「
ほかにも認証制限を実施しているディレクトリやURLがある場合には、「AuthName」に指定する文字列を重複しないようにします。この文字列をもとにWebブラウザはユーザー名とパスワードを記憶します。
パスワード認証が必要なURLにアクセスした場合には、Webブラウザは記憶している文字列と、サーバーから送られてくる文字列を比較し、アクセスしたことがあるURLか、もしアクセスしたことがあれば、その時パスワード認証に成功していたかどうか判断します。もしそうであれば記憶されたユーザー名とパスワードを使ってURLにアクセスし、ユーザーが直接、ユーザー名やパスワードを入力する手間を省きます。AuthNameで指定された文字列は、パスワード入力画面に表示されるだけでなく、このような用途にも使用されています。
「AuthUserFile」ではユーザー名とパスワードを記載したユーザー情報ファイルを指定します。ユーザー情報ファイルの作成、更新には以下のように「htpasswd」コマンドを使用します。
# htpasswd -c /etc/httpd/conf/htpasswd.dat user
(「/etc/httpd/conf/htpasswd.dat」ファイルを新規作成する場合。「user」は登録するユーザー名)
# htpasswd /etc/httpd/conf/htpasswd.dat user
(作成済みのファイルに、ユーザー「user」を追加する場合)
ここまでが、一般的なBasic認証の設定です。設定終了後Apacheを再起動し、Basic認証が機能していることを確認します。
エラーログから認証系モジュールの役割を知る
次に3タイプのモジュールの役割を理解するために、順番に「LoadModule」行をコメントアウトします。コメントアウトには「#」を行頭に挿入します。例えば1行目をコメントアウトし、「#LoadModule auth_basic_module modules/mod_auth_basic.so」とした場合、認証制限されたURLへアクセスすると「configuration error: couldn't check user. No user file?: /foo」と、正しいユーザーかどうかチェックすることができない(=認証できない)といった内容をエラーログに出力します。
また2行目「mod_authz_user」をコメントアウトした場合、「configuration error: couldn't check access. No groups file?: /foo/」といったエラーで、ユーザーアクセスを制御(=アクセス承認)できていないことが分かります。
3行目の「mod_authn_file」をコメントアウトした場合には、設定ファイルの構文チェックで引っかかり、Apacheを起動することさえできません。その時に表示されるログは「Invalid command 'AuthUserFile', perhaps misspelled or defined by a module not included in the server configuration」といったもので、「AuthUserFile」ディレクティブを使用できない(=ユーザー情報の保存読み出しができない)ことが分かります。
さらに各モジュールの働きを理解するために、次のページでは新たなモジュールを組み合わせ、Basic認証をアレンジします。
新たな認証系モジュールを組み合わせる
ここで認証バックエンドを提供するモジュールを変更してみましょう。フロントエンドの認証はmod_auth_basic、承認モジュールはmod_authz_userをそのまま使います。ユーザー情報の読み出し・保存を行うモジュールのみ新たなモジュールを利用します。
例えばApacheには、DBMファイルへのアクセスを可能にするモジュール「mod_authn_dbm」が用意されています。mod_authn_fileで提供される機能に比べ、高速なユーザー検索が可能です。
「mod_authn_file」を使った場合、ユーザー情報は1行1ユーザーで記録され、エディターで編集することも可能です。しかし簡易的な反面、登録ユーザー数が膨らんだ場合に、検索に時間がかかります。一方「mod_authn_dbm」が提供するDBMファイルは、検索に優れ、ユーザー認証時のパフォーマンスを改善することができます。
設定は図3の上のようになります。LoadModuleでmod_authn_dbm.soを読み込み、AuthDBMUserFileディレクティブでDBMファイルを指定します。その際、同時にAuthBasicProviderディレクティブで「dbm」と指定するようにします。
前ページの「mod_authn_file」を使った設定では、そのようなディレクティブの指定は不要でしたが、省略されていただけで、実際には「AuthBasicProvider file」と指定されていた場合と同様の働きをしています。今回「mod_authn_dbm」に変更したことで、fileに替わってdbmを指定し、DBMファイルを使用できるようにします。
DBMファイルを作成・更新するには「htdbm」コマンドを使用します。詳しいコマンドの使用方法はオンラインマニュアル(# man htdbm)などを参考にしてください。
# htdbm -c /etc/httpd/conf/htdbm.dat user
(「/etc/httpd/conf/htdbm.dat」ファイルを新規作成する場合。「user」は登録するユーザー名)
# htdbm /etc/httpd/conf/htdbm.dat user
(作成済みのファイルに、ユーザー「user」を追加する場合)
3タイプの認証系モジュールのうち、バックエンドを受け持つモジュールを交換することで、フロントエンドはBasic認証のまま、バックエンドにDBMファイルを利用ことができるようになりました。
認証系モジュールのよくある組み合わせ
交換可能なのはバックエンドを受け持つモジュールだけではありません。フロントエンドのモジュールを「mod_auth_basic」から「mod_auth_digest」に交換することで、Digest認証を利用できるようになります。
ほかにも「mod_authn_anon」を使用することで匿名FTPサーバーのように、匿名サイトを公開することができます。匿名サイトでは、ユーザー名に「anonymous」、パスワードに「メールアドレス」を入力することで、誰でも利用できます。その場合は図3の下のように設定します。
詳細は公式サイトの「Apache モジュール mod_authn_anon(http://httpd.apache.org/docs/2.2/ja/mod/mod_authn_anon.html)」を確認してください。
承認機能を受け持つモジュールでも、「mod_authz_user」に替えて「mod_authz_host」を導入することで、クライアントのIPアドレスやドメイン名で、承認(アクセス制御)を行うことができるようになります。
今回、Apacheに標準的に採用されているモジュールを中心に、認証系モジュールを取り上げました。Apacheを独自にソースからインストールした場合や、利用したバイナリパッケージによっては、ここで紹介したモジュールがインストールされていない場合があります。その場合でもソースからのインストールなど、比較的簡単な操作で導入できます。
認証系モジュールは標準的なもの以外にも、サードパーティー製など多くのモジュールを利用することができます。次回は少し特殊なサードパーティー製の認証系モジュールを取り上げます。