Geronimo はディレクトリー・サービスとして Apache Directory Server を利用しています。これは Apache Directory Project に含まれています。Geronimo は ApacheDS プロジェクトの内、以下の2つのプロジェクトを実装しています。
- ApacheDS Core
すべてのバックエンドのサブ・システムを含むサーバーのコア部分です。プロトコルに依存し、seda を利用して LDAP リクエストのサービスを行います。コアには JNDI プロバイダー、インターセプター・フレームワーク、インターセプター・サービス、スキーマ・サブ・システムとデータベース・サブ・システムを含みます。
- ApacheDS Shared
コアと maven プラグインとのプロジェクトの循環的依存性を排除するものです。一般的にモジュールを横断的に共有するどのようなコードもここで実行することによって、他のモジュールに依存しないようになります。
これら2つのプロジェクトの詳細については、以下の ApacheDS プロジェクトの URL を参照してください。
http://directory.apache.org/subprojects/apacheds/projects/index.html
今時点では、Geronimo は LDAP の参照機能のみを持っていて、編集することはできません。これは次の Geronimo のリリースで機能追加が計画されています。ldapbrowser/editor、jxplorer や gq などの外部 LDAP クライアントを利用して Geronimo のディレクトリー・サーバーの構成の編集を行ってください。
この文章は以下のセクションから構成されています。
LDAP サーバーの始動
今回の Geronimo のリリースでは、Apache Directory v0.92 が配布物の中にすでに含まれていますが、デフォルトでは始動していません。コマンド・ラインでデプロイヤー・ツールを利用するか、Geronimo 管理コンソールを通じて始動することができます。
管理コンソールを利用して、左側の navigation メニューにある System Modules をクリックし、org.apache.geronimo.configs/directory という名前のコンポーネントを Installed System Modules ポートレットから探し出してください。各コンポーネントの現在の状況と利用可能なコマンドが表示されています。
既に述べたように、このコンポーネントはデフォルトでは停止しています。Start をクリックすると、このサービスが利用できるようになります。
また、もし貴方が Geronimo のカスタム・バージョンを自身でビルドしているなら、Geronimo プラグインを通じて Apache Directory を後からインストールすることができます。
LDAP サンプル・アプリケーション
貴方に都合が良いように、サンプル・アプリケーションとデプロイメント・プランを zip ファイルにまとめました。
以下の URL からサンプル・アプリケーションをダウンロードしてください。
zip ファイルを展開すると ldap-sample-app が作られます。このディレクトリーが <ldap_home> として参照されます。
ここでは、貴方がすでに LDAP クライアントをインストールし、ディレクトリー・サーバーへの .ldif
ファイルのエクスポート/インポートができるものとします。
ソース・コード
SVN からこのサンプルのソースコードをチェックアウトすることができます。
svn checkout http://svn.apache.org/repos/asf/geronimo/samples/trunk/samples/ldap-sample-app
LDAP エントリーの追加
Geronimo が起動し、ディレクトリー・サービスが始動していることを確認してください。LDAP クライアントを始動し、接続プロファイルを以下の値で作成してください。
Host: |
<localhost> |
Port: |
10389 |
Base DN: |
ou=system |
User DN: |
uid=admin,ou=system |
Password: |
secret |
Geronimo ディレクトリー・サーバーへ接続すると、初期構成が表示されます。この構成はバックアップとして ldif ファイルをエクスポートできます。LDAP クライアントによってエクスポート/インポート手順には違いがあります。例えば、ldapsearch ツールを利用した初期構成のエクスポートは以下のコマンドで実行されます。
ldapsearch -h localhost -p 10389 -b "ou=system" -D "uid=admin,ou=system" -w secret -x "(objectclass=)"*
初期構成のエクスポートをすると、以下の例のような内容をもつ ldif ファイルが得られます。
dn: ou=system ou: system objectClass: organizationalUnit objectClass: top dn: uid=admin, ou=system displayName: Directory Superuser uid: admin userPassword:: c2VjcmV0 objectClass: inetOrgPerson objectClass: organizationalPerson objectClass: person objectClass: top sn: administrator cn: system administrator dn: ou=users, ou=system ou: users objectClass: organizationalUnit objectClass: top dn: ou=groups, ou=system ou: groups objectClass: organizationalUnit objectClass: top dn: ou=configuration, ou=system ou: configuration objectClass: organizationalUnit objectClass: top dn: ou=partitions, ou=configuration, ou=system ou: partitions objectClass: organizationalUnit objectClass: top dn: ou=services, ou=configuration, ou=system ou: services objectClass: organizationalUnit objectClass: top dn: ou=interceptors, ou=configuration, ou=system ou: interceptors objectClass: organizationalUnit objectClass: top dn: prefNodeName=sysPrefRoot, ou=system objectClass: extensibleObject prefNodeName: sysPrefRoot
次に、サンプル・アプリケーションの実行に必要なエントリーをインポートします。サンプル・アプリケーションに、そのエントリーのサンプルの .ldif ファイルが含まれています。このファイルは <ldap_home>/ldap-sample.ldif にあります。ldapmodify ツールでデータをインポートするには、以下のコマンドを実行してください。
ldapmodify -h localhost -p 10389 -D "uid=admin,ou=system" -w secret -x -a -f <ldap_home>/ldap-sample.ldif
以下の例に、ldap-sample.ldif ファイルの内容を示します。
# User: system dn: uid=system,ou=users,ou=system cn: John Doe sn: Doe givenname: John objectclass: top objectclass: person objectclass: organizationalPerson objectclass: inetOrgPerson ou: Human Resources ou: People l: Las Vegas uid: system mail: system@apachecon.comm telephonenumber: +1 408 555 5555 facsimiletelephonenumber: +1 408 555 5556 roomnumber: 4613 userPassword: manager # User: user1 dn: uid=user1,ou=users,ou=system cn: User sn: One givenname: User1 objectclass: top objectclass: person objectclass: organizationalPerson objectclass: inetOrgPerson ou: Human Resources ou: People l: Las Vegas uid: user1 mail: user1@apachecon.comm telephonenumber: +1 408 555 5555 facsimiletelephonenumber: +1 408 555 5556 roomnumber: 4613 userPassword: p1 # User: user2 dn: uid=user2,ou=users,ou=system cn: User sn: Two givenname: User2 objectclass: top objectclass: person objectclass: organizationalPerson objectclass: inetOrgPerson ou: Human Resources ou: People l: Las Vegas uid: user2 mail: user2@apachecon.comm telephonenumber: +1 408 555 5555 facsimiletelephonenumber: +1 408 555 5556 roomnumber: 4613 userPassword: p2 # Group: admin dn: cn=admin,ou=groups,ou=system objectClass: groupOfUniqueNames uniqueMember: uid=system,ou=users,ou=system uniqueMember: uid=user2,ou=users,ou=system cn: admin # Group: guest dn: cn=guest,ou=groups,ou=system objectClass: groupOfUniqueNames uniqueMember: uid=user1,ou=users,ou=system cn: guest
ファイルをインポートすると、5つのエントリーが無事追加されたことが通知されます。
LDAP レルムのデプロイ
LDAP サンプル・アプリケーションには、アプリケーション自身のデプロイ前にデプロイしておく必要のあるセキュリティ・レルムがあります。このレルムは <ldap_home>/ldap_realm.xml にあり、以下のような内容です。
<module xmlns="http://geronimo.apache.org/xml/ns/deployment-1.2"> <environment> <moduleId> <groupId>console.realm</groupId> <artifactId>LDAP_Sample_Realm</artifactId> <version>1.0</version> <type>car</type> </moduleId> <dependencies> <dependency> <groupId>org.apache.geronimo.configs</groupId> <artifactId>j2ee-security</artifactId> <type>car</type> </dependency> </dependencies> </environment> <gbean name="LDAP_Sample_Realm" class="org.apache.geronimo.security.realm.GenericSecurityRealm" xsi:type="dep:gbeanType" xmlns:dep="http://geronimo.apache.org/xml/ns/deployment-1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <attribute name="realmName">LDAP_Sample_Realm</attribute> <reference name="ServerInfo"> <name>ServerInfo</name> </reference> <xml-reference name="LoginModuleConfiguration"> <log:login-config xmlns:log="http://geronimo.apache.org/xml/ns/loginconfig-1.2"> <log:login-module control-flag="REQUIRED" wrap-principals="false"> <log:login-domain-name>LDAP_Sample_Realm</log:login-domain-name> <log:login-module-class>org.apache.geronimo.security.realm.providers.LDAPLoginModule</log:login-module-class> <log:option name="initialContextFactory">com.sun.jndi.ldap.LdapCtxFactory</log:option> <log:option name="connectionURL">ldap://localhost:10389</log:option> <log:option name="connectionUsername">uid=admin,ou=system</log:option> <log:option name="connectionPassword">secret</log:option> <log:option name="authentication">simple</log:option> <log:option name="userBase">ou=users,ou=system</log:option> <log:option name="userSearchMatching">uid={0}</log:option> <log:option name="userSearchSubtree">false</log:option> <log:option name="roleBase">ou=groups,ou=system</log:option> <log:option name="roleName">cn</log:option> <log:option name="roleSearchMatching">(uniqueMember={0})</log:option> <log:option name="roleSearchSubtree">false</log:option> </log:login-module> <log:login-module control-flag="OPTIONAL" wrap-principals="false"> <log:login-domain-name>LDAP_Sample_Realm-Audit</log:login-domain-name> <log:login-module-class>org.apache.geronimo.security.realm.providers.FileAuditLoginModule</log:login-module-class> <log:option name="file">var/log/login-attempts.log</log:option> </log:login-module> </log:login-config> </xml-reference> </gbean> </module>
このデプロイメント・プランは、Geronimo に対してすべての接続や検索に LDAP データベースが必要であることが記述されています。また、このプランではすべてのログイン処理についても login-attempts.log
というログファイルに記録するように記述されています。
ldap-realm.xml をデプロイするために、以下のコマンドを <geronimo_home>/bin ディレクトリーから実行してください。
java -jar deployer.jar --user system --password manager deploy <ldap_home>/ldap-realm.xml
デプロイすると、以下のような確認メッセージが表示されるでしょう。
D:\geronimo-tomcat6-jee5-2.0\bin>deploy deploy \samples\2.0\ldap-sample-app\ldap-realm.xml Using GERONIMO_BASE: D:\geronimo-tomcat6-jee5-2.0 Using GERONIMO_HOME: D:\geronimo-tomcat6-jee5-2.0 Using GERONIMO_TMPDIR: D:\geronimo-tomcat6-jee5-2.0\var\temp Using JRE_HOME: C:\Java\jdk1.5.0_06\\jre Deployed console.realm/LDAP_Sample_Realm/1.0/car
詳しくは 1.1.3.3.3. LDAPレルム セクションを参照してください。
デプロイメント・プラン
デプロイメント・プランは <ldap_home>/WEB-INF ディレクトリーにあります。geronimo-web.xml は Geronimo 固有のデプロイメント・プランです。何のセキュリティ・レルムを使うのかの詳細が記述され、セキュリティ構成における一意のエレメントを使った Geronimo 固有のネーム・スペースと同様に、ユーザー・ロールのマッピングが記述されます。一般的な他の種類のアプリケーションでは、まさにセキュリティというわけではありませんが、デプロイメント・プランにはそのプランの主たるネーム・スペースが与えられ、モジュールの一意名(任意です)、親モジュール構成 ID(これも任意です)、コンテキスト・ルートが記述されます。以下に例として Geronimo 仕様のデプロイメント・プランを示します。
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://geronimo.apache.org/xml/ns/j2ee/web-1.2"> <environment> <moduleId> <groupId>samples</groupId> <artifactId>LDAP_Sample</artifactId> <version>1.2</version> </moduleId> </environment> <context-root>/LDAP_Sample</context-root> <security-realm-name>LDAP_Sample_Realm</security-realm-name> <security> <default-principal realm-name="LDAP_Sample_Realm"> <principal class="org.apache.geronimo.security.realm.providers.GeronimoUserPrincipal" name="system"/> </default-principal> <role-mappings> <role role-name="content-administrator"> <realm realm-name="LDAP_Sample_Realm"> <principal class="org.apache.geronimo.security.realm.providers.GeronimoGroupPrincipal" name="admin" designated-run-as="true"/> <principal class="org.apache.geronimo.security.realm.providers.GeronimoUserPrincipal" name="system"/> </realm> </role> <role role-name="guest"> <realm realm-name="LDAP_Sample_Realm"> <principal class="org.apache.geronimo.security.realm.providers.GeronimoGroupPrincipal" name="guest" designated-run-as="true"/> <principal class="org.apache.geronimo.security.realm.providers.GeronimoUserPrincipal" name="user1"/> </realm> </role> </role-mappings> </security> </web-app>
デプロイメント・プランの最初の部分はわかりやすいのですが、セキュリティ構成は手が込んでいます。 <security-realm-name> は <security> 要素内の一連の <realms> 要素の定義に利用されています。
web.xml のセキュリティ・ロール(security roles)の記述によって、geronimo-web.xml はユーザーやグループがどの Geronimo セキュリティー・レルムに所属しているかを割り当てます。ログインしていないユーザーには、<default-principal> 要素によって定義された realm が付与されます。
本プロジェクトには 内容管理者(content-administrator) と ゲスト(guest) という2つの principal があります。ともに GeronimoGroupPrincipal と GeronimoUserPrincipal の2つの要素を持っています。principal には designated-run-as フラグがオンになっている要素がものがあり、これらは web.xml によって run-as ロールが付与されます。
これらのロール・マッピングは LDAP サーバーに実際に定義されているロール(どのユーザーがどのグループに所属するか)によって上書きされることに注意してください。結局レルムは、アプリケーションのデプロイメント・プランがどの検証方法を用いるかを定義しています。とはいえ、今回の例では XML スキーマ に従って principal とロール・マッピングを定義する必要があります。
以下にファイル位置によるセキュリティ制限を追加した web.xml デプロイメント記述の例(また、<ldap_home>/WEB-INF ディレクトリーに位置していること)を示します。
<?xml version="1.0" encoding="ISO-8859-1"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> <security-constraint> <web-resource-collection> <web-resource-name>Admin Role</web-resource-name> <url-pattern>/protect/*</url-pattern> </web-resource-collection> <auth-constraint> <role-name>content-administrator</role-name> </auth-constraint> </security-constraint> <security-constraint> <web-resource-collection> <web-resource-name>No Access</web-resource-name> <url-pattern>/forbidden/*</url-pattern> </web-resource-collection> <auth-constraint/> </security-constraint> <login-config> <auth-method>FORM</auth-method> <realm-name>ldap-realm-1</realm-name> <form-login-config> <form-login-page>/auth/logon.html?param=test</form-login-page> <form-error-page>/auth/logonError.html?param=test</form-error-page> </form-login-config> </login-config> <security-role> <role-name>content-administrator</role-name> </security-role> </web-app>
サンプル・アプリケーションのパッケージ
すべての要素が一意になっていて、ウェブ・アプリケーション・アーカイブ (.war) にサンプル・アプリケーションにパッケージされる必要があります。コマンド・ライン・ウィンドウを開き、<ldap_home> ディレクトリーに移動し、以下のコマンドを実行してください。
jar -cvf ldap-demo.war
このコマンドで <ldap_home> にあるすべてのファイルをパッケージします。.war ファイル内に必要はありませんが、ldap-realm.xml と ldap-sample.ldif ファイルも含まれます。
アプリケーションのデプロイとテスト
LDAP サンプル・アプリケーションをデプロイするために、Geronimo サーバーが始動していることを確認してください。コマンド・ライン・ウィンドウを開き、<geronimo_home>/bin ディレクトリーに移動し、以下のコマンドを実行してください。
java -jar deployer.jar --user system --password manager deploy <ldap_home>/ldap-demo.war
ウェブ・アプリケーションのデプロイが成功すると、以下に似たようなメッセージが表示されるでしょう。
D:\geronimo-tomcat6-jee5-2.0\bin>deploy deploy \samples\2.0\ldap-sample-app\ldap-demo.war Using GERONIMO_BASE: D:\geronimo-tomcat6-jee5-2.0 Using GERONIMO_HOME: D:\geronimo-tomcat6-jee5-2.0 Using GERONIMO_TMPDIR: D:\geronimo-tomcat6-jee5-2.0\var\temp Using JRE_HOME: C:\Java\jdk1.5.0_06\\jre Deployed samples/LDAP_Sample/1.2/war @ http://localhost:8080/LDAP_Sample
LDAP アプリケーションのテストは、ウェブ・ブラウザーを開き、以下の URL へ接続してください。
http://localhost:8080/LDAP_Sample
LDAP サンプル・アプリケーションの Welcome ページが表示されます。
Protect をクリックして、LDAP ディレクトリー・サーバーの認証を受けてください。
ユーザー名に system パスワードに manager を入力して Login をクリックしてください。ここで入力するユーザー名とパスワードは Geronimo ウェブ・コンソールへの接続時に利用するものと同じで、ディレクトリー・サーバーのデータベースに保存されています。ログインすると、以下のような画面が表示されます。
ここでは、前に LDAP レルムに与えたセキュリティ構成に基づいて LDAP ディレクトリー・サーバーでユーザー名とパスワードの検証が行われます。さて次は、welcome ページに戻り、Forbidden をクリックしてください。以下のような 403 - Forbidden HTTP エラーが表示されるでしょう。
利用しているウェブ・コンテナー (Jetty または Tomcat) に応じて、この画面は少し違うかもしれません。
この例でさらなるテストをするには、ldap-sample.ldif
に与えられている違うユーザで試してみてください。LDAP クライアントを利用して、違うグループのユーザーを追加/削除してください。変更はすぐに反映されます。(ウェブ・ブラウザーを閉じる必要があるかもしれません)