サードパーティー製認証モジュール!
サードパーティー製認証系モジュールの探し方
「第2回:組み合わせ可能な認証系モジュール(http://www.thinkit.co.jp/article/120/2/)」では、Apacheの認証系モジュールの仕組みを紹介しました。フロントエンドを担当するモジュールと、バックエンドを担当するモジュールの組み合わせで、バリエーションに富んだ認証方式を実現でき、その一例としてBasic認証や、DBMファイルを使ったユーザー情報管理、匿名ユーザー(anonymous)でのアクセスなどを取り上げました。
「第2回:組み合わせ可能な認証系モジュール(http://www.thinkit.co.jp/article/120/2/)」で取り上げた認証系モジュールはApacheに標準で採用されているモジュールでしたが、今回はサードパーティー製モジュールを取り上げ、概要やインストール方法を紹介します。
認証系モジュールに限らず、Apacheモジュールに関する仕様や方式は、広く公開されており、必要に応じて独自モジュールを作成することができます。
Apacheモジュールを開発する際に参考となるWebサイトとして「Developer Documentation for Apache 2.0(http://httpd.apache.org/docs/2.2/developer/)」「Module API References(http://modules.apache.org/reference.php)」などがあります。
こうして独自に作成されたモジュールは公開され、ネット上に見つけることができます。例えば「Apache Module Registry(http://modules.apache.org/)」には400を超えるサードパーティー製モジュールが登録されており、機能や名前をキーワードにモジュールを探し出すことができます。
まず上部のメニューから「Search」を選択し、図1のような検索画面を表示します。次に「Search String」に「auth」を入力し認証系(authentication)モジュールに関連するモジュールを表示します。100以上のモジュールが表示されますが、リンク切れのものや、メンテナンスが行われてないものも含まれているので注意してください。
なお「第2回:組み合わせ可能な認証系モジュール(http://www.thinkit.co.jp/article/120/2/)」でも説明したように、Apache2.2ではそれまでの認証システムと異なる仕組みを採用しているため、下位バージョンのモジュールと互換性がありません。モジュールを選択する際にはApache 2.2への対応も確認する必要があります。
またSourceForge.net(http://sourceforge.net/)でも多くのApache認証系モジュールが登録されています。「Apache authentication」などをキーワードにして検索することで、モジュールを見つけることができます。
サードパーティー製には、特定の要件で威力を発揮するもや、かゆいところに手の届くような機能を持つモジュールを多く見つけることができます。ただしテストが十分行われていないものや、指定された環境以外では動作しないものなど、品質が劣るものも多々あります。サードパーティー製モジュールを使用する際は、万全な動作が保証されているわけではないことを理解しておくようにします。
今回取り上げる認証系モジュール
以降では、2つのサードパーティー製モジュールを取り上げます。
1つ目は「mod_auth_timeout」です。このモジュールは「Idle timeouts for basic-auth schemes in Apache 2.2.(http://secure.linuxbox.com/tiki/tiki-index.php?page=mod_auth_timeout)」よりダウンロードできます。これは、ユーザー認証後、一定時間アクセスが行われなかった場合に、タイムアウトを発生させ、再アクセス時にユーザー認証を要求するモジュールです。
2つ目は「mod_auth_shadow」です。このモジュールはSourceForge.netのmod_auth_shadowのWebページ(http://sourceforge.net/projects/mod-auth-shadow)よりダウンロードできます。ユーザー情報の管理に/etc/shadowファイルを利用し、システムに登録されているユーザーに対し、Webアクセスを許可するモジュールです。
インストール作業は、Linuxディストリビューションの1つ、「CentOS 5.2」を例に解説しています。ほかのUNIX系OSでも、同様の作業が可能ですが、事前にgccなどの開発環境や、apxsコマンドなどのApacheモジュール開発ツールをインストールしておく必要があります。
apxsはApacheモジュールをビルドしてインストールするためのツール(APache eXtenSion tool)で、ソースからApacheをインストールした場合にはデフォルトで導入されますが、Apacheをバイナリパッケージでインストールした場合には、別途導入する必要があります。
例えばFedoraやCentOSでは「httpd-devel」として提供されており、「# yum install httpd-devel」を実行することでオンラインインストールが可能です。詳細は「第1回:モジュールのインストール!(http://www.thinkit.co.jp/article/120/1/3.html)」の3ページを参考にしてください。
コマンド実行例で、「$」プロンプトは一般ユーザーによる作業、「#」プロンプトはrootユーザーによる作業を表します。rootユーザーが直接使用できない場合には、sudoコマンドで代用します。また紹介しているインストール方法や設定ではセキュリティーに対する考慮が不十分ですので十分注意してください。
今回紹介する認証モジュールでは、Basic認証をフロントエンドに使用します。Basic認証の脆弱(ぜいじゃく)性については、「第2回:組み合わせ可能な認証系モジュール(http://www.thinkit.co.jp/article/120/2/)」で解説した通りです。こうした点を理解の上、導入作業を実施するようにします。
ユーザー認証でタイムアウトを設定する「mod_auth_timeout」
「mod_auth_timeout」はユーザー認証時にタイムアウトを設定するモジュールです。通常Basic認証では、クライアント側でWebブラウザを閉じるなどの操作が行われない限り、一度認証に成功したパスワードをWebブラウザで保持し、アクセスの度にユーザーがいちいち入力する手間を省いています。
しかし、オンラインバンキングなど、高いセキュリティーが求められるWebサイトでは、ユーザーが一定時間操作を行わなかった場合に、強制的にログアウトし、再度ログインを求めるような仕組みがとられています。
こうしたWebアプリケーションでは、Webフォームとセッション変数を使った認証方法が用いられています。セッション変数とはサーバー内に蓄えられる情報で、サーバーとクライアントのセッション情報に基づいて管理されたデータです。セッション変数を使うことで、コネクションレスなHTTPプロトコルでも、継続的に変数を持続させることができ、このセッション変数の有効期限を設定することで、ユーザー認証の有効期間を調整することができます。
今回紹介する「mod_auth_timeout」は、セッション変数を使用しないBasic認証でも、ユーザー認証のタイムアウトを発生させることができます。
ユーザーのログイン時間はDBMファイルを使って管理します。秒単位で有効期間を設定することができます。認証フロントエンドはBasic認証に限られますが、バックエンドはLDAPでもMySQLでもhtaccessファイルでも、自由に使用することができます。
mod_auth_timeoutのインストール
ソースファイルからインストールする方法を解説します。ここではLinuxディストリビューション「CentOS 5.2」での作業を例に解説をすすめます。
まずソースアーカイブをmod_auth_timeoutのページ(http://secure.linuxbox.com/tiki/tiki-index.php?page=mod_auth_timeout)からダウンロードし展開します。以下の例ではダウンロードにwgetコマンドを使用しています。
# wget http://secure.linuxbox.com/tiki/files/mod_auth_timeout-1.0.4.1.tar.gz
# tar xvf mod_auth_timeout-1.0.4.1.tar.gz
展開したディレクトリに移動し、「configure.sh」を実行します。この際apxsコマンド(またはapxs2)に対しパスが通っている必要があります。
# cd mod_auth_timeout-1.0.4.1
# ./configure.sh
作成されたMakefileに対し、makeコマンドを実行します。
# make
# make install
「make install」実行で、mod_auth_timeout.soファイルがモジュールディレクトリ(CentOSでは/usr/lib/httpd/modules/)にインストールされます。
次にApacheの設定ファイル「httpd.conf」を前回使用した基本的なbasic認証の設定(http://www.thinkit.co.jp/article/120/2/2.html)を元に、図2のように修正します。
「AuthTimeOut」でタイムアウト値を、「AuthTimeOutDBMFile」でログイン時間を管理するファイルを指定します。管理ファイルを設置するディレクトリには「/var/spool/auth_timeout/」を用意し、Apacheのデーモン権限で管理ファイルを作成・更新できるよう、オーナー情報を変更します。オーナー・グループ名にはApacheデーモンのものを使用します。一般的には「apache」が使用されていますが、「nobody」を使用するケースもあります。httpd.confの「User」と「Group」を確認します。
# mkdir /var/spool/auth_timeout/
# chown apache /var/spool/auth_timeout/
# chgrp apache /var/spool/httpd/auth_timeout/
設定完了後Apacheを起動、または再起動しmod_auth_timeoutを有効にします。apachectlコマンドを使用して再起動する場合は以下を実行します。
# apachectl restart
またはOSで用意された起動スクリプト(CentOSでは/etc/init.d/httpd)を利用する場合は以下を実行します。
# /etc/init.d/httpd restart
クライアントから、対象URL(図2の例では「http://サーバーのアドレス/restricted」)に対し、時間をあけてアクセスし、タイムアウトが働き、再度ユーザー名とパスワードの入力が促されることを確認します。なお筆者が試した限り、タイムアウトを120秒以下に設定することはできませんでした。300秒など、現実的な値を設定するようにします。
次は、「mod_auth_shadow」のインストールと設定について説明しましょう。
システムアカウントを利用する「mod_auth_shadow」
システムに登録されているユーザーに対し、Webアクセスを許可するには「mod_auth_shadow」を利用します。通常Basic認証では、Webアクセス独自のユーザー情報をhtpasswdコマンドなどで管理します。
一般的にユーザー情報をほかのサービスと共有する場合には、LDAPやRDBMSなどのバックエンドを利用しますが、ユーザー管理が簡素化される代わりに、追加されたシステムの運用や導入にかかる負担が増大します。
メールサービスやFTPサービスとともに、Webアクセスでも/etc/shadowファイルを利用できれば、システムユーザーにWebアクセスを解放することができます。またパスワードの変更や、ユーザー追加/削除と言った手段も、OSで提供されるものをそのまま利用することができます。
/etc/shadowファイルはパスワードを記録した重要なファイルです。そのためrootユーザー以外の一般ユーザー権限では、閲覧することができません。「mod_auth_shadow」以外にもシステムユーザーを共有できるモジュールを見つけることができますが、/etc/shadowファイルのパーミッションを変更する必要があり、サーバーを危険にさらすことになります。mod_auth_shadowなら/etc/shadowファイルのパーミッションやオーナーを変更する必要はありません。
mod_auth_shadowでは、モジュールと同時にインストールされるvalidateコマンドを使って/etc/shadowファイルを確認します。validateコマンドには、rootユーザーにしかできない作業を、一般ユーザーでも行えるよう「SetUID」が設定されます。そのため、/etc/shadowファイルに対する危険性は回避できたものの、validateコマンドに対する脆弱(ぜいじゃく)性が新たに発生します。外部から利用されないよう対策を施す必要があります。
またシステムユーザーを使用することで、Webアクセスを使った総当たり方式でパスワード詐取される可能性があります。そうした問題にも備えておく必要があります。
以降、mod_auth_shadowのインストール方法を紹介します。ただしシステムユーザーを利用するため、OSへの依存度が大きく、OSによってはmod_auth_shadowを利用できない場合があります。そうした場合には「mod_authnz_external(http://unixpapa.com/mod_authnz_external/)」など、ほかのモジュールを試します。
mod_auth_shadowのインストール
ソースファイルからインストールする方法を解説します。ここではLinuxディストリビューション「CentOS 5.2」での作業を例に解説をすすめます。
まずソースアーカイブをSourceForge.netのmod_auth_shadowのページ(http://sourceforge.net/projects/mod-auth-shadow)からダウンロードし展開します。
# wget http://downloads.sourceforge.net/mod-auth-shadow/mod_auth_shadow-2.2.tar.gz
# tar xvfz mod_auth_shadow-2.2.tar.gz
# cd mod_auth_shadow-2.2
展開したディレクトリに移動し、「make」を実行しますが、場合によっては図3のような修正が必要になります。「make install」後、mod_auth_shadow.soファイルがモジュールディレクトリ(CentOSでは/usr/lib/httpd/modules/)にインストールされます。また同時にvalidateコマンドもmakefileで指定したパス(/usr/sbinや/usr/local/sbin)にインストールされます。
# vi makefile (makefileを図3のように修正)
# make
# make install
次にApacheの設定ファイル「httpd.conf」を、前回使用した、基本的なBasic認証の設定(http://www.thinkit.co.jp/article/120/2/2.html)を元に、図3のように修正します。
「AuthShadow」で「on」を指定し、ユーザー情報に/etc/shadowファイルを使えるようにします。なお「Require group user」で、userグループに属するユーザーにだけWebアクセスを許可します。ユーザーの指定に「Require valid-user」などと指定した場合、/etc/shadowに登録された全ユーザーにWebアクセスを解放することになり、rootユーザーなど、特殊なアカウントでもアクセス可能になります。rootユーザーのパスワードを詐取されることが無いよう、一般ユーザーに限定するなどします。そのほかの設定はBasic認証を設定した前回のものと変わりません。
設定完了後Apacheを起動、または再起動しmod_auth_shadowを有効にします。apachectlコマンドを使用して再起動する場合は以下を実行します。
# apachectl restart
またはOSで用意された起動スクリプト(CentOSでは/etc/init.d/httpd)を利用する場合は以下を実行します。
# /etc/init.d/httpd restart
クライアントから、対象URL(図2の例では「http://サーバーのアドレス/restricted」)にアクセスし、システムに登録されたユーザーでアクセスできることを確認します。なお先ほど紹介したmod_auth_timeoutと併用し、認証タイムアウトを設定することもできます。
次回も引き続きサードパーティー製の認証系モジュールを取り上げます。