前から作ろうと思いつつ放置していたApache側でHTMLフォーム認証を行うモジュールを書いてみた。これでPHPだJava ServletだCGIだ関係なく、共通でフォーム認証が利用できます。
というわけでmod_auth_formモジュールです。mod_auth_form-0.0.1.tar.gzこれをApacheに組み込むと、静的なHTMLや画像から、動的なCGI・PHP・Java Servletなどなど、Apacheが取り扱う全てのコンテンツに対してHTMLフォームベースのユーザ認証を行うことができます。
ユーザの情報は普通のBasic認証の場合と同じようにhtpasswdコマンドのパスワードファイルを使用します。なので既存のBasic認証からの移行も簡単。設定例はこんな感じです。
<Directory /path/to/directory> AuthForm On AuthFormPasswordFile /path/to/passwd </Directory>当然、.htaccessで設定もできます。ちなみにデフォルトの認証画面は味も素っ気もない簡素な物なので、別途AuthFormLoginPageディレクティブで認証画面に使用するHTMLを指定して、任意の認証画面を表示できます。
独自の認証画面用に指定するHTMLは次のお約束を守る必要が有ります。
- FORMのaction属性は action="apache_security_check"を指定する
- FORMのmethod属性はmethod="POST"を指定する
- ユーザ名のフィールドはname="apache_username"を指定する
- パスワードのフィールドはname="apache_password"を指定する
mod_auth_formmはAuthFormディレクティブがOnのリソースへのアクセスには、所定のHTTP Cookieを持ったクライアントのみに限定します。このCookieには
- ユーザ名
- 認証有効期限
- 上記(1)(2)と秘密鍵を組み合わせたHMAC
よって一度認証されたクライアントに対しては次の要素のチェックだけなので、認証に際しての負荷は誤差の範囲に収まる程度です。
- (3)は正しいHMACか(Cookieが改竄されていないか)
- (2)の有効期限は過ぎていないか
また、認証結果というかユーザ名についてはApacheがリクエスト情報保持に使用しているフィールド(r->connection->userとAuthorizationヘッダ)にキチンとセットしているので、CGIの場合は環境変数REMOTE_USERで、Java Servletの場合はRequest.getRemoteUser()から、PHPの場合は$_SERVER['PHP_AUTH_USER']などから認証済みのユーザ名を参照できます。
というわけで、Apacheをプラットフォームとする各種のWebアプリケーションや、静的なコンテンツに対して統合的にHTML Formベースのユーザ認証が行えるようになります。
ネタの背景
「こんなのTomcatとかのサーブレットコンテナやPHP単体でもできるじゃーん」とか言われるかもしれませんが、他のプログラミング環境(?)と混在ができない、静的なコンテンツの配信時に余計な負荷がかかる、など様々な問題が有ります。あ、たしかにmod_auth_cookieモジュールをつかっても似たような物は実装できますけどね(でも認証画面を差し込む事はできませんけど)。特に異種環境が混在する場合・したい場合・せざるを得ない場合、ユーザ認証やセッション情報の共有という話はよくあがります。「Java ServletとPHPが混在するWebサイトで、どうやってユーザ認証やセッション情報を共通化・共有したらよいか」というお話は結構聞きますよね? そしてそのとき出てくるソリューションはあまり格好良くないのもまた常だったり。
最初から最後(?)まで単一の仕組みでWebサイトをメンテナンスできればそれはとても幸せなことです。しかしながら人的リソースの問題やコストの問題で、既存の仕組みとは異なる仕組みでWebサイトを拡張せざるを得ない場合が多々有ります。
某潜水艦艦長は最後に「地球のことは海から解決した方がいい」と言いました。これを真似して私は「認証やアクセス制御は入り口で解決した方がいい」とか言ってみたり。この場合の「入り口」はもちろんApacheなどのHTTPの事。入った先で勝手に実装されると、あとで別の場所で困るよねという事で。これは現実の世界でも同じ事ですよね。
そーいえばリバースProxy等の実装でこの類いの仕組みを定価6,000万円ぐらいで売っているベンダーが居たような居なかったような。Atami Authentication Suiteとか言って、商業化前提のオープンソースプロジェクトを妄想してみる罠。というわけでスポンサー募集(またかよっ)