6.3. LDAP との統合
6.3.1. 認証での LDAP の使用
LDAP ログインモジュールは、中央の X.500 ディレクトリーサーバーに保存されているユーザーデータに対して受信認証情報を確認して、認証および承認を有効にします。これは org.apache.activemq.artemis.spi.core.security.jaas.LDAPLoginModule
で実装されます。
手順
BROKER_INSTANCE_DIR/etc/broker.xml
ファイルを開き、次の行を追加します。<security-settings> <security-setting match="#"> <permission type="createDurableQueue" roles="user"/> <permission type="deleteDurableQueue" roles="user"/> <permission type="createNonDurableQueue" roles="user"/> <permission type="deleteNonDurableQueue" roles="user"/> <permission type="send" roles="user"/> <permission type="consume" roles="user"/> </security-setting> </security-settings>
-
<broker-instance-dir>/etc/login.config
ファイルを開きます。 - 適切なパラメーターを使用して、適切なエイリアスブロックを見つけて編集します (以下に含まれる例を参照してください)。
- ブローカーを起動または再起動します (サービスまたはプロセス)。
Apache DS は DN パスの OID
部分を使用します。ただし、Microsoft AD はそうではなく、代わりに CN
部分を使用します。
例えば; DN パス oid=testuser,dc=example,dc=com
は Apache DS で、cn=testuser,dc=example,dc=com
は Microsoft AD で使用されます。
例6.7 Apache DS login.config
設定の例
activemq { org.apache.activemq.artemis.spi.core.security.jaas.LDAPLoginModule required debug=true 1 initialContextFactory=com.sun.jndi.ldap.LdapCtxFactory 2 connectionURL="ldap://localhost:10389" 3 connectionUsername="uid=admin,ou=system" 4 connectionPassword=secret 5 connectionProtocol=s 6 connectionTimeout=5000 7 authentication=simple 8 userBase="dc=example,dc=com" 9 userSearchMatching="(uid={0})" 10 userSearchSubtree=true 11 userRoleName= 12 readTimeout=5000 13 roleBase="dc=example,dc=com" 14 roleName=cn 15 roleSearchMatching="(member={0})" 16 roleSearchSubtree=true 17 ; };
例6.8 Microsoft Active Directory login.config
設定の例
activemq { org.apache.activemq.artemis.spi.core.security.jaas.LDAPLoginModule required debug=true initialContextFactory=com.sun.jndi.ldap.LdapCtxFactory connectionURL="LDAP://localhost:389" connectionUsername="CN=Administrator,CN=Users,DC=example,DC=com" connectionPassword=redhat.123 connectionProtocol=s connectionTimeout=5000 authentication=simple userBase="dc=example,dc=com" userSearchMatching="(CN={0})" userSearchSubtree=true readTimeout=5000 roleBase="dc=example,dc=com" roleName=cn roleSearchMatching="(member={0})" roleSearchSubtree=true ; };
注釈
- 1
- デバッグのオン (
true
) またはオフ (false
) を切り替えます。デフォルトはfalse
です。 - 2
initialContextFactory
パラメーターは常にcom.sun.jndi.ldap.LdapCtxFactory
に設定する必要があります- 3
- LDAP URL ldap://Host:Port を使用してディレクトリーサーバーの場所を指定します。オプションでこの URL を修飾するには、スラッシュ
/
とその後にディレクトリーツリーの特定ノードの DN を追加します。Apache DS のデフォルトポートは10389
で、Microsoft AD のデフォルト値は389
です。 - 4
- ディレクトリーサーバーへの接続を開くユーザーの DN。たとえば、
uid=admin,ou=system
です。ディレクトリーサーバーでは、通常、クライアントが接続を開くためにユーザー名/パスワードの認証情報を提示する必要があります。 - 5
connectionUsername
の DN に一致するパスワード。DIT のディレクトリーサーバーでは通常、パスワードは対応するディレクトリーエントリーのuserPassword
属性として保存されます。- 6
- すべての値はサポートされますが、実質的に使用されません。このオプションはデフォルト値がないために明示的に設定する必要があります。
- 7
- ブローカーがディレクトリーサーバーに接続することができる最大時間をミリ秒単位で指定します。ブローカーがこの時間内にディレクトリーに接続できない場合、接続の試行を中止します。このプロパティーにゼロまたはそれよりも小さい値を指定すると、代わりに基盤の TCP プロトコルのタイムアウト値が使用されます。値を指定しない場合、ブローカーは接続を無期限に待機するか、または基盤のネットワークがタイムアウトします。
接続に対して接続プールが要求された場合、このプロパティーは、最大プールサイズにすでに達し、プール内のすべての接続が使用されている場合に、ブローカーが接続を待つ最大時間を指定します。ゼロまたはそれよりも小さい値を指定すると、ブローカーは接続を無期限に利用可能になるまで待機します。それ以外の場合は、ブローカーは最大待機時間に達すると接続の試行を中止します。
- 8
- LDAP サーバーにバインドする際に使用する認証方法を指定します。このパラメーターは
simple
(ユーザー名とパスワードが必要) またはnone
(匿名アクセスを許可) のいずれかに設定できます。 - 9
- ユーザーエントリーを検索する DIT の特定のサブツリーを選択します。サブツリーは、サブツリーのベースノードを指定する DN で指定されます。たとえば、このオプションを
ou=User,ou=ActiveMQ,ou=system
に設定すると、ユーザーエントリーの検索はou=User,ou=ActiveMQ,ou=system
ノードの下にあるサブツリーに限定されます。 - 10
userBase
で選択したサブツリーに適用される LDAP 検索フィルターを指定します。詳細は、以下の 検索一致 セクションを参照してください。- 11
userBase
で指定されたノードを基準にして、どの程度の深さまでユーザーエントリーの検索を掘り下げるかを指定します。このオプションはブール値です。false
に設定すると、userBase
ノードにある子エントリーの 1 つとの一致を試みることを示し (javax.naming.directory.SearchControls.ONELEVEL_SCOPE
にマップ)、true
は、userBase
ノードのサブツリーに属する任意のエントリーとの一致を試みることを示します (javax.naming.directory.SearchControls.SUBTREE_SCOPE
にマップ)。- 12
- ユーザーのロール名のリストを含むユーザーエントリーの多値属性の名前を指定します (ロール名は、ブローカの承認プラグインによってグループ名として解釈されます)。このオプションを省略すると、ユーザーエントリーからロール名は抽出されません。
- 13
- ブローカーがディレクトリーサーバーから LDAP 要求への応答を受信するまで待機する最大時間をミリ秒単位で指定します。この時間内にブローカーがディレクトリーサーバーから応答を受信しない場合、ブローカーは要求を中止します。0 または less の値を指定すると、値を指定しないと、ディレクトリーサーバーから LDAP 要求への応答が無期限に待機します。
- 14
- ロールデータをディレクトリーサーバーに直接保存する場合は、
userRoleName
オプションを指定する代わりに (または指定してその上に)、ロールオプション (roleBase
、roleSearchMatching
、roleSearchSubtree
、およびroleName
) の組み合わせを使用できます。このオプションは、ロール/グループエントリーを検索する DIT の特定のサブツリーを選択します。サブツリーは、サブツリーのベースノードを指定する DN で指定されます。たとえば、このオプションをou=Group,ou=ActiveMQ,ou=system
に設定すると、role/group エントリーの検索がou=Group,ou=ActiveMQ,ou=system
ノードの下にあるサブツリーに限定されます。 - 15
- ロール/グループの名前が含まれるロールエントリーの属性タイプ (C、O、OU など) を指定します。このオプションを省略すると、ロール検索機能は事実上無効になっています。
- 16
roleBase
で選択したサブツリーに適用される LDAP 検索フィルターを指定します。詳細は、以下の 検索一致 セクションを参照してください。- 17
roleBase
で指定されたノードを基準にして、どの程度の深さまでロールエントリーの検索を掘り下げるかを指定します。false
(デフォルト) に設定すると、roleBase
ノードの子エントリー (javax.naming.directory.SearchControls.ONELEVEL_SCOPE
にマップ) のいずれかに一致するものの検索を試行します。true
の場合、roleBase ノードのサブツリーに属するエントリーに一致するものの検索を試行します (javax.naming.directory.SearchControls.SUBTREE_SCOPE
にマップ)。
検索一致
- userSearchMatching
LDAP 検索操作に渡す前に、この設定パラメーターで指定される文字列の値は
java.text.MessageFormat
クラスで実装される文字列置換の内容により異なります。
つまり、特別な文字列
{0}
は、受信クライアントの認証情報から抽出されたユーザー名に置き換えられます。置換後、この文字列は LDAP 検索フィルターとして解釈されます (構文は IETF 標準 RFC 2254 で定義されています)。
たとえば、このオプションが
(uid={0})
に設定され、受信したユーザー名がjdoe
の場合には、文字列置換後の検索フィルターは(uid=jdoe)
になります。
ユーザーベースが選択したサブツリー (
ou=User,ou=ActiveMQ,ou=system
) に、結果の検索フィルターが適用されると、エントリーuid=jdoe,ou=User,ou=ActiveMQ,ou=system
にマッチします。
検索フィルター構文の簡単な説明は、Oracle の JNDI チュートリアル を参照してください。
- roleSearchMatching
これは、2 つの置換文字列をサポートする点を除き、
userSearchMatching
オプションと同じように機能します。
置換文字列
{0}
は、一致したユーザーエントリーの DN をすべて置き換えます (つまり、ユーザー検索の結果)。たとえば、ユーザーjdoe
の場合には、置換された文字列はuid=jdoe,ou=User,ou=ActiveMQ,ou=system
になります。
置換文字列
{1}
は、受信したユーザー名を置き換えます。たとえば、jdoe
です。
このオプションを
(member=uid={1})
に設定し、受信したユーザー名がjdoe
の場合には、文字列の置換後に検索フィルターは(member=uid=jdoe)
になります (ApacheDS 検索フィルター構文を想定)。
ロールベース
ou=Group,ou=ActiveMQ,ou=system
で選択したサブツリーに、結果の検索フィルターが適用されると、uid=jdoe
と同等のmember
属性を持つすべてのロールエントリーがマッチします (member
属性の値は DN です)。
このオプションはデフォルト値がないため、ロールの検索が無効であっても常に設定する必要があります。OpenLDAP を使用すると、検索フィルターの構文は
(member:=uid=jdoe)
になります。