このトピックでは、EMR Kafka の LDAP 認証を有効化する方法について説明し、詳細な例を示します。
前提条件
Dataflow クラスターを作成し、Kafka および OpenLDAP サービスを選択しました。詳細については、「Dataflow Kafka クラスターの作成」をご参照ください。
制限事項
-
この機能は、EMR V3.44.0 以降または EMR V5.10.0 以降を実行する EMR Kafka クラスターで利用できます。
-
クラスター内で EMR OpenLDAP サービスまたは外部 LDAP サービスが利用可能である必要があります。
このトピックでは、EMR OpenLDAP サービスを例として使用します。
注意事項
ユーザーグループ認証を使用する場合は、LDAP サービスで memberOf オーバーレイ機能が有効化されているか、LDAP ユーザーに対して memberOf 属性がサポートされていることを確認してください。
LDAP 認証の有効化
-
スーパーユーザーを作成します。
説明すでにスーパーユーザーを作成している場合は、この手順をスキップできます。
Kafka スーパーユーザーは、すべての Kafka リソースにアクセスできます。スーパーユーザーは、ブローカーノードと他のコンポーネント間の通信を処理します。この例では、EMR OpenLDAP サービスを使用して Kafka スーパーユーザーを追加する方法を示します。
-
SSH を使用してクラスターの master-1-1 ノードに接続します。詳細については、「クラスターにログオンする」をご参照ください。
-
次の内容で kafka.ldif という名前のファイルを作成します。
このトピックでは、
ldapコマンドを使用して、UID がkafka、パスワードがkafka-secretの LDAP ユーザーを追加します。dn: uid=kafka,ou=people,o=emr cn: kafka sn: kafka objectClass: inetOrgPerson userPassword: kafka-secret uid: kafka -
次のコマンドを実行して、LDAP ユーザーを追加します。
ldapadd -H ldap://master-1-1:10389 -f kafka.ldif -D ${uid} -w ${rootDnPW}説明-
${uid}: EMR コンソールの OpenLDAP サービスの Configure ページにある admin_dn パラメーターの値。 -
${rootDnPW}:EMR コンソールの OpenLDAP サービスのConfigureページにあるadmin_pwd パラメーターの値。 -
10389:OpenLDAP サービスのリッスンポート。
ユーザーを追加した後、次のコマンドを実行してユーザー情報を表示します。
ldapsearch -w ${rootDnPW} -D ${uid} -H ldap://master-1-1:10389 -b uid=kafka,ou=people,o=emr -
-
-
Kafka 設定ページに移動します。
-
EMR on ECS コンソールにログインします。
-
上部メニューで、必要なリージョンとリソースグループを選択します。
-
対象のクラスターのServices列で、[サービス] をクリックします。
-
Services ページで、Kafka サービスセクションの Configure をクリックします。
-
-
設定を変更して保存します。
-
Configure ページで、[server.properties] タブをクリックします。
-
kafka.ssl.config.type 設定項目の値を CUSTOM に変更します。
-
authorizer.class.name 設定項目の値を kafka.security.ldap.authorizer.SimpleLdapAuthorizer に変更します。
-
設定を保存します。
-
Saveをクリックします。
-
ダイアログボックスで、Execution Reason フィールドに理由を入力します。
-
-
-
カスタムパラメータを追加して保存します。
-
[server.properties] タブで、Add Configuration Item をクリックします。
-
[Add Configuration Item] ダイアログボックスで、次の項目を追加します。
パラメータ
値
説明
super.users
User:kafka
kafkaは、作成したユーザー名です。必要に応じて置き換えてください。詳細については、「ステップ 1」をご参照ください。
listener.name.${listener}.sasl.enabled.mechanisms
PLAIN
${listener} を、
sasl_sslなどの特定のリスナー名に置き換えます。listener.name.${listener}.plain.sasl.jaas.config
org.apache.kafka.common.security.plain.PlainLoginModule required username="kafka" password="kafka-secret" emr.kafka.security.ldap.user.name.attribute="uid" emr.kafka.security.ldap.user.base.dn="ou=people,o=emr" emr.kafka.security.ldap.group.name.attribute="cn" emr.kafka.security.ldap.group.base.dn="ou=groups,o=emr" emr.kafka.security.ldap.admin.name.attribute="uid" emr.kafka.security.ldap.admin.base.dn="o=emr" emr.kafka.security.ldap.url="ldaps://master-1-1:10636" emr.kafka.security.ldap.bind.user="admin" emr.kafka.security.ldap.bind.user.password="WMMuhh3P**********" emr.kafka.security.ldap.user.member.of.attribute="memberOf" emr.kafka.security.ldap.group.authorization.support="true" ;${listener} を、
sasl_sslなどの特定のリスナー名に置き換えます。また、次の LDAP 関連の設定値も置き換える必要があります:
-
username:Kafka サービスがノード間通信に使用するスーパーユーザー。 -
emr.kafka.security.ldap.user.name.attribute:ユーザー名を取得するために使用される LDAP ユーザー名属性。 -
emr.kafka.security.ldap.user.base.dn:LDAP ユーザーのベース識別名 (DN)。 -
emr.kafka.security.ldap.group.name.attribute:LDAP ユーザーグループ名の属性。
-
emr.kafka.security.ldap.group.base.dn:LDAP ユーザーグループのベース DN。 -
emr.kafka.security.ldap.admin.name.attribute:LDAP 管理者ユーザー属性。 -
emr.kafka.security.ldap.admin.base.dn:LDAP 管理者ユーザーのベース DN。 -
emr.kafka.security.ldap.url:LDAP URL。 -
emr.kafka.security.ldap.bind.user:ユーザーグループ認証に使用される LDAP 管理者ユーザー名。 -
emr.kafka.security.ldap.bind.user.password:LDAP 管理者のパスワード。 -
emr.kafka.security.ldap.user.member.of.attribute:ユーザーが属するグループを示す属性。 -
emr.kafka.security.ldap.group.authorization.support:グループ認可を有効にするかどうかを指定します。このパラメータがtrueに設定されている場合、ユーザーは割り当てられたユーザーグループから権限を継承します。
listener.name.${listener}.plain.sasl.server.callback.handler.class
kafka.security.ldap.authenticator.LdapAuthenticateCallbackHandler
${listener} を、
sasl_sslなどの特定のリスナー名に置き換えます。sasl.mechanism.inter.broker.protocol
PLAIN
なし
sasl.enabled.mechanisms
PLAIN
なし
-
-
その他のパラメータを変更します。
要件に基づいて、次の設定を変更します。
説明kafka.client.jaas.content パラメータの値に含まれるユーザー名とパスワードは、必要に応じて置き換える必要があります。スーパーユーザーを使用することを推奨します。
設定ファイル
パラメータ
値
説明
kafka_client_jaas.conf
kafka.client.jaas.content
KafkaClient { org.apache.kafka.common.security.plain.PlainLoginModule required username="kafka" password="kafka-secret"; };値はセミコロン (;) で終わる必要があります。
schema-registry.properties
schema_registry_opts
-Djava.security.auth.login.config=/etc/taihao-apps/kafka-conf/kafka-conf/kafka_client_jaas.confこのパラメータにすでに値がある場合は、新しい内容を追記します。
kafka-rest.properties
kafkarest_opts
-Djava.security.auth.login.config=/etc/taihao-apps/kafka-conf/kafka-conf/kafka_client_jaas.confこのパラメータにすでに値がある場合は、新しい内容を追記します。
-
-
Kafka サービスを再起動します。
-
Kafka サービスの Configure ページで、 を選択します。
-
表示されるダイアログボックスに操作の理由を入力し、OK をクリックします。
-
Confirm ダイアログボックスで、OK をクリックします。
-
使用例
この例の操作は、オープンソースの Kafka 2.4.1 に適用されます。他の Kafka バージョンについては、「Apache Kafka」をご参照ください。
-
テストユーザーとユーザーグループを作成します。
-
OpenLDAP で memberOf オーバーレイ機能が有効化されていない場合は、次の手順に従って有効化します。
説明-
次の設定方法は参考用です。memberOf オーバーレイを有効化する方法は、LDAP サービスによって異なります。
-
この設定をすべての OpenLDAP ノードに適用します。
-
次のすべての設定ファイルのパラメータを、必要に応じて変更します。例:
-
olcModulepath:32 ビットオペレーティングシステムの場合、パスは /usr/lib/openldap です。 -
dn: cn=module{0},cn=config:/etc/openldap/slapd.d/cn=config ディレクトリにすでに cn=module{0}.ldif ファイルが含まれている場合は、moduleの後の番号を 1 に変更します。cn=module{1}.ldif ファイルが含まれている場合は、番号を 2 に変更します。以下同様です。 -
dn: olcOverlay={0}memberof,olcDatabase={2}hdb,cn=configは、/etc/openldap/slapd.d/cn=config ディレクトリにある olcDatabase の値に基づいて設定します。 たとえば、olcDatabase={2}hdb.ldifが存在する場合、値をhdbに設定します。
-
-
vim memberof_config.ldifコマンドを実行して、新しい設定ファイル memberof_config.ldif を作成します。ファイルの内容は次のとおりです。dn: cn=module{0},cn=config cn: module{0} objectClass: olcModuleList objectclass: top olcModuleload: memberof.la olcModulePath: /usr/lib64/openldap dn: olcOverlay={0}memberof,olcDatabase={2}hdb,cn=config objectClass: olcConfig objectClass: olcMemberOf objectClass: olcOverlayConfig objectClass: top olcOverlay: memberof olcMemberOfDangling: ignore olcMemberOfRefInt: TRUE olcMemberOfGroupOC: groupOfNames olcMemberOfMemberAD: member olcMemberOfMemberOfAD: memberOf -
vim refint1.ldifコマンドを実行して、設定ファイル refint1.ldif を作成します。ファイルの内容は次のとおりです。dn: cn=module{0},cn=config add: olcmoduleload olcmoduleload: refint -
vim refint2.ldifコマンドを実行して、次の内容で新しい設定ファイル refint2.ldif を作成します。dn: olcOverlay=refint,olcDatabase={2}hdb,cn=config objectClass: olcConfig objectClass: olcOverlayConfig objectClass: olcRefintConfig objectClass: top olcOverlay: refint olcRefintAttribute: memberof member manager owner -
次のコマンドを実行して、設定ファイルを読み込みます。
ldapadd -Q -Y EXTERNAL -H ldapi:/// -f memberof_config.ldif ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f refint1.ldif ldapadd -Q -Y EXTERNAL -H ldapi:/// -f refint2.ldif
-
-
テストユーザーを作成します。
次の内容で kafka-users.ldif という名前のファイルを作成し、ldapadd コマンドを使用してテストユーザーを追加します。
dn: uid=kafka-user1,ou=people,o=emr cn: kafka-user1 sn: kafka-user1 uid: kafka-user1 objectClass: inetOrgPerson userPassword: kafka-secret dn: uid=kafka-user2,ou=people,o=emr cn: kafka-user2 sn: kafka-user2 uid: kafka-user2 objectClass: inetOrgPerson userPassword: kafka-secret -
テストユーザーグループを作成します。
次の内容で kafka-groups.ldif という名前のファイルを作成し、ldapadd コマンドを使用してテストユーザーグループを追加します。
dn: cn=kafka-group1,ou=groups,o=emr cn: kafka-group1 objectClass: groupOfNames member: uid=kafka-user1,ou=people,o=emr member: uid=kafka-user2,ou=people,o=emr dn: cn=kafka-group2,ou=groups,o=emr cn: kafka-group2 objectClass: groupOfNames member: uid=kafka-user1,ou=people,o=emr -
LDAP が実行されているサーバーで、次のコマンドを実行して、テストユーザーの
memberOf属性を確認します。ldapsearch -Q -Y EXTERNAL -H ldapi:/// -b ou=people,o=emr memberOf出力は、
kafka-user1のmemberOf属性にはkafka-group1とkafka-group2が含まれ、kafka-user2のmemberOf属性にはkafka-group1が含まれることを示しています。
-
-
クライアント設定ファイルを作成します。
-
次の内容で client.properties という名前のクライアント設定ファイルを作成します。
security.protocol=SASL_PLAINTEXT sasl.mechanism=PLAIN # クライアントの識別に合わせてユーザー名とパスワードを置き換えます。 sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="kafka" password="kafka-secret"; -
次の内容で kafka-user1.properties という名前のクライアント設定ファイルを作成します。
security.protocol=SASL_PLAINTEXT sasl.mechanism=PLAIN # クライアントの識別に合わせてユーザー名とパスワードを置き換えます。 sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="kafka-user1" password="kafka-secret"; -
次の内容で kafka-user2.properties という名前のクライアント設定ファイルを作成します。
security.protocol=SASL_PLAINTEXT sasl.mechanism=PLAIN # クライアントの識別に合わせてユーザー名とパスワードを置き換えます。 sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="kafka-user2" password="kafka-secret";
-
-
test という名前のテストトピックを作成します。
kafka-topics.sh --bootstrap-server core-1-1:9092 --command-config client.properties --create --topic test --replication-factor 3 --partitions 2 -
権限を付与します。
認可コマンドの詳細については、「認可と ACL」をご参照ください。
# kafka-group2 の権限 kafka-acls.sh --authorizer-properties zookeeper.connect=$KAFKA_ZOOKEEPER --add --allow-principal User:kafka-group2 --allow-host "*" --operation All --cluster kafka-cluster kafka-acls.sh --authorizer-properties zookeeper.connect=$KAFKA_ZOOKEEPER --add --allow-principal User:kafka-group2 --allow-host "*" --operation All --topic test # kafka-group1 の権限 kafka-acls.sh --authorizer-properties zookeeper.connect=$KAFKA_ZOOKEEPER --add --deny-principal User:kafka-group1 --deny-host "*" --operation All --topic test # kafka-user1 の権限 kafka-acls.sh --authorizer-properties zookeeper.connect=$KAFKA_ZOOKEEPER --add --deny-principal User:kafka-user1 --deny-host "*" --operation Read --topic test # kafka-user2 の権限 kafka-acls.sh --authorizer-properties zookeeper.connect=$KAFKA_ZOOKEEPER --add --allow-principal User:kafka-user2 --allow-host "*" --operation Read --topic test次のコマンドを実行して、認可結果を表示できます。
kafka-acls.sh --authorizer-properties zookeeper.connect=$KAFKA_ZOOKEEPER --list --topic test次の情報が返されます:
Current ACLs for resource `Topic:LITERAL:test`: User:kafka-group2 has Allow permission for operations: All from hosts: * User:kafka-user2 has Allow permission for operations: Read from hosts: * User:kafka-user1 has Deny permission for operations: Read from hosts: * User:kafka-group1 has Deny permission for operations: All from hosts: * -
権限を検証します。
-
ユーザー
kafka-user1はtestトピックに書き込むことができません。kafka-console-producer.sh --broker-list core-1-1:9092 --producer.config ./kafka-user1.properties --topic testプロンプトでテストメッセージを入力します。書き込み操作は、
kafka-group1に設定されたDenyルールがkafka-group2のAllowルールより優先されるため失敗します。# プロンプトの後にテストメッセージを入力します。 >test # 認可が失敗します。 -
ユーザー
kafka-user1はtestトピックから読み取ることができません。# コンシューマーグループに権限を付与します。 kafka-acls.sh --authorizer-properties zookeeper.connect=$KAFKA_ZOOKEEPER --add --allow-principal User:kafka-user1 --allow-host "*" --operation All --group kafka-user1-consumer kafka-console-consumer.sh --bootstrap-server core-1-1:9092 --consumer.config ./kafka-user1.properties --topic test --group kafka-user1-consumer認可が失敗し、ユーザーは
testトピックにアクセスできません。 -
ユーザー
kafka-user2はtestトピックに書き込むことができません。kafka-console-producer.sh --broker-list core-1-1:9092 --producer.config ./kafka-user2.properties --topic test # プロンプトの後にテストメッセージを入力します。 >a # 認可が失敗します。認可が失敗します。
-
ユーザー
kafka-user2はtestトピックから読み取ることができません。# コンシューマーグループに権限を付与します。 kafka-acls.sh --authorizer-properties zookeeper.connect=$KAFKA_ZOOKEEPER --add --allow-principal User:kafka-user2 --allow-host "*" --operation All --group kafka-user2-consumer kafka-console-consumer.sh --bootstrap-server core-1-1:9092 --consumer.config ./kafka-user2.properties --topic test --group kafka-user2-consumer --from-beginning # kafka-group1 に設定された Deny ルールが優先されるため、認可が失敗しデータは消費されません。
-