LDAP での Kafka クライアント認証の構成

重要

このソフトウェアは、Confluent エンタープライズライセンス を取得することで使用できます。このソフトウェアは、ライセンスキーがなくても 30 日間試用できます。既にご契約の場合は、詳細について Confluent サポート(support@confluent.io)にお問い合わせください。このライセンスは Kafka ブローカーに適用されることに注意してください。Kafka クライアントにライセンスは必要ありません。

Active Directory(AD)および LDAP あるいはその一方を使用して、SASL/PLAIN を使用するすべての Kafka クラスターの間で Kafka クライアント認証を構成できます。SASL/PLAIN を LDAP にバインドするには、Kafka クライアントからパスワードを指定する必要があります。Kafka クライアントの認証情報(パスワード)を Kafka クライアントから送信することはできないため、SASL/SCRAM は LDAP にバインドできないことに注意してください。

Kafka クラスターを起動する前に、LDAP サーバー(AD など)をセットアップする必要があります。以下の構成は、ブローカーが実行されているホストから DNS ルックアップを使用してアクセスできる LDAP サーバーが URL LDAPSERVER.EXAMPLE.COM:3268 にあることを前提としています。この構成では Kerberos 対応の LDAP サーバーを想定していますが、Kerberos は必須ではありません。LDAP が Kerberos をサポートしている場合は、単純バインドを実行できます。これらのセキュリティ設定は、使用する LDAP サーバーの構成と一致する必要があります。

LDAP サーバーが Kerberos を使用して Kafka クライアントを認証する場合は、LDAP オーソライザー用にキータブファイルが必要になり、オーソライザーの JAAS 構成オプション ldap.sasl.jaas.config でキータブファイルとプリンシパルをアップデートする必要があります。

ちなみに

LDAP により Kafka クライアント認証を構成するアプローチは、使用する LDAP メカニズムにより大きく異なります。

LDAP サーバーが認証情報を検証するよう Kafka がリクエストする(推奨)

このメソッドを使用して、Kafka はユーザー指定の LDAP ログイン認証情報を取得し、ユーザー名を LDAP 形式の名前(DN=JDoe,OU=eng,DC=org,DC=com など)に変換します。その後、この LDAP 形式の名前とユーザー指定のパスワードを使用して、識別されたユーザーとして LDAP にログインします。これは 単純バインド と呼ばれます。この方法では、LDAP に多くの新しいコネクターやバインドが作成される可能性がありますが、Kafka は LDAP に保管されたユーザーパスワードにアクセスする必要がないため、よりセキュアであると考えられます。

ユーザーに代わり Kafka に単純バインドを実行させることで、ローカルの比較を避け、LDAP サーバーに検証を実行させる場合は、ldap.user.password.attribute に値を指定しないでください。

Kafka がパスワードのローカル比較を実行する

この方法を使用して、Kafka は、ldap.user.password.attribute プロパティのユーザーエントリのハッシュ化されたパスワードを含むローカルの LDAP エントリをフェッチします。Kafka は、ユーザー指定のパスワードを取得し、ローカルでハッシュ化を実行して、これを LDAP ユーザーエントリに保管されているものと比較します。

Kafka に、LDAP サーバーの ldap.user.object.class に保管されているユーザーパスワードをフェッチさせ、認証情報の検証をローカルで実行させる場合には、ldap.user.password.attribute を指定して、ユーザーパスワードを含むスキーマの LDAP 属性を指示します。これは非推奨であり、セキュアでもベストプラクティスでもありません。なぜなら、ハッシュ化されたパスワードを LDAP から読み取る権限が Kafka に必要になり、たとえば LDAP サーバーが Kafka の認識しないハッシュ関数を使用した場合に、互換性の問題を引き起こす可能性があるためです。

