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レルムが使用されています。
この部分を設定例のようなJNDIレルムの設定に置き換えると、tomcat上でのBASIC認証などでActiveDirectoryを参照できます。
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
それぞれの設定について説明します。
ここに解説がない設定項目は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は日本語になっている場合も多いかも知れません。(ちなみに、日本語も通りました。)
ドメイン
今回は、domain.localというドメイン名でActiveDirectoryを構築してみました。
userBase="DC=domain,DC=local"
userSubtree="true"
roleBase="DC=domain,DC=local"
roleSubtree="true"
userBase、roleBaseがユーザやロールを検索する起点です。userSubtree、roleSubtreeをtrueとすることで、これより下階層も検索対象に含めます。
ユーザ名の設定
認証時のユーザ名をどの属性にマッピングするかという定義。
userSearch="(sAMAccountName={0})"
ユーザオブジェクトのsAMAccountNameという属性がどうやらWindowsにログインするときのユーザ名のようです。
認証ダイアログでのユーザ名もログインのときと同じにしたいので、この設定にしました。
ユーザ→グループを紐付けるユーザオブジェクトの属性
ユーザオブジェクトのmemberOf属性には、そのユーザが所属するグループ名が入っています。
userRoleName="memberOf"
この属性を使うとユーザとグループが関連付けられます。
グループをロールにマッピングする設定
roleNameは、ロール名=グループ名にしたいので、CNから取得することにします。
roleName="CN"
roleSearch="(member={0})"
グループオブジェクトのmember属性にそのグループに所属するユーザ名が入っています。
認証時に入力されたユーザ名とmember属性を引き当ててグループを検索する設定とします。
リファラー処理?
JNDIRealmのjavadocによると、ActiveDirectoryに対して認証を行う際は、デフォルトでは処理できないので、followをセットせよと書いてありました。
referrals="follow"