JBossでDIGEST認証ができるようになったようです

はじめに。JBossでDIGEST認証?

JBossは、オープンソースJava EE Application Server*1です。市販のアプリケーションサーバ製品に引けを取らない性能と使い勝手の良さがあります。JBossApache TOMCATサーブレットエンジンとして搭載していますが、ログイン認証のモジュールはJBossのセキュリティフレームワーク(JBoss SX)に委譲するようにできています。*2JBoss 4.0.3まで、JBoss SXはDIGEST認証をサポートしていませんでした。個人的な意見としてコンテナマネジド認証では、DIGESTやBASICを使うよりもFORMを使うことが多いだろうと考えていたのですが、コンテナマネジド認証でDIGEST認証を使う機会に恵まれましたので、せっかくですのでJBoss 4.0.4で新しく実装されたDIGEST認証の機能を使ってみました。

JBossのインストール

JBossでDIGEST認証を使うには、ver. 4.0.4+が必要になります。現在入手できるJBossの最新版バイナリは、4.0.4 CR2ですので、これを入手してインストールします。*3

REALM名の決定

DIGEST認証ではREALM名が重要になります。どんな名前を選んでも良いですが、設定の中で何度か登場しますので、先に決定しておきましょう。ここでは、SampleRealmという名前にすることにします。

login-config.xmlファイルの記述

${JBOSS_HOME}/server/default/conf/login-config.xmlファイルの編集が必要になります。application-policyエレメントのname属性はjboss-web.xmlから参照されることになります。ここでは"SampleRealmDigestという名前に設定した例を示します。login-config.xmlファイルを編集して追加してください。*4

    


MD5
rfc2617
false
true
true
org.jboss.security.auth.spi.RFC2617Digest


JBossの起動

編集したlogin-config.xmlが有効になるように、JBossを再起動してください。

web.xmlへの変更

作成するウェブアプリケーションのweb.xmlを編集してDIGEST認証を適用します。




DIGEST
SampleRealm


AuthorizedUsers



restricted contents
/secure/*


AuthorizedUsers



この例では、AuthorizedUsersというroleに割り当てられたユーザだけが/secure/以下のコンテンツにアクセスできるようになります。認証はDIGEST認証が使われ、そのRealmはSampleRealmです。

jboss-web.xmlを記述する

web.xmlを配置するのと同じ場所、すなわちWEB-INF/にjboss-web.xmlというファイルを作成します。このファイルでどの認証モジュールのインスタンスを使うかを決定します。今回、SampleRealmDigestというインスタンス名を与えていますから、これを参照するように記述を行います。


java:/jaas/SampleRealmDigest

DIGEST認証のパスワードとロールを収めるファイルを用意する

DIGEST認証用のパスワードとロールを収めるファイル*5は、users.propertiesとroles.propertiesになります。拡張子からご想像いただけるように、これはJavaのpropertiesファイルの形式を取っています。users.propertiesには、ユーザ名=パスワードの形式。roles.propertiesには、ユーザ名=ロール名*6の形式です。これら二つのファイルは、各アプリケーションのために用意されるクラスローダによって読み込まれます。ですので、WEB-INF/classes以下においてしまっても良いですし、JBoss自体が参照するシステムクラスパスのどこかにいれてしまってもかまいません。しかしながら、開発段階では、やはりWEB-INF/classesディレクトリに配備するのがわかりやすくて良いと思います。

ところで、ここで重要な点が一つあります。users.propertiesに記載するパスワード値なのですが、A1ハッシュと呼ばれる値で格納しなければいけません。これは具体的には以下のようなデータになります。

MD5(ユーザ名:Realm名:平文パスワード)
つまり、users.propertiesファイルを準備するためには、事前にRealm名が決定している必要があり、かつハッシュ値を事前に計算しておく必要があるということになります。

A1ハッシュの計算

JBossは、このA1ハッシュの値を計算するルーチンを用意してくれていますので、これを使いましょう。
コマンドラインから以下のように入力することでA1ハッシュ値が出力されます。

$ java -cp ${JBOSS_HOME}/server/default/lib/jbosssx.jar org.jboss.security.auth.spi.RFC2617Digest ユーザ名 realm名 パスワード
実際にuser1のパスワードがpassword1であると仮定してSampleRealm用のハッシュを計算してみましょう。
$ java -cp ${JBOSS_HOME}/server/default/lib/jbosssx.jar org.jboss.security.auth.spi.RFC2617Digest user1 SampleRealm password1
RFC2617 A1 hash: e32f7d1d79180d0b1884d83a5e3f9097

これでA1ハッシュの値を得ることができましたので、これを元にusers.propertiesファイルを作成します。

user1=e32f7d1d79180d0b1884d83a5e3f9097
ユーザを定義しただけでは、ロールがアサインされませんから、roles.propertiesファイルも記述します。ここではA1ハッシュ値やRealm名を気にする必要はありません。
user1=AuthorizedUsers

ウェブアプリケーションの配備

これでDIGEST認証の設定が完了です。
今回、JBoss 4.0.4のドキュメントがまだ公式にリリースされていませんので、JBossのソース読みながらやってたので、少し手間取ってしまいました。

*1:J2EE Application Serverと呼んだほうがリズムが良いと思うのは私だけでしょうか・・・

*2:設定の詳細については、${JBOSS_HOME}/server/default/deploy/jbossweb-tomcat55.sar/server.xmlをご覧ください

*3:JBossのインストールと活用についての記事も書いていく予定ですが、今回はDIGEST認証を使うTIPSだけにフォーカスします。

*4:念のために申し上げますが、の前に記述してくださいね。

*5:正確にはorg.jboss.security.auth.spi.UsersRolesLoginModuleが参照するファイル

*6:複数ある場合にはカンマで区切って指定します