AD または LDAP で Kafka クライアント認証を構成するには、以下のとおり実行します。

  1. LDAP サーバーを起動します。

  2. 次のとおり対象ユーザー名とパスワードを LDAP に追加します。

    dn: uid=client,ou=people,dc=planetexpress,dc=com
    userPassword: client-secret
    
  3. LDAP コールバックハンドラーをブローカーの server.properties に追加して、LDAP 認証を Kafka クライアントに対して有効にします。

    次のとおり SASL 構成を追加します。

    listener.name.sasl_plaintext.sasl.enabled.mechanisms=PLAIN
    listener.name.sasl_plaintext.plain.sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required;
    
    listener.name.sasl_plaintext.plain.sasl.server.callback.handler.class=
    io.confluent.security.auth.provider.ldap.LdapAuthenticateCallbackHandler
    

    ブローカー間通信で LDAP 認証を使用する場合は、使用する SASL 構成に、ブローカーのユーザー名とパスワードを含める必要があります。

    次のとおり LDAP 構成を追加します。

    ldap.java.naming.provider.url=ldap://openldap:389
    # Authenticate to LDAP
    ldap.java.naming.security.principal=CN=admin,DC=planetexpress,DC=com
    ldap.java.naming.security.credentials=GoodNewsEveryone
    ldap.java.naming.security.authentication=simple
    # Locate users
    ldap.user.search.base=ou=people,dc=planetexpress,dc=com
    ldap.user.name.attribute=uid
    ldap.user.object.class=user
    

    注釈

    LDAP サーバーで単純バインドがサポートされていない場合のみ、ldap.user.password.attribute 属性を追加します。これ以外で ldap.user.password.attribute を追加する場合は、単純バインドは無効になります。

  4. Kafka ブローカーを再起動します。

    /bin/kafka-server-start etc/kafka/server.properties
    
  5. 次のとおり、Kafka クライアント構成を producer.properties および consumer.properties に指定します。

    sasl.mechanism=PLAIN
    security.protocol=SASL_PLAINTEXT
    sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule
      required username="client" password="client-secret";
    

    Kafka クライアント構成のパスワードを シークレット管理 を使用して暗号化することを推奨します。次の例では、暗号化された Kafka クライアント構成を示しています。

    sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule
      required username="client" password=${securepass:/secretsDemo/server.properties:server.properties/sasl.jaas.config/=org.apache.kafka.common.security.plain.PlainLoginModule /password};
    

    注釈

    認証情報はプレーンテキストで送信されます。したがって TLS を LDAP で必ず使用してください。

LDAP クライアント認証のテストとトラブルシューティング

このセクションでは、LDAP クライアント認証の構成時に想定される一般的なエラーに対処するための基本的なトラブルシューティングのヒントを示します。

以下の手順を使用して、LDAP クライアント構成をテストします。

  1. LDAP 接続を確認します。

    # Ping the LDAP host to verify connectivity
    ping ldap.hostname.com
    # Connect to the LDAP host (this command uses the default port)
    telnet ldap.hostname.com 389
    
  2. 後続のテストに使用する ldapsearch ツールをインストールします。

    sudo yum install openldap-clients -y
    
  3. 認証情報を指定せずに基本アクセスを確認します。

    ldapsearch -LLL -x -H ldap://ldap.hostname.com -s "base" -b "" supportedSASLMechanisms
    

    このコマンドを実行すると、成功応答または認証エラーが返されるはずです。それ以外のエラーが発生した場合は、LDAP が正しく設定されていません。

    成功応答は次のようになります。

    ldapsearch -LLL -x -H ldap://localhost -s "base" -b "" supportedSASLMechanisms
    dn:
    supportedSASLMechanisms: GS2-IAKERB
    supportedSASLMechanisms: GS2-KRB5
    supportedSASLMechanisms: SCRAM-SHA-1
    supportedSASLMechanisms: SCRAM-SHA-256
    supportedSASLMechanisms: GSS-SPNEGO
    supportedSASLMechanisms: GSSAPI
    supportedSASLMechanisms: DIGEST-MD5
    supportedSASLMechanisms: OTP
    supportedSASLMechanisms: NTLM
    supportedSASLMechanisms: CRAM-MD5
    

    認証エラーは次のようになります。

    ldapsearch -LLL -x -W -H ldap://localhost -s "base" -b "" supportedSASLMechanisms
    Enter LDAP Password:
    ldap_bind: Invalid credentials (49)
    

    LDAP サーバーと通信できない場合や、LDAP サーバーが LDAP 要求を受け入れるように正しく設定されていない場合は、次のようなエラーが表示されます。

    ldapsearch -LLL -x -H ldap://localhost:8090 -s "base" -b "" supportedSASLMechanisms
    ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1)
    
  4. server.propertiesldap.java.naming.security.principal で指定されているユーザーを使用して、基本認証情報ベースのアクセスを確認します。

    ldapsearch -LLL -x -H ldap://ldap.hostname.com -s "base" -b "" -D CN=kafka_user,CN=Users,DC=hostname,DC=com -w 'pa55word' supportedSASLMechanisms
    

    ldap.java.naming.security.principal の値が Kerberos プリンシパルを指している場合は、必ず LDAP から対応するユーザーを指定してください。

上記の検証テストに合格した場合は、MDS で LDAP に対する認証を実行できます。

LDAPS 経由で通信するように Kafka を構成する場合は、次のように LDAP サーバーへの TLS 接続を確認します。

# To verify the LDAP configuration
ldapsearch -LLL -x -H ldaps://ldap.hostname.com -s "base" -b "" supportedSASLMechanisms
# If using self-signed certificates from the LDAP server
LDAPTLS_CACERT=/path/to/CA.cert ldapsearch -LLL -x -H ldaps://ldap.hostname.com -s "base" -b "" supportedSASLMechanisms

Kerberos を使用して LDAP に対して認証するように Kafka を構成する場合は、次のように LDAP サーバーへの認証を確認します。

# To verify the Kerberos configuration
kinit -k -t ./filename.keytab kafka_broker/kafka1.hostname.com@EXAMPLE.COM
ldapsearch -LLL -Y GSSAPI -H ldap://ldap.hostname.com -s "base" -b "" supportedSASLMechanisms