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

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

関連情報