Topik ini menjelaskan cara mengaktifkan otentikasi LDAP untuk EMR Kafka dan menyediakan contoh terperinci.
Prasyarat
Anda telah membuat kluster Dataflow dan memilih layanan Kafka serta OpenLDAP. Untuk informasi lebih lanjut, lihat Buat kluster Dataflow Kafka.
Batasan
-
Fitur ini tersedia untuk kluster EMR Kafka yang menjalankan EMR V3.44.0 atau versi lebih baru, atau EMR V5.10.0 atau versi lebih baru.
-
Layanan EMR OpenLDAP atau layanan LDAP eksternal tersedia di kluster.
Topik ini menggunakan layanan EMR OpenLDAP sebagai contoh.
Peringatan
Jika Anda ingin menggunakan otentikasi berbasis kelompok pengguna, pastikan fitur memberOf overlay diaktifkan untuk layanan LDAP atau atribut memberOf didukung untuk pengguna LDAP.
Aktifkan otentikasi LDAP
-
Buat superuser.
CatatanJika Anda telah membuat superuser, Anda dapat melewati langkah ini.
Superuser Kafka dapat mengakses semua resource Kafka. Superuser menangani komunikasi antara node broker dan komponen lainnya. Contoh ini menggunakan layanan EMR OpenLDAP untuk menunjukkan cara menambahkan superuser Kafka.
-
Hubungkan ke node master-1-1 kluster melalui SSH. Untuk informasi lebih lanjut, lihat Masuk ke kluster.
-
Buat file bernama kafka.ldif dengan konten berikut.
Topik ini menggunakan perintah
ldapuntuk menambahkan pengguna LDAP dengan UIDkafkadan passwordkafka-secret.dn: uid=kafka,ou=people,o=emr cn: kafka sn: kafka objectClass: inetOrgPerson userPassword: kafka-secret uid: kafka -
Jalankan perintah berikut untuk menambahkan pengguna LDAP.
ldapadd -H ldap://master-1-1:10389 -f kafka.ldif -D ${uid} -w ${rootDnPW}Catatan-
${uid}: Nilai parameter admin_dn pada halaman Configure layanan OpenLDAP di Konsol EMR. -
${rootDnPW}: Nilai parameter admin_pwd pada halaman Configure layanan OpenLDAP di Konsol EMR. -
10389: Port pendengar layanan OpenLDAP.
Setelah menambahkan pengguna, jalankan perintah berikut untuk melihat informasinya.
ldapsearch -w ${rootDnPW} -D ${uid} -H ldap://master-1-1:10389 -b uid=kafka,ou=people,o=emr -
-
-
Buka halaman konfigurasi Kafka.
-
Masuk ke Konsol EMR on ECS.
-
Pada bilah navigasi atas, pilih wilayah yang diperlukan dan kelompok sumber daya.
-
Pada kolom Actions kluster target, klik Services.
-
Pada halaman Services, klik Configure di bagian layanan Kafka.
-
-
Ubah dan simpan konfigurasi.
-
Pada halaman Configure, klik tab server.properties.
-
Ubah nilai item konfigurasi kafka.ssl.config.type menjadi CUSTOM.
-
Ubah nilai item konfigurasi authorizer.class.name menjadi kafka.security.ldap.authorizer.SimpleLdapAuthorizer.
-
Simpan konfigurasi.
-
Klik Save.
-
Pada kotak dialog, masukkan alasan dalam bidang Execution Reason.
-
-
-
Tambahkan dan simpan parameter kustom.
-
Pada tab server.properties, klik Add Configuration Item.
-
Pada kotak dialog Add Configuration Item, tambahkan item berikut.
Parameter
Nilai
Deskripsi
super.users
User:kafka
kafkaadalah username yang telah Anda buat. Ganti sesuai kebutuhan.Untuk informasi lebih lanjut, lihat Langkah 1.
listener.name.${listener}.sasl.enabled.mechanisms
PLAIN
Ganti ${listener} dengan nama listener tertentu, seperti
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" ;Ganti ${listener} dengan nama listener tertentu, seperti
sasl_ssl.Anda juga harus mengganti nilai konfigurasi terkait LDAP berikut:
-
username: Superuser yang digunakan layanan Kafka untuk komunikasi antar node. -
emr.kafka.security.ldap.user.name.attribute: Atribut nama pengguna LDAP yang digunakan untuk mendapatkan username. -
emr.kafka.security.ldap.user.base.dn: Base distinguished name (DN) pengguna LDAP. -
emr.kafka.security.ldap.group.name.attribute: Atribut untuk nama kelompok pengguna LDAP.
-
emr.kafka.security.ldap.group.base.dn: Base DN kelompok pengguna LDAP. -
emr.kafka.security.ldap.admin.name.attribute: Atribut pengguna admin LDAP. -
emr.kafka.security.ldap.admin.base.dn: Base DN pengguna admin LDAP. -
emr.kafka.security.ldap.url: URL LDAP. -
emr.kafka.security.ldap.bind.user: Username administrator LDAP yang digunakan untuk otentikasi kelompok pengguna. -
emr.kafka.security.ldap.bind.user.password: Password administrator LDAP. -
emr.kafka.security.ldap.user.member.of.attribute: Atribut yang menunjukkan kelompok-kelompok tempat pengguna tergabung. -
emr.kafka.security.ldap.group.authorization.support: Menentukan apakah otorisasi berbasis kelompok diaktifkan. Jika parameter ini diatur ketrue, pengguna mewarisi izin dari kelompok pengguna yang ditugaskan.
listener.name.${listener}.plain.sasl.server.callback.handler.class
kafka.security.ldap.authenticator.LdapAuthenticateCallbackHandler
Ganti ${listener} dengan nama listener tertentu, seperti
sasl_ssl.sasl.mechanism.inter.broker.protocol
PLAIN
Tidak ada
sasl.enabled.mechanisms
PLAIN
Tidak ada
-
-
Ubah parameter lainnya.
Ubah konfigurasi berikut sesuai kebutuhan Anda.
CatatanAnda harus mengganti username dan password dalam nilai parameter kafka.client.jaas.content sesuai kebutuhan. Kami menyarankan agar Anda menggunakan superuser.
File konfigurasi
Parameter
Nilai
Deskripsi
kafka_client_jaas.conf
kafka.client.jaas.content
KafkaClient { org.apache.kafka.common.security.plain.PlainLoginModule required username="kafka" password="kafka-secret"; };Nilai harus diakhiri dengan titik koma (;).
schema-registry.properties
schema_registry_opts
-Djava.security.auth.login.config=/etc/taihao-apps/kafka-conf/kafka-conf/kafka_client_jaas.confJika parameter ini sudah memiliki nilai, tambahkan konten baru tersebut.
kafka-rest.properties
kafkarest_opts
-Djava.security.auth.login.config=/etc/taihao-apps/kafka-conf/kafka-conf/kafka_client_jaas.confJika parameter ini sudah memiliki nilai, tambahkan konten baru tersebut.
-
-
Restart layanan Kafka.
-
Pada halaman Configure layanan Kafka, pilih .
-
Pada kotak dialog yang muncul, masukkan alasan tindakan tersebut dan klik OK.
-
Pada kotak dialog Confirm, klik OK.
-
Contoh penggunaan
Operasi dalam contoh ini berlaku untuk Kafka open source 2.4.1. Untuk versi Kafka lainnya, lihat Apache Kafka.
-
Buat pengguna uji coba dan kelompok pengguna.
-
Jika fitur memberOf overlay tidak diaktifkan untuk OpenLDAP, ikuti langkah-langkah berikut untuk mengaktifkannya.
Catatan-
Metode konfigurasi berikut hanya sebagai referensi. Metode untuk mengaktifkan memberOf overlay bervariasi tergantung layanan LDAP.
-
Terapkan konfigurasi ini ke semua node OpenLDAP.
-
Ubah parameter dalam semua file konfigurasi berikut sesuai kebutuhan. Misalnya:
-
olcModulepath: Untuk sistem operasi 32-bit, path-nya adalah /usr/lib/openldap. -
dn: cn=module{0},cn=config: Jika direktori /etc/openldap/slapd.d/cn=config sudah berisi file cn=module{0}.ldif, ubah angka setelahmodulemenjadi 1. Jika berisi file cn=module{1}.ldif, ubah angka menjadi 2, dan seterusnya. -
dn: olcOverlay={0}memberof,olcDatabase={2}hdb,cn=config: Konfigurasikan nilai ini berdasarkan nilai olcDatabase di direktori /etc/openldap/slapd.d/cn=config. Misalnya, jika fileolcDatabase={2}hdb.ldifada, atur nilainya menjadihdb.
-
-
Jalankan perintah
vim memberof_config.ldifuntuk membuat file konfigurasi baru memberof_config.ldif. Konten file tersebut adalah sebagai berikut.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 -
Jalankan perintah
vim refint1.ldifuntuk membuat file konfigurasi refint1.ldif. Konten file tersebut adalah sebagai berikut.dn: cn=module{0},cn=config add: olcmoduleload olcmoduleload: refint -
Jalankan perintah
vim refint2.ldifuntuk membuat file konfigurasi baru refint2.ldif dengan konten berikut.dn: olcOverlay=refint,olcDatabase={2}hdb,cn=config objectClass: olcConfig objectClass: olcOverlayConfig objectClass: olcRefintConfig objectClass: top olcOverlay: refint olcRefintAttribute: memberof member manager owner -
Jalankan perintah berikut untuk memuat file konfigurasi.
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
-
-
Buat pengguna uji coba.
Buat file bernama kafka-users.ldif dengan konten berikut, lalu gunakan perintah ldapadd untuk menambahkan pengguna uji coba.
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 -
Buat kelompok pengguna uji coba.
Buat file bernama kafka-groups.ldif dengan konten berikut, lalu gunakan perintah ldapadd untuk menambahkan kelompok pengguna uji coba.
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 -
Di server tempat LDAP berjalan, jalankan perintah berikut untuk memeriksa atribut
memberOfpengguna uji coba.ldapsearch -Q -Y EXTERNAL -H ldapi:/// -b ou=people,o=emr memberOfOutput menunjukkan bahwa atribut
memberOfmilikkafka-user1mencakupkafka-group1dankafka-group2, sedangkan atributmemberOfmilikkafka-user2mencakupkafka-group1.
-
-
Buat file konfigurasi klien.
-
Buat file konfigurasi klien bernama client.properties dengan konten berikut.
security.protocol=SASL_PLAINTEXT sasl.mechanism=PLAIN #Ganti username dan password berdasarkan identitas klien. sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="kafka" password="kafka-secret"; -
Buat file konfigurasi klien bernama kafka-user1.properties dengan konten berikut.
security.protocol=SASL_PLAINTEXT sasl.mechanism=PLAIN #Ganti username dan password berdasarkan identitas klien. sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="kafka-user1" password="kafka-secret"; -
Buat file konfigurasi klien bernama kafka-user2.properties dengan konten berikut.
security.protocol=SASL_PLAINTEXT sasl.mechanism=PLAIN #Ganti username dan password berdasarkan identitas klien. sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="kafka-user2" password="kafka-secret";
-
-
Buat topik uji coba bernama test.
kafka-topics.sh --bootstrap-server core-1-1:9092 --command-config client.properties --create --topic test --replication-factor 3 --partitions 2 -
Berikan izin.
Untuk informasi lebih lanjut tentang perintah otorisasi, lihat Authorization and ACLs.
#Izin untuk 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 #Izin untuk kafka-group1 kafka-acls.sh --authorizer-properties zookeeper.connect=$KAFKA_ZOOKEEPER --add --deny-principal User:kafka-group1 --deny-host "*" --operation All --topic test #Izin untuk kafka-user1 kafka-acls.sh --authorizer-properties zookeeper.connect=$KAFKA_ZOOKEEPER --add --deny-principal User:kafka-user1 --deny-host "*" --operation Read --topic test #Izin untuk kafka-user2 kafka-acls.sh --authorizer-properties zookeeper.connect=$KAFKA_ZOOKEEPER --add --allow-principal User:kafka-user2 --allow-host "*" --operation Read --topic testAnda dapat menjalankan perintah berikut untuk melihat hasil otorisasi.
kafka-acls.sh --authorizer-properties zookeeper.connect=$KAFKA_ZOOKEEPER --list --topic testInformasi berikut dikembalikan:
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: * -
Verifikasi izin.
-
Pengguna
kafka-user1dapat menulis ke topiktestmelaluikafka-group2.kafka-console-producer.sh --broker-list core-1-1:9092 --producer.config ./kafka-user1.properties --topic testMasukkan pesan uji coba pada prompt. Operasi penulisan berhasil.
#Masukkan pesan uji coba setelah prompt. >a >b >c >d -
Pengguna
kafka-user1tidak dapat membaca dari topiktest.#Berikan izin ke kelompok konsumen. kafka-acls.sh --authorizer-properties zookeeper.connect=$KAFKA_ZOOKEEPER --add --allow-principal User:kafka-user1 --allow-host "*" --operation All --group kka-user1-consumer kafka-console-consumer.sh --bootstrap-server core-1-1:9092 --consumer.config ./kafka-user1.properties --topic test --group kafka-user1-consumerOtentikasi gagal, dan pengguna tidak dapat mengakses topik
test. -
Pengguna
kafka-user2tidak dapat menulis ke topiktest.kafka-console-producer.sh --broker-list core-1-1:9092 --producer.config ./kafka-user2.properties --topic test #Masukkan pesan uji coba setelah prompt. >a #Otentikasi gagal.Otentikasi gagal.
-
Pengguna
kafka-user2dapat membaca dari topiktest.#Berikan izin ke kelompok konsumen. 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 #Data dikonsumsi sesuai harapan.
-