第3章 レガシーセキュリティーサブシステム
3.1. LDAP を使用するようにセキュリティードメインを設定する手順
セキュリティードメインは、ログインモジュールを使用して認証および承認に LDAP サーバーを使用するように設定できます。セキュリティードメインおよびログインモジュールの基本は、JBoss EAP セキュリティーアーキテクチャー ガイド で説明しています。LdapExtended は LDAP サーバー (Active Directory を含む) との統合に推奨されるログインモジュールですが、他にも使用可能な LDAP ログインモジュールが複数あります。具体的には Ldap、AdvancedLdap および AdvancedAdLdap ログインモジュールで、セキュリティードメインが LDAP を使用するように設定できます。本セクションでは、LdapExtended ログインモジュールを使用して、認証および承認に LDAP を使用するセキュリティードメインを作成する方法を説明しますが、他の LDAP ログインモジュールを使用することもできます。他の LDAP ログインモジュールの詳細は、JBoss EAPログインモジュールのリファレンス を参照してください。
レガシーの セキュリティー サブシステムで LDAP サーバーを使用して認証を実行しており、この LDAP サーバーに到達できない場合に、JBoss EAP は 500 または内部サーバーエラーを返します。この動作は、同じ状況下で JBoss EAP の以前のバージョンが 401 または不正アクセスのエラーコードを返す動作とは異なります。
3.1.1. LdapExtended ログインモジュール
LdapExtended (org.jboss.security.auth.spi.LdapExtLoginModule) は、検索を使用して LDAP サーバー上のバインドユーザーと関連のロールを特定するログインモジュール実装です。ロールは再帰的にクエリーを実行して DN に従い、階層的なロール構造を移動します。特に Active Directory ではない LDAP 実装の場合など、セキュリティードメインで LDAP を使用する場合はほぼ、LdapExtended ログインモジュールを使用する必要があります。。LdapExtended ログインモジュールの設定オプションの完全リストは、JBoss EAPログインモジュールのリファレンスの LdapExtended ログインモジュール を参照してください。
認証は以下のようになります。
-
LDAP サーバーへの最初のバインドは、
bindDNオプションおよびbindCredentialオプションを使用して行われます。bindDNは、ユーザーとロールのbaseCtxDNツリーとrolesCtxDNツリーの両方を検索する機能を備えた LDAP ユーザーです。認証するユーザー DN には、baseFilter属性で指定されたフィルターを使用してクエリーが実行されます。 -
ユーザー DN を
InitialLdapContext環境のContext.SECURITY_PRINCIPALとして使用し、LDAP サーバーにバインドし、作成されたユーザー DN が認証されます。Context.SECURITY_CREDENTIALSプロパティーは、コールバックハンドラーが取得したStringパスワードに設定されます。
3.1.1.1. LdapExtended ログインモジュールを使用するようにセキュリティードメインを設定する手順
データの例 (LDIF 形式)
dn: uid=jduke,ou=Users,dc=jboss,dc=org objectClass: inetOrgPerson objectClass: person objectClass: top cn: Java Duke sn: duke uid: jduke userPassword: theduke # ============================= dn: uid=hnelson,ou=Users,dc=jboss,dc=org objectClass: inetOrgPerson objectClass: person objectClass: top cn: Horatio Nelson sn: Nelson uid: hnelson userPassword: secret # ============================= dn: ou=groups,dc=jboss,dc=org objectClass: top objectClass: organizationalUnit ou: groups # ============================= dn: uid=ldap,ou=Users,dc=jboss,dc=org objectClass: inetOrgPerson objectClass: person objectClass: top cn: LDAP sn: Service uid: ldap userPassword: randall # ============================= dn: ou=Users,dc=jboss,dc=org objectClass: top objectClass: organizationalUnit ou: Users # ============================= dn: dc=jboss,dc=org objectclass: top objectclass: domain dc: jboss # ============================= dn: uid=GroupTwo,ou=groups,dc=jboss,dc=org objectClass: top objectClass: groupOfNames objectClass: uidObject cn: GroupTwo member: uid=jduke,ou=Users,dc=jboss,dc=org uid: GroupTwo # ============================= dn: uid=GroupThree,ou=groups,dc=jboss,dc=org objectClass: top objectClass: groupOfUniqueNames objectClass: uidObject cn: GroupThree uid: GroupThree uniqueMember: uid=GroupOne,ou=groups,dc=jboss,dc=org # ============================= dn: uid=HTTP,ou=Users,dc=jboss,dc=org objectClass: inetOrgPerson objectClass: person objectClass: top cn: HTTP sn: Service uid: HTTP userPassword: httppwd # ============================= dn: uid=GroupOne,ou=groups,dc=jboss,dc=org objectClass: top objectClass: groupOfUniqueNames objectClass: uidObject cn: GroupOne uid: GroupOne uniqueMember: uid=jduke,ou=Users,dc=jboss,dc=org uniqueMember: uid=hnelson,ou=Users,dc=jboss,dc=org
LdapExtended ログインモジュールを追加する CLI コマンド
/subsystem=security/security-domain=testLdapExtendedExample:add(cache-type=default)
/subsystem=security/security-domain=testLdapExtendedExample/authentication=classic:add
/subsystem=security/security-domain=testLdapExtendedExample/authentication=classic/login-module=LdapExtended:add(code=LdapExtended, flag=required, module-options=[ ("java.naming.factory.initial"=>"com.sun.jndi.ldap.LdapCtxFactory"), ("java.naming.provider.url"=>"ldap://localhost:10389"), ("java.naming.security.authentication"=>"simple"), ("bindDN"=>"uid=ldap,ou=Users,dc=jboss,dc=org"), ("bindCredential"=>"randall"), ("baseCtxDN"=>"ou=Users,dc=jboss,dc=org"), ("baseFilter"=>"(uid={0})"), ("rolesCtxDN"=>"ou=groups,dc=jboss,dc=org"), ("roleFilter"=>"(uniqueMember={1})"), ("roleAttributeID"=>"uid")])
reload
ここで使用する管理 CLI コマンドは、JBoss EAP スタンドアロンサーバーを実行していることを仮定しています。JBoss EAP 管理対象ドメインの管理 CLI を使用する場合の詳細は 管理 CLI ガイド を参照してください。
3.1.1.1.1. Active Directory の LdapExtended ログインモジュールを使用するようにセキュリティードメインを設定する手順
Microsoft Active Directory では、LdapExtended ログインモジュールを使用できます。
以下の例は、デフォルトの Active Directory 設定です。一部の Active Directory 設定では、通常のポート 389 ではなく、3268 のグローバルカタログに対する検索が必要になる場合があります。これは、Active Directory フォレストに複数のドメインが含まれる場合に必要になる可能性が高いです。
デフォルトの AD 設定に対する LdapExtended ログインモジュールの設定例
/subsystem=security/security-domain=AD_Default:add(cache-type=default)
/subsystem=security/security-domain=AD_Default/authentication=classic:add
/subsystem=security/security-domain=AD_Default/authentication=classic/login-module=LdapExtended:add(code=LdapExtended,flag=required,module-options=[ ("java.naming.provider.url"=>"ldap://ldaphost.jboss.org"),("bindDN"=>"JBOSSsearchuser"), ("bindCredential"=>"password"), ("baseCtxDN"=>"CN=Users,DC=jboss,DC=org"), ("baseFilter"=>"(sAMAccountName={0})"), ("rolesCtxDN"=>"CN=Users,DC=jboss,DC=org"), ("roleFilter"=>"(sAMAccountName={0})"), ("roleAttributeID"=>"memberOf"), ("roleAttributeIsDN"=>"true"), ("roleNameAttributeID"=>"cn"), ("searchScope"=>"ONELEVEL_SCOPE"), ("allowEmptyPasswords"=>"false")])
reload
以下の例では、Active Directory に再帰的なロール検索を実装します。この例とデフォルトの Active Directory の例の主な相違点は、ロールの検索から、ユーザーの DN を使用した member 属性の検索に変更になった点です。次に、ログインモジュールはロールの DN を使用して、グループが所属するグループを検索します。
再帰検索を使用したデフォルトの AD 設定に対する LdapExtended ログインモジュールの設定例
/subsystem=security/security-domain=AD_Recursive:add(cache-type=default)
/subsystem=security/security-domain=AD_Recursive/authentication=classic:add
/subsystem=security/security-domain=AD_Recursive/authentication=classic/login-module=LdapExtended:add(code=LdapExtended,flag=required,module-options=[("java.naming.provider.url"=>"ldap://ldaphost.jboss.org"), ("java.naming.referral"=>"follow"), ("bindDN"=>"JBOSSsearchuser"), ("bindCredential"=>"password"), ("baseCtxDN"=>"CN=Users,DC=jboss,DC=org"), ("baseFilter"=>"(sAMAccountName={0})"), ("rolesCtxDN"=>"CN=Users,DC=jboss,DC=org"), ("roleFilter"=>"(member={1})"), ("roleAttributeID"=>"cn"), ("roleAttributeIsDN"=>"false"), ("roleRecursion"=>"2"), ("searchScope"=>"ONELEVEL_SCOPE"), ("allowEmptyPasswords"=>"false")])
reload