5.4. 認証および承認での LDAP の使用
LDAP ログインモジュールは、中央の X.500 ディレクトリーサーバーに保存されているユーザーデータに対して受信認証情報を確認して、認証および承認を有効にします。これは org.apache.activemq.artemis.spi.core.security.jaas.LDAPLoginModule
で実装されます。
5.4.1. クライアント認証用の LDAP の設定
以下の手順の例は、LDAP を使用してクライアントを認証する方法を示しています。
手順
-
<broker_instance_dir>/etc/broker.xml
設定ファイルを開きます。 security-settings
要素内にsecurity-setting
要素を追加してパーミッションを設定します。以下に例を示します。<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
ファイルを開きます。 使用しているディレクトリーサービスに基づいて、LDAP ログインモジュールを設定します。
Microsoft Active Directory ディレクトリーサービスを使用している場合は、以下の例のように設定を追加します。
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,OU=System,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 ; };
注記Microsoft Active Directory を使用し、
connectionUsername
の属性に指定する必要のある値にスペース (例:OU=System Accounts
) が含まれている場合は、値を二重引用符 (""
) で囲み、バックスラッシュ (\
) を使用してペア内の各二重引用符をエスケープする必要があります。たとえば、connectionUsername="CN=Administrator,CN=Users,OU=\"System Accounts\",DC=example,DC=com"
などです。ApacheDS ディレクトリーサービスを使用している場合は、以下の例のような設定を追加します。
activemq { org.apache.activemq.artemis.spi.core.security.jaas.LDAPLoginModule required debug=true initialContextFactory=com.sun.jndi.ldap.LdapCtxFactory connectionURL="ldap://localhost:10389" connectionUsername="uid=admin,ou=system" connectionPassword=secret connectionProtocol=s connectionTimeout=5000 authentication=simple userBase="dc=example,dc=com" userSearchMatching="(uid={0})" userSearchSubtree=true userRoleName= readTimeout=5000 roleBase="dc=example,dc=com" roleName=cn roleSearchMatching="(member={0})" roleSearchSubtree=true ; };
debug
-
デバッグをオン (
true
) またはオフ (false
) にします。デフォルト値はfalse
です。 initialContextFactory
-
常に
com.sun.jndi.ldap.LdapCtxFactory
に設定する必要があります。 connectionURL
-
LDAP URL (__<ldap://Host:Port>) を使用するディレクトリーサーバーの場所。オプションでこの URL を修飾するには、スラッシュ
/
とその後にディレクトリーツリーの特定ノードの DN を追加します。Apache DS のデフォルトポートは10389
で、Microsoft AD のデフォルト値は389
です。 connectionUsername
-
ディレクトリーサーバーへの接続を開くユーザーの識別名 (DN)たとえば、
uid=admin,ou=system
です。ディレクトリーサーバーでは、通常、クライアントが接続を開くためにユーザー名/パスワードの認証情報を提示する必要があります。 connectionPassword
-
connectionUsername
の DN に一致するパスワード。Directory Information Tree (DIT) のディレクトリーサーバーでは、パスワードは通常、対応するディレクトリーエントリーにuserPassword
属性として保存されます。 connectionProtocol
- すべての値はサポートされますが、実質的に使用されません。このオプションはデフォルト値がないために明示的に設定する必要があります。
connectionTimeout
ブローカーがディレクトリーサーバーに接続することができる最大時間をミリ秒単位で指定します。ブローカーがこの時間内にディレクトリーに接続できない場合、接続の試行を中止します。このプロパティーにゼロまたはそれよりも小さい値を指定すると、代わりに基盤の TCP プロトコルのタイムアウト値が使用されます。値を指定しない場合、ブローカーは接続を無期限に待機するか、基盤のネットワークがタイムアウトします。
接続に対して接続プールが要求された場合、このプロパティーは、最大プールサイズにすでに達し、プール内のすべての接続が使用されている場合に、ブローカーが接続を待つ最大時間を指定します。ゼロまたはそれよりも小さい値を指定すると、ブローカーは接続を無期限に利用可能になるまで待機します。それ以外の場合は、ブローカーは最大待機時間に達すると接続の試行を中止します。
authentication
-
LDAP サーバーにバインドする際に使用する認証方法を指定します。このパラメーターは
simple
(ユーザー名とパスワードが必要) またはnone
(匿名アクセスを許可) のいずれかに設定できます。 userBase
-
ユーザーエントリーを検索する DIT の特定のサブツリーを選択します。サブツリーは、サブツリーのベースノードを指定する DN で指定されます。たとえば、このオプションを
ou=User,ou=ActiveMQ,ou=system
に設定すると、ユーザーエントリーの検索はou=User,ou=ActiveMQ,ou=system
ノードの下にあるサブツリーに限定されます。 userSearchMatching
-
userBase
で選択したサブツリーに適用される LDAP 検索フィルターを指定します。詳細は、以下の 「一致するパラメーターの検索」 セクションを参照してください。 userSearchSubtree
-
userBase
で指定されたノードを基準にして、どの程度の深さまでユーザーエントリーの検索を掘り下げるかを指定します。このオプションはブール値です。false
の値を指定すると、userBase
ノードの子エントリーのいずれかに一致するものの検索を試行します (javax.naming.directory.SearchControls.ONELEVEL_SCOPE
にマップ)。true
の値を指定すると、userBase
ノードの サブ ツリーの配下にあるエントリーに一致するものの検索を試行します (javax.naming.directory.SearchControls.SUBTREE_SCOPE
にマップ)。 userRoleName
- ユーザーのロール名のリストを含むユーザーエントリーの属性の名前。ロール名は、ブローカーの承認プラグインによってグループ名として解釈されます。このオプションを省略すると、ユーザーエントリーからロール名は抽出されません。
readTimeout
- ブローカーがディレクトリーサーバーから LDAP 要求への応答を受信するまで待機する最大時間をミリ秒単位で指定します。この時間内にブローカーがディレクトリーサーバーから応答を受信しない場合、ブローカーは要求を中止します。0 または less の値を指定すると、値を指定しないと、ディレクトリーサーバーから LDAP 要求への応答が無期限に待機します。
roleBase
-
ロールデータをディレクトリーサーバーに直接保存する場合は、
userRoleName
オプションを指定する代わりに (または指定してその上に)、ロールオプション (roleBase
、roleSearchMatching
、roleSearchSubtree
、およびroleName
) の組み合わせを使用できます。このオプションは、ロール/グループエントリーを検索する DIT の特定のサブツリーを選択します。サブツリーは、サブツリーのベースノードを指定する DN で指定されます。たとえば、このオプションをou=Group,ou=ActiveMQ,ou=system
に設定すると、role/group エントリーの検索がou=Group,ou=ActiveMQ,ou=system
ノードの下にあるサブツリーに限定されます。 roleName
- ロール/グループの名前が含まれるロールエントリーの属性タイプ (C、O、OU など)。このオプションを省略すると、ロール検索機能は事実上無効になっています。
roleSearchMatching
-
roleBase
で選択したサブツリーに適用される LDAP 検索フィルターを指定します。詳細は、以下の 「一致するパラメーターの検索」 セクションを参照してください。 roleSearchSubtree
roleBase
で指定されたノードを基準にして、どの程度の深さまでロールエントリーの検索を掘り下げるかを指定します。false
(デフォルト) に設定すると、roleBase
ノードの子エントリー (javax.naming.directory.SearchControls.ONELEVEL_SCOPE
にマップ) のいずれかに一致するものの検索を試行します。true
の場合、roleBase ノードのサブツリーに属するエントリーに一致するものの検索を試行します (javax.naming.directory.SearchControls.SUBTREE_SCOPE
にマップ)。注記Apache DS は、DN パスの
OID
部分を使用します。Microsoft Active Directory はCN
部分を使用します。たとえば、Apache DS ではoid=testuser,dc=example,dc=com
などの DN パスを使用し、Microsoft Active Directory ではcn=testuser,dc=example,dc=com
などの DN パスを使用できます。
- ブローカーを起動または再起動します (サービスまたはプロセス)。
5.4.1.1. 一致するパラメーターの検索
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
にマッチします。
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)
になります。
関連情報
- 検索フィルター構文の概要は、Oracle JNDI tutorial を参照してください。
5.4.2. LDAP 認証の設定
LegacyLDAPSecuritySettingPlugin
セキュリティー設定プラグインは、LDAPAuthorizationMap
および cachedLDAPAuthorizationMap
で過去に AMQ 6 で処理されたセキュリティー情報を読み取り、できるだけ、この情報を対応する AMQ 7 セキュリティー設定に変換します。
AMQ 6 および AMQ 7 のブローカーのセキュリティー実装は、完全に一致しません。そのため、プラグインは、2 つのバージョン間の翻訳を実行し、ほぼ同等の機能を実現します。
以下の例は、プラグインを設定する方法を示しています。
手順
-
<broker_instance_dir>/etc/broker.xml
設定ファイルを開きます。 security-settings
要素内にsecurity-setting-plugin
要素を追加します。以下に例を示します。<security-settings> <security-setting-plugin class-name="org.apache.activemq.artemis.core.server.impl.LegacyLDAPSecuritySettingPlugin"> <setting name="initialContextFactory" value="com.sun.jndi.ldap.LdapCtxFactory"/> <setting name="connectionURL" value="ldap://localhost:1024"/>`ou=destinations,o=ActiveMQ,ou=system` <setting name="connectionUsername" value="uid=admin,ou=system"/> <setting name="connectionPassword" value="secret"/> <setting name="connectionProtocol" value="s"/> <setting name="authentication" value="simple"/> </security-setting-plugin> </security-settings>
class-name
-
この実装は
org.apache.activemq.artemis.core.server.impl.LegacyLDAPSecuritySettingPlugin
です。 initialContextFactory
-
LDAP への接続に使用される初期コンテキストファクトリー。これは、常に
com.sun.jndi.ldap.LdapCtxFactory
(デフォルト値) に設定する必要があります。 connectionURL
-
LDAP URL <ldap://Host:Port> を使用してディレクトリーサーバーの場所を指定します。オプションでこの URL を修飾するには、スラッシュ
/
とその後にディレクトリーツリーの特定ノードの識別名 (DN) を追加します。例:ldap://ldapserver:10389/ou=system
デフォルト値はldap://localhost:1024
です。 connectionUsername
-
ディレクトリーサーバーへの接続を開くユーザーの DN。たとえば、
uid=admin,ou=system
です。ディレクトリーサーバーでは、通常、クライアントが接続を開くためにユーザー名/パスワードの認証情報を提示する必要があります。 connectionPassword
-
connectionUsername
の DN に一致するパスワード。Directory Information Tree (DIT) のディレクトリーサーバーでは、パスワードは通常、対応するディレクトリーエントリーにuserPassword
属性として保存されます。 connectionProtocol
- 現在は使用されていません。今後、このオプションを使用すると、ディレクトリーサーバーへの接続に Secure Socket Layer(SSL) を選択できます。このオプションはデフォルト値がないために明示的に設定する必要があります。
authentication
LDAP サーバーにバインドする際に使用する認証方法を指定します。このパラメーターの有効な値は
simple
(ユーザー名とパスワード) またはnone
(匿名) です。デフォルト値はsimple
です。注記Simple Authentication and Security Layer(SASL) 認証はサポートされ ません。
前述の設定例に記載されていない他の設定は次のとおりです。
destinationBase
-
子がすべての宛先にパーミッションを提供するノードの DN を指定します。この場合、DN はリテラル値です (つまり、プロパティー値の文字列は置き換えられません)。たとえば、このプロパティーの通常の値は
ou=destinations,o=ActiveMQ,ou=system
で、デフォルト値はou=destinations,o=ActiveMQ,ou=system
です。 filter
-
あらゆる種類の宛先のパーミッションを検索するときに使用する LDAP 検索フィルターを指定します。検索フィルターは、キューまたはトピックノードの子孫の 1 つとの照合を試行します。デフォルト値は
(cn=*)
です。 roleAttribute
-
ロールの DN の値が
filter
に一致するノードの属性を指定します。デフォルト値はuniqueMember
です。 adminPermissionValue
-
admin
パーミッションに一致する値を指定します。デフォルト値はadmin
です。 readPermissionValue
-
read
パーミッションに一致する値を指定します。デフォルト値はread
です。 writePermissionValue
-
write
パーミッションに一致する値を指定します。デフォルト値はwrite
です。 enableListener
-
LDAP サーバーでのを自動的に受信し、ブローカーの認証設定をリアルタイムで更新するリスナーを有効にするかどうかを指定します。デフォルト値は
true
です。 mapAdminToManage
レガシー (AMQ 6) の
admin
パーミッションを AMQ 7 のmanage
パーミッションにマップするかどうかを指定します。以下の表のマッピングセマンティクスの詳細を参照してください。デフォルト値はfalse
です。LDAP で定義されたキューまたはトピックの名前は、セキュリティー設定の一致として機能し、パーミッション値は AMQ 6 タイプから AMQ 7 タイプにマッピングされ、ロールはそのままマッピングされます。LDAP で定義されたキューまたはトピックの名前はセキュリティー設定の一致として機能するため、セキュリティー設定は想定どおりに JMS 宛先に適用されない可能性があります。これは、必要に応じて、AMQ 7 は常に JMS 宛先を jms.queue.または jms.topic.で接頭辞を付けるためです。
AMQ 6 には、
read
、write
、およびadmin
の 3 つのパーミッションタイプがあります。これらのパーミッションタイプは、ActiveMQ の Web サイト (Security) に記載されています。AMQ 7 には以下のパーミッションタイプがあります。
-
createAddress
-
deleteAddress
-
createDurableQueue
-
deleteDurableQueue
-
createNonDurableQueue
-
deleteNonDurableQueue
-
send
-
consume
-
manage
browse
以下の表は、セキュリティー設定プラグインが AMQ 6 パーミッションタイプを AMQ 7 パーミッションタイプにマッピングする方法を示しています。
AMQ 6 パーミッションタイプ AMQ 7 のパーミッションタイプ read
consume, browse
write
send
admin
createAddress、deleteAddress、createDurableQueue、deleteDurableQueue、createNonDurableQueue、deleteNonDurableQueue、manage(
mapAdminToManage
がtrue
に設定されている場合)下記のとおり、プラグインが AMQ 6 と AMQ 7 のパーミッションタイプ間の変換を実行するケースがあります。これにより、同等の機能を実現できます。
-
AMQ 6 には同様のパーミッションタイプがないため、このマッピングにはデフォルトで、AMQ 7 の
manage
パーミッションタイプが含まれません。ただし、mapAdminToManage
がtrue
に設定されている場合、プラグインは AMQ 6admin
パーミッションを AMQ 7manage
にマップします。 -
AMQ 6 の
admin
パーミッションタイプは、宛先が存在しない場合にブローカーが宛先を自動作成し、ユーザーがその宛先にメッセージを送信するかどうかを決定します。AMQ 7 では、ユーザーが宛先にメッセージを送信するパーミッションがある場合に、自動的に宛先の自動作成を許可します。したがって、プラグインは、デフォルトで、レガシーadmin
パーミッションを上記の AMQ 7 パーミッションにマップします。また、このプラグインは、mapAdminToManage
がtrue
に設定されている場合に、AMQ 6admin
パーミッションを AMQ 7 のmanage
パーミッションにマップします。
-
AMQ 6 には同様のパーミッションタイプがないため、このマッピングにはデフォルトで、AMQ 7 の
-
allowQueueAdminOnRead
createDurableQueue、createNonDurableQueue、および deleteDurableQueue パーミッションにレガシー読み取りパーミッションをマッピングするかどうか。これにより、JMS クライアントが admin パーミッションなしに永続サブスクリプションと非永続サブスクリプションを作成できます。これは AMQ 6 で許可されます。デフォルト値は false です。
以下の表は、
allowQueueAdminOnRead
がtrue
の場合に、セキュリティー設定プラグインが AMQ 6 パーミッションタイプを AMQ 7 パーミッションタイプにマッピングする方法を示しています。AMQ 6 パーミッションタイプ AMQ 7 のパーミッションタイプ read
consume, browse, createDurableQueue, createNonDurableQueue, deleteDurableQueue
write
send
admin
createAddress、deleteAddress、deleteNonDurableQueue、manage(
mapAdminToManage
がtrue
に設定されている場合)
5.4.3. login.config ファイルでのパスワードの暗号化
組織は LDAP でデータを安全に保存することが多いので、login.config
ファイルには、ブローカーが組織の LDAP サーバーと通信するために必要な設定を含めることができます。この設定ファイルには、通常、LDAP サーバーにログインするパスワードが含まれるため、このパスワードを暗号化する必要があります。
前提条件
-
「LDAP 認証の設定」 の説明に従って、必要なプロパティーを追加するように
login.config
ファイルを修正している。
手順
以下の手順は、<broker_instance_dir>/etc/login.config
ファイルにある connectionPassword
パラメーターの値をマスクする方法を示しています。
コマンドプロンプトで、
mask
ユーティリティーを使用してパスワードを暗号化します。$ <broker_instance_dir>/bin/artemis mask <password>
result: 3a34fd21b82bf2a822fa49a8d8fa115d
<broker_instance_dir>/etc/login.config
ファイルを開きます。connectionPassword
パラメーターを見つけます。connectionPassword = <password>
プレーンテキストのパスワードは、暗号化された値に置き換えます。
connectionPassword = 3a34fd21b82bf2a822fa49a8d8fa115d
暗号化された値は、識別子
"ENC()"
でラップします。connectionPassword = "ENC(3a34fd21b82bf2a822fa49a8d8fa115d)"
login.config
ファイルにマスクされたパスワードが追加されました。パスワードは "ENC()"
識別子でラップされるため、AMQ Broker では使用前にこれを復号化します。
関連情報
- AMQ Broker に含まれる設定ファイルの詳細は、AMQ Broker configuration files and locations を参照してください。
5.4.4. 外部ロールのマッピング
LDAP などの外部認証プロバイダーからのロールを、ブローカーによって内部で使用されるロールにマップできます。
外部ロールをマッピングするには、broker.xml
設定ファイルの security-settings
要素に role-mapping エントリーを作成します。以下に例を示します。
<security-settings> ... <role-mapping from="cn=admins,ou=Group,ou=ActiveMQ,ou=system" to="my-admin-role"/> <role-mapping from="cn=users,ou=Group,ou=ActiveMQ,ou=system" to="my-user-role"/> </security-settings>
- ロールマッピングは加算されます。つまり、ユーザーは元のロールと、新たに割り当てられたロールを保持します。
- ロールマッピングは、キューアクセスを承認するロールにのみ影響し、Web コンソールアクセスを有効にする方法を提供しません。