付録A 高度な LDAP ログインモジュール:完全 LDAP 認証
JBoss Negotiation プロジェクトには、LDAP ロール検索要件を処理する AdvancedLdapLoginModule が含まれています。
AdvancedLdapLoginModule は、LdapExtLoginModule に基づいています。SPNEGOLoginModule とともに、チェーン設定内でこのモジュールを利用することで、GSSAPI 認証が LDAP 経由で認証を行えるようになります (「ロールマッピング」 を参照)。あるいは、LDAP を使った完全認証にこのモジュールを利用可能です。また、必要であれば認証あるいはロール検索、ユーザー検索を省略するように設定することができます。
A.1. 設定 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
新規ログインモジュールの完全修飾クラス名は
org.jboss.security.negotiation.AdvancedLdapLoginModule
です。
警告
ベータリリースでは、クラス名は
org.jboss.security.negotiation.spnego.AdvancedLdapLoginModule
でした。今でもログインモジュールは、この名前で利用できますが、廃止予定で今後のリリースでは削除されます。
AdvancedLDAPLoginModule はパスワードスタッキングに対応しています。このモジュールを他のログインモジュールと利用したい場合は、password-stacking プロパティが
useFirstPass
に設定されているようにしてください。
A.1.1. 初期の LDAP コンテキストを定義 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
まずユーザー認証情報を定義する必要があります。この情報はInitialLdapContextを取得し、ユーザーとユーザーロールの検索に利用されます。
注記
ログインモジュールがあれば、ユーザー名と認証情報を使うか、すでに認証済みのユーザーを GSSPI を使うことで、この InitialLdapContext を取得することができます。ここでは、ユーザー認証をつかっています。GSSAPI での設定については、「ロールマッピング」 を参照してください。
ユーザー名とパスワードで認証する場合、これから提示する内容により、以下の設定を定義します。
- bindDN
- LDAP サーバーにバインドするために利用する DN を定義します。定義済みの baseCtxDN および rolesCtxDN への読み取り/検索の権限を持つ DN です。
- bindCredential
- bindDN パスワードを定義します。jaasSecurityDomain を指定している場合は、このパスワードは暗号化可能です。
- jaasSecurityDomain
- jaasSecurityDomain の JMX ObjectNameを定義します。これは、java.naming.security.principal を復号化する際に利用する jaasSecurityDomain です。このドメインの JaasSecurityDomain#encrypt64(byte[]) メソッドは、暗号化されたパスワードを返します。org.jboss.security.plugins.PBEUtils を使い、暗号化形式を生成することも可能です。
A.1.2. DN 検索の定義 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
モジュールが LDAP 初期コンテキストを作成した後、提供済みのユーザー名をとり、ユーザー DN を検索します。検索プロパティを定義するには、以下のプロパティを提示します。
- baseCtxDN
- コンテキストの固定 DN を定義しユーザーロールを検索します。これは、実際のロールが実際に置かれている場所の識別名 (DN) ではなく、ユーザーロールが含まれているオブジェクトが置かれている場所の DN という点を考慮します (つまり、Active Directory では、ユーザーアカウントを持つ DN ということになります)。
- baseFilter
- 認証ユーザーのコンテキストの場所を突き止めるために使う検索フィルターを定義します。ログインモジュールのコールバックから取得した通りの、入力ユーザー名/ユーザー DN は、
{0}
表現を代入します。この代入動作は、標準のDirContext?.search(Name, String, Object[],SearchControls? cons) メソッドから来ています。一般的な検索フィルターの例は、(uid={0})
です。 - searchTimeLimit
- ユーザーとロール検索のタイムアウト時間をミリ秒で定義します (デフォルトは 10000 で、10 秒となっています)。
注記
ユーザー DN 検索を無効にするには、
baseCtxDN
プロパティを省略します。提示したユーザー名をこのログインモジュールで DN として使います。
A.1.3. ユーザー認証 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
注記
LDAP ログインモジュールが最初のログインモジュールでなく、以前のログインモジュールがすでにユーザー認証を済ましている場合、ユーザー認証は省略されます。
今までにログインモジュールでユーザー認証を行なっていない場合、この手順で、ユーザー DN 検索と提示した認証情報からのユーザー DN を使い、新たな InitialLdapContext を作成しユーザー DN と認証情報の組み合わせが有効でなるか確認します。
ユーザー認証は、以下のプロパティを定義してください。
- allowEmptyPassword
- 空の (length==0) パスワードが LDAP サーバーに渡された場合。LDAP サーバーは空のパスワードを無名ログインとして処理します。このプロパティを
false
に設定し、空のパスワードを受け付けないようにするか、true
に設定し、LDAP サーバーが空のパスワードを認証できるようにします (デフォルトは、false
)。
A.1.4. ロール検索の定義 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
LDAP ログインモジュールは、LDAP サーバーに対する特定ユーザーやロール検索を定義するプロパティを渡します。
重要
以下のロール検索設定は、LdapExtLoginModule 設定に似ていますが、反復により DN 内にリストされているロールも検索します。
- rolesCtxDN
- コンテキストの固定 DN でユーザーロールを検索します。これは、実際のロールが実際に置かれている場所の識別名 (DN) ではなく、ユーザーロールが含まれているオブジェクトが置かれている場所の DN という点を考慮します (例:Active Directory では、ユーザーアカウントを持つ DN ということになります)。
- roleFilter
- 認証済みユーザーに紐付けられたロールの場所をつきとめるために利用する検索フィルターを定義します。ログインモジュールのコールバックから取得した入力ユーザ名/userDN はフィルター定義で
{0}
表現を代入します。認証済み userDN は、フィルター定義で{1}
を代入します。入力したユーザ名と一致する検索フィルターの例は、(member={0})
です。もう1つは、認証済みの userDN に一致する場合で、(member={1})
となっています。注記
roleFilter 属性を飛ばすと、ロール検索は UserDN を roleAttributeID 値を取得する DN として利用します。 - roleAttributeID
- ロール名に該当するコンテキストのロール属性を定義します。roleAttributeIsDN プロパティが
true
に設定されている場合、このプロパティは、roleNameAttributeID 属性に対しクエリを行うコンテキストの DN となります。roleAttributeIsDN プロパティがfalse
に設定されている場合、このプロパティは、ロール名の属性名となります。 - roleAttributeIsDN
- ロール属性がロールオブジェクトあるいはロール名の完全な識別名を含むか定義します。
false
の場合、ロール名はユーザーのロール属性の値から取得します。true
の場合、ロール属性はロールオブジェクトの識別名を表します。ロール名は、該当オブジェクトのroleNameAttributeId 属性の値から取得します。特定のディレクトリスキーマでは (Microsoft Active Directory など)、ユーザーオブジェクトのロール (グループ) 属性は、簡易名ではなく DN としてロールオブジェクトに保存されます。このような場合、このプロパティはtrue
に設定します。このプロパティのデフォルト値はfalse
です。 - roleNameAttributeID
- ロール名に該当するコンテキストのロール属性を定義します。roleAttributeIsDN プロパティが
true
に設定されている場合、このプロパティを使いロールオブジェクトの属性を検索します。また、roleAttributeIsDN property がfalse
に設定されている場合、このプロパティは無視されます。 - recurseRules
- 再帰ロール検索を有効にします。ログインモジュールは、すでに追加済みのロールをトラッキングし、循環参照を処理します。
- searchScope
- 検索範囲を以下のいずれかに設定することができます (デフォルト値は
SUBTREE_SCOPE
)。- OBJECT_SCOPE - 指定のロールコンテキストのみを検索します。
- ONELEVEL_SCOPE - 指定のロールコンテキストを直接検索します。
- SUBTREE_SCOPE - ロールコンテキストが DirContext? でない場合、オブジェクトのみを検索します。ロールコンテキストが DirContext? の場合、サブツリーは、指定のオブジェクトにルートを置き、そのオブジェクト自体を検索します。
- searchTimeLimit
- ユーザーとロール検索のタイムアウト時間をミリ秒で定義します (デフォルトは 10000 で、10 秒となっています)。
注記
これらの検索は両方、同じ searchTimeLimit 設定を使います。