TOMCAT:ActiveDirectoryで認証するためのJNDIRealmの作り方

設定例

ドメイン名:domain.local
接続アカウント:connector 接続パスワード:password
サーバー名:host.domain.local
TOMCATのroleをActiveDirectoryのグループにマッピング


<Realm className="org.apache.catalina.realm.JNDIRealm"
debug="99"
connectionName="CN=connector,OU=people,DC=domain,DC=local"
connectionPassword="password"
connectionURL="ldap://host.domain.local:389"
userBase="DC=domain,DC=local"
userSearch="(sAMAccountName={0})"
userSubtree="true"
userRoleName="memberOf"
roleBase="DC=domain,DC=local"
roleName="CN"
roleSearch="(member={0})"
roleSubtree="true"
referrals="follow" />

解説

tomcatのデフォルトの設定では、認証用にUserDatabaseレルムが使用されています。


<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
この部分を設定例のようなJNDIレルムの設定に置き換えると、tomcat上でのBASIC認証などでActiveDirectoryを参照できます。

それぞれの設定について説明します。
ここに解説がない設定項目はtomcatのマニュアル(JNDIレルム)を参照。
また、ADSI EDIT(Windows標準のツール)やLDAP Browser/Editor(JavaベースのLDAPビューア)をつかうとユーザやグループの属性をLDAPを通じて確認することができます。

ActiveDirectory接続設定


connectionName="CN=connector,OU=people,DC=domain,DC=local"
connectionPassword="password"

ActiveDirectoryに接続するためのアカウント設定です。
connectionNameには接続に使用するユーザのDNを記述します。Windowsにログインするときのユーザとパスワードではなく、ldap的ユーザ名です。
なので、CNは日本語になっている場合も多いかも知れません。(ちなみに、日本語も通りました。)

ドメイン


userBase="DC=domain,DC=local"
userSubtree="true"
roleBase="DC=domain,DC=local"
roleSubtree="true"
今回は、domain.localというドメイン名でActiveDirectoryを構築してみました。
userBase、roleBaseがユーザやロールを検索する起点です。userSubtree、roleSubtreeをtrueとすることで、これより下階層も検索対象に含めます。

ユーザ名の設定


userSearch="(sAMAccountName={0})"
認証時のユーザ名をどの属性にマッピングするかという定義。
ユーザオブジェクトのsAMAccountNameという属性がどうやらWindowsにログインするときのユーザ名のようです。
認証ダイアログでのユーザ名もログインのときと同じにしたいので、この設定にしました。

ユーザ→グループを紐付けるユーザオブジェクトの属性


userRoleName="memberOf"
ユーザオブジェクトのmemberOf属性には、そのユーザが所属するグループ名が入っています。
この属性を使うとユーザとグループが関連付けられます。

グループをロールにマッピングする設定


roleName="CN"
roleSearch="(member={0})"
roleNameは、ロール名=グループ名にしたいので、CNから取得することにします。
グループオブジェクトのmember属性にそのグループに所属するユーザ名が入っています。
認証時に入力されたユーザ名とmember属性を引き当ててグループを検索する設定とします。

リファラー処理?


referrals="follow"
JNDIRealmのjavadocによると、ActiveDirectoryに対して認証を行う際は、デフォルトでは処理できないので、followをセットせよと書いてありました。

試した環境

ActiveDirectory:Windows2003ServerR2180日評価版
TOMCAT:5.5.20
JDK:1.5.0_07