Red Hat Training
A Red Hat training course is available for Red Hat JBoss Enterprise Application Platform
第4章 LDAP を使用するためのセキュリティードメインの設定
セキュリティードメインは、ログインモジュールを使用して認証および承認に LDAP サーバーを使用するよう設定できます。セキュリティードメインとログインモジュールの基本は、Red Hat JBoss Enterprise Application Platform 6 Security Architecture guide で説明されています。LdapExtended は LDAP サーバー (Active Directory を含む) との統合に推奨されるログインモジュールですが、他のいくつかの LDAP ログインモジュールも使用できます。特に、LDAP を使用するようセキュリティードメインを設定するには、Ldap、AdvancedLdap、AdvancedAdLdap を使用することもできます。本セクションでは、LdapExtended ログインモジュールを使用して、認証および承認に LDAP を使用するセキュリティードメインの作成方法を説明しますが、他の LDAP ログインモジュールを使用することもできます。その他の LDAP ログインモジュールの詳細は、Red Hat JBoss Enterprise Application Platform 6 Security Guide を参照してください。
4.1. LdapExtended ログインモジュール
LdapExtended (org.jboss.security.auth.spi.LdapExtLoginModule) はログインモジュール実装で、LDAP サーバー上のバインドユーザーと関連付けられたロールの特定に使用されます。ロールは再帰的にクエリーを行い、DN に従って階層的なロール構造を移動します。セキュリティードメインで LDAP を使用する場合、ほとんどの場合、特に Active Directory 以外の LDAP 実装では、LdapExtedned ログインモジュールを使用する必要があります。
表4.1 完全な LdapExtended ログインモジュール設定オプション
| オプション | Type | デフォルト | 説明 |
|---|---|---|---|
| java.naming.factory.initial | クラス名 | com.sun.jndi.ldap.LdapCtxFactory | InitialContextFactory 実装クラス名。 |
| java.naming.provider.url | ldap:// URL | Java.naming.security.protocol の値が SSL、ldap://localhost:636 の場合、それ以外は ldap://localhost:389 | LDAP サーバーの URL。 |
| java.naming.security.authentication | SASL メカニズムの none、simple、または name | デフォルトは simple です。プロパティーが明示的に定義されていない場合、この動作はサービスプロバイダーによって決定されます。 | LDAP サーバーにバインドするために使用するセキュリティーレベル。 |
| java.naming.security.protocol | トランスポートプロトコル | 指定されていない場合、プロバイダーによって決定されます。 | SSL などのセキュアなアクセスに使用するトランスポートプロトコル。 |
| baseCtxDN | 完全修飾 DN | none | ユーザーの検索を開始するため、トップレベルのコンテキストの固定 DN です。 |
| bindCredential | 文字列、オプションで暗号化 | none | DN の認証情報を保存するために使用されます。 |
| bindDN | 完全修飾 DN | none | ユーザーおよびロールクエリーの LDAP サーバーに対してバインドするために使用される DN です。この DN には、baseCtxDN および rolesCtxDN 値の読み取りおよび検索パーミッションが必要です。 |
| baseFilter | LDAP フィルター文字列 | none | 認証するユーザーのコンテキストを見つけるために使用される検索フィルター。{0} 式を使用しているフィルターに、入力ユーザー名、またはログインモジュールコールバックから取得した userDN が置換されます。検索フィルターの一般的な例は (uid={0}) です。 |
| rolesCtxDN | 完全修飾 DN | none | ユーザーロールを検索するためのコンテキストの固定 DN です。これは、実際のロールがである DN ではなく、ユーザーロールを含むオブジェクトがある DN です。たとえば、Microsoft Active Directory サーバーでは、ユーザーアカウントが DN になります。 |
| roleFilter | LDAP フィルター文字列 | none | 認証済みユーザーと関連付けられたロールを検索するために使用される検索フィルター。{0} 式を使用しているフィルターに、入力ユーザー名、またはログインモジュールコールバックから取得した userDN が置換されます。認証済み userDN は {1} が使用されたフィルターに置き換えられます。入力ユーザー名に一致する検索フィルター例は (member={0}) です。認証済み userDN に一致する他の例は (member={1}) です。 |
| roleAttributeID | attribute | roles | ユーザーロールを含む属性の名前。 |
| roleAttributeIsDN | true または false | false | roleAttributeID にロールオブジェクトの完全修飾 DN が含まれるかどうか。false の場合は、コンテキスト名の roleNameAttributeId 属性の値からこのロール名が取得されます。Microsoft Active Directory などの特定のディレクトリースキーマでは、この属性を true に設定する必要があります。 |
| defaultRole | ロール名 | none | すべての認証ユーザーに含まれるロール |
| parseRoleNameFromDN | true または false | false | クエリーによって返された DN に roleNameAttributeID が含まれるかどうかを示すフラグ。true に設定した場合には、DN は roleNameATtributeID に対してチェックされます。false に設定すると、DN は roleNameATtributeID に対して確認されません。このフラグは LDAP クエリーのパフォーマンスを向上できます。 |
| parseUsername | true または false | false | DN がユーザー名に対して解析されるかどうかを示すフラグ。true に設定した場合には、 DN はユーザー名に対して解析されます。false に設定した場合には、 DN はユーザー名に対して解析されません。このオプションは、usernameBeginString および usernameEndString とともに使用されます。 |
| usernameBeginString | string | none | DN の最初から削除される文字列を定義して、ユーザー名を表示します。このオプションは、usernameEndString と一緒に使用されます。 |
| usernameEndString | string | none | DN の最後から削除され、username を表示する文字列を定義します。このオプションは、usernameBeginString と一緒に使用されます。 |
| roleNameAttributeID | attribute | name | ロール名を含む roleCtxDN コンテキスト内の属性の名前。roleAttributeIsDN プロパティーを true に設定すると、このプロパティーはロールオブジェクトの名前属性の検索に使用されます。 |
| distinguishedNameAttribute | attribute | distinguishedName | ユーザーの DN を含むユーザーエントリーの属性の名前。これは、ユーザー自体の DN に特殊文字 (たとえば、正しいユーザーマッピングを防ぐバックスラッシュ) が含まれている場合に必要になることがあります。属性が存在しない場合は、エントリーの DN が使用されます。 |
| roleRecursion | Integer | 0 | ロール検索の再帰レベルの数は、一致するコンテキストの下に続きます。これを 0 に設定して再帰を無効にします。 |
| searchTimeLimit | integer | 10000 (10 秒) | ユーザーまたはロールの検索のタイムアウト (ミリ秒単位)。 |
| searchScope | OBJECT_SCOPE, ONELEVEL_SCOPE, SUBTREE_SCOPE のいずれか | SUBTREE_SCOPE | 使用する検索範囲。 |
| allowEmptyPasswords | true または false | false | 空のパスワードを許可するかどうか。ほとんどの LDAP サーバーは、空のパスワードを匿名ログイン試行として処理します。空のパスワードを拒否するには、これを false に設定します。 |
| referralUserAttributeIDToCheck | attribute | none | 紹介を使用しない場合、このオプションは無視することができます。リファーラルを使用し、ロールオブジェクトがリファーラル内部にあると、このオプションは特定のロール (例: member) に対して定義されたユーザーが含まれる属性名を示します。ユーザーはこの属性名の内容に対して確認されます。このオプションが設定されていないとチェックは常に失敗するため、ロールオブジェクトはリファーラルツリーに保存できません。 |
認証は以下のように行われます。
- LDAP サーバーへの最初のバインドは、bindDN オプションおよび bindCredential オプションを使用して行われます。bindDN は LDAP ユーザーであり、ユーザーとロールの baseCtxDN および rolesCtxDN ツリーの両方を検索する機能があります。認証するユーザー DN は、baseFilter 属性で指定されたフィルターを使用してクエリーされます。
- 生成されるユーザー DN は、InitialLdapContext 環境 Context.SECURITY_PRINCIPAL として使用してユーザー DN を使用し、LDAP サーバーにバインドして認証されます。Context.SECURITY_CREDENTIALS プロパティーはコールバックハンドラーによって取得される String パスワードに設定されます。
4.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
結果の XML
<security-domain name="testLdapExtendedExample" cache-type="default">
<authentication>
<login-module code="LdapExtended" flag="required">
<module-option name="java.naming.factory.initial" value="com.sun.jndi.ldap.LdapCtxFactory"/>
<module-option name="java.naming.provider.url" value="ldap://localhost:10389"/>
<module-option name="java.naming.security.authentication" value="simple"/>
<module-option name="bindDN" value="uid=ldap,ou=Users,dc=jboss,dc=org"/>
<module-option name="bindCredential" value="randall"/>
<module-option name="baseCtxDN" value="ou=Users,dc=jboss,dc=org"/>
<module-option name="baseFilter" value="(uid={0})"/>
<module-option name="rolesCtxDN" value="ou=groups,dc=jboss,dc=org"/>
<module-option name="roleFilter" value="(uniqueMember={1})"/>
<module-option name="roleAttributeID" value="uid"/>
</login-module>
</authentication>
</security-domain>
上記の CLI コマンドは、JBoss EAP 6 のスタンドアロンインスタンスを想定して実行されました。JBoss EAP 6 ドメインでの CLI の使用の詳細は、Red Hat JBoss Enterprise Application Platform 6 Administration and Configuration Guide の The Management CLI セクションを参照してください。
4.1.1.1. Active Directory に LdapExtended ログインモジュールを使用するようセキュリティードメインを設定
Microsoft Active Directory では、LdapExtended ログインモジュールを使用できます。
デフォルトの AD 設定
以下の例は、デフォルトの Active Directory 設定を示しています。
Active Directory の設定によっては、通常のポート 389 ではなく、ポート 3268 でグローバルカタログを検索する必要がある場合があります。これは、Active Directory フォレストに複数のドメインが含まれる場合によく見られます。
デフォルト AD 設定用の LdapExtended ログインモジュールの設定例
<security-domain name="AD_Default" cache-type="default">
<authentication>
<login-module code="LdapExtended" flag="required">
<module-option name="java.naming.provider.url" value="ldap://ldaphost.jboss.org"/>
<module-option name="bindDN" value="JBOSSsearchuser"/>
<module-option name="bindCredential" value="password"/>
<module-option name="baseCtxDN" value="CN=Users,DC=jboss,DC=org"/>
<module-option name="baseFilter" value="(sAMAccountName={0})"/>
<module-option name="rolesCtxDN" value="CN=Users,DC=jboss,DC=org"/>
<module-option name="roleFilter" value="(sAMAccountName={0})"/>
<module-option name="roleAttributeID" value="memberOf"/>
<module-option name="roleAttributeIsDN" value="true"/>
<module-option name="roleNameAttributeID" value="cn"/>
<module-option name="searchScope" value="ONELEVEL_SCOPE"/>
<module-option name="allowEmptyPasswords" value="false"/>
</login-module>
</authentication>
</security-domain>
再帰的な AD 設定
以下の例では、Active Directory 内で再帰的なロール検索を実装します。この例と、デフォルトの Active Directory の例の主な違いは、ユーザーの DN を使用してメンバー属性を検索するためにロール検索が置き換えられている点です。ログインモジュールは、ロールの DN を使用して、グループがメンバーとなっているグループを検索します。
再帰検索を使用したデフォルトの AD 設定に対する LdapExtended ログインモジュールの設定例
<security-domain name="AD_Recursive" cache-type="default">
<authentication>
<login-module code="LdapExtended" flag="required">
<module-option name="java.naming.provider.url" value="ldap://ldaphost.jboss.org"/>
<module-option name="java.naming.referral" value="follow"/>
<module-option name="bindDN" value="JBOSSsearchuser"/>
<module-option name="bindCredential" value="password"/>
<module-option name="baseCtxDN" value="CN=Users,DC=jboss,DC=org"/>
<module-option name="baseFilter" value="(sAMAccountName={0})"/>
<module-option name="rolesCtxDN" value="CN=Users,DC=jboss,DC=org"/>
<module-option name="roleFilter" value="(member={1})"/>
<module-option name="roleAttributeID" value="cn"/>
<module-option name="roleAttributeIsDN" value="false"/>
<module-option name="roleRecursion" value="2"/>
<module-option name="searchScope" value="ONELEVEL_SCOPE"/>
<module-option name="allowEmptyPasswords" value="false"/>
</login-module>
</authentication>
</security-domain>