検索

5.4. 認証および承認での LDAP の使用

download PDF

LDAP ログインモジュールは、中央の X.500 ディレクトリーサーバーに保存されているユーザーデータに対して受信認証情報を確認して、認証および承認を有効にします。これは org.apache.activemq.artemis.spi.core.security.jaas.LDAPLoginModule で実装されます。

5.4.1. クライアント認証用の LDAP の設定

以下の手順の例は、LDAP を使用してクライアントを認証する方法を示しています。

手順

  1. <broker_instance_dir>/etc/broker.xml 設定ファイルを開きます。
  2. 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>

    上記の設定では、すべて のキューに特定のパーミッションを ユーザー ロールのメンバーに割り当てます。

  3. <broker_instance_dir>/etc/login.config ファイルを開きます。
  4. 使用しているディレクトリーサービスに基づいて、LDAP ログインモジュールを設定します。

    1. 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" などです。

    2. 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 オプションを指定する代わりに (または指定してその上に)、ロールオプション (roleBaseroleSearchMatchingroleSearchSubtree、および 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. ブローカーを起動または再起動します (サービスまたはプロセス)。

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) になります。

関連情報

5.4.2. LDAP 認証の設定

LegacyLDAPSecuritySettingPlugin セキュリティー設定プラグインは、LDAPAuthorizationMap および cachedLDAPAuthorizationMap で過去に AMQ 6 で処理されたセキュリティー情報を読み取り、できるだけ、この情報を対応する AMQ 7 セキュリティー設定に変換します。

AMQ 6 および AMQ 7 のブローカーのセキュリティー実装は、完全に一致しません。そのため、プラグインは、2 つのバージョン間の翻訳を実行し、ほぼ同等の機能を実現します。

以下の例は、プラグインを設定する方法を示しています。

手順

  1. <broker_instance_dir>/etc/broker.xml 設定ファイルを開きます。
  2. 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 には、readwrite、および 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(mapAdminToManagetrue に設定されている場合)

    下記のとおり、プラグインが AMQ 6 と AMQ 7 のパーミッションタイプ間の変換を実行するケースがあります。これにより、同等の機能を実現できます。

    • AMQ 6 には同様のパーミッションタイプがないため、このマッピングにはデフォルトで、AMQ 7 の manage パーミッションタイプが含まれません。ただし、mapAdminToManagetrue に設定されている場合、プラグインは AMQ 6 admin パーミッションを AMQ 7 manage にマップします。
    • AMQ 6 の admin パーミッションタイプは、宛先が存在しない場合にブローカーが宛先を自動作成し、ユーザーがその宛先にメッセージを送信するかどうかを決定します。AMQ 7 では、ユーザーが宛先にメッセージを送信するパーミッションがある場合に、自動的に宛先の自動作成を許可します。したがって、プラグインは、デフォルトで、レガシー admin パーミッションを上記の AMQ 7 パーミッションにマップします。また、このプラグインは、mapAdminToManagetrue に設定されている場合に、AMQ 6 admin パーミッションを AMQ 7 の manage パーミッションにマップします。
allowQueueAdminOnRead

createDurableQueue、createNonDurableQueue、および deleteDurableQueue パーミッションにレガシー読み取りパーミッションをマッピングするかどうか。これにより、JMS クライアントが admin パーミッションなしに永続サブスクリプションと非永続サブスクリプションを作成できます。これは AMQ 6 で許可されます。デフォルト値は false です。

以下の表は、allowQueueAdminOnReadtrue の場合に、セキュリティー設定プラグインが AMQ 6 パーミッションタイプを AMQ 7 パーミッションタイプにマッピングする方法を示しています。

AMQ 6 パーミッションタイプAMQ 7 のパーミッションタイプ

read

consume, browse, createDurableQueue, createNonDurableQueue, deleteDurableQueue

write

send

admin

createAddress、deleteAddress、deleteNonDurableQueue、manage( mapAdminToManagetrue に設定されている場合)

5.4.3. login.config ファイルでのパスワードの暗号化

組織は LDAP でデータを安全に保存することが多いので、login.config ファイルには、ブローカーが組織の LDAP サーバーと通信するために必要な設定を含めることができます。この設定ファイルには、通常、LDAP サーバーにログインするパスワードが含まれるため、このパスワードを暗号化する必要があります。

前提条件

  • 「LDAP 認証の設定」 の説明に従って、必要なプロパティーを追加するように login.config ファイルを修正している。

手順

以下の手順は、<broker_instance_dir>/etc/login.config ファイルにある connectionPassword パラメーターの値をマスクする方法を示しています。

  1. コマンドプロンプトで、mask ユーティリティーを使用してパスワードを暗号化します。

    $ <broker_instance_dir>/bin/artemis mask <password>
    result: 3a34fd21b82bf2a822fa49a8d8fa115d
  2. <broker_instance_dir>/etc/login.config ファイルを開きます。connectionPassword パラメーターを見つけます。

    connectionPassword = <password>
  3. プレーンテキストのパスワードは、暗号化された値に置き換えます。

    connectionPassword = 3a34fd21b82bf2a822fa49a8d8fa115d
  4. 暗号化された値は、識別子 "ENC()" でラップします。

    connectionPassword = "ENC(3a34fd21b82bf2a822fa49a8d8fa115d)"

login.config ファイルにマスクされたパスワードが追加されました。パスワードは "ENC()" 識別子でラップされるため、AMQ Broker では使用前にこれを復号化します。

関連情報

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 コンソールアクセスを有効にする方法を提供しません。
Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.