Topik ini menjelaskan cara mengonfigurasi otentikasi berbasis LDAP untuk Kafka E-MapReduce (EMR) dan memandu Anda melalui contoh lengkap end-to-end menggunakan Kafka open source versi 2.4.1.
Prasyarat
Sebelum memulai, pastikan Anda telah:
-
Membuat kluster Dataflow dengan layanan Kafka dan OpenLDAP yang dipilih. Lihat Buat kluster Dataflow Kafka.
-
Menggunakan kluster Kafka yang menjalankan versi minor lebih baru dari EMR V3.44.0 atau EMR V5.10.0.
-
Men-deploy layanan EMR OpenLDAP (atau layanan LDAP eksternal) di dalam kluster. Topik ini menggunakan layanan EMR OpenLDAP.
Catatan penggunaan
Untuk mengonfigurasi otentikasi berbasis kelompok pengguna, fitur memberOf overlay harus diaktifkan untuk layanan LDAP, atau atribut memberOf harus dapat dikonfigurasi untuk masing-masing pengguna LDAP.
Konfigurasikan pengguna LDAP untuk otentikasi
Langkah 1: Buat superuser
Lewati langkah ini jika Anda sudah memiliki superuser Kafka.
Superuser Kafka memiliki akses ke semua resource Kafka. Dalam konfigurasi ini, superuser digunakan untuk mengakses node broker dan komponen Kafka. Langkah ini menambahkan superuser Kafka ke layanan EMR OpenLDAP.
-
Sambungkan ke node master-1-1 kluster melalui SSH. Lihat Masuk ke kluster.
-
Buat file bernama
kafka.ldifdengan konten berikut. Ini akan 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}Ganti placeholder sebagai berikut:
Placeholder Deskripsi Cara menemukannya ${uid}Nilai parameter admin_dn Configure pada halaman layanan OpenLDAP di Konsol EMR ${rootDnPW}Nilai parameter admin_pwd Configure pada halaman layanan OpenLDAP di Konsol EMR 10389adalah port listening default layanan OpenLDAP.Untuk memverifikasi bahwa pengguna telah ditambahkan, jalankan:
ldapsearch -w ${rootDnPW} -D ${uid} -H ldap://master-1-1:10389 -b uid=kafka,ou=people,o=emr
Langkah 2: Buka halaman konfigurasi layanan Kafka
-
Masuk ke Konsol EMR on ECS.
-
Pada bilah navigasi atas, pilih wilayah tempat kluster Anda berada dan pilih kelompok sumber daya.
-
Pada halaman EMR on ECS, temukan kluster Anda lalu klik Services di kolom Actions.
-
Pada tab Services, temukan Kafka lalu klik Configure.
Langkah 3: Perbarui item konfigurasi yang ada
-
Pada tab Configure, klik tab server.properties.
-
Atur kafka.ssl.config.type menjadi CUSTOM.
-
Atur authorizer.class.name menjadi kafka.security.ldap.authorizer.SimpleLdapAuthorizer.
-
Klik Save. Pada kotak dialog, isi Execution Reason dan aktifkan Automatically Update Configurations.
Langkah 4: Tambahkan item konfigurasi baru
-
Pada tab server.properties, klik Add Configuration Item.
-
Pada dialog Add Configuration Item, tambahkan item berikut:
Item konfigurasi Nilai Deskripsi super.usersUser:kafkaNama superuser yang Anda buat di Langkah 1. Ganti kafkadengan nama superuser Anda.listener.name.${listener}.sasl.enabled.mechanismsPLAINGanti ${listener}dengan nama listener Anda, misalnyasasl_ssl.listener.name.${listener}.plain.sasl.jaas.configLihat di bawah Ganti ${listener}dengan nama listener Anda. Perbarui nilai terkait LDAP sesuai konfigurasi Anda.listener.name.${listener}.plain.sasl.server.callback.handler.classkafka.security.ldap.authenticator.LdapAuthenticateCallbackHandlerGanti ${listener}dengan nama listener Anda.sasl.mechanism.inter.broker.protocolPLAINsasl.enabled.mechanismsPLAINUntuk item
listener.name.${listener}.plain.sasl.jaas.config, gunakan nilai berikut dan ganti setiap opsi sesuai konfigurasi LDAP Anda: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" ;Tabel berikut menjelaskan opsi terkait LDAP:
Opsi Deskripsi usernameNama superuser. Kafka menggunakan akun ini untuk mengakses node broker. emr.kafka.security.ldap.user.name.attributeAtribut LDAP yang digunakan untuk mengidentifikasi nama pengguna (digunakan untuk mencari username). emr.kafka.security.ldap.user.base.dnBase distinguished name (DN) untuk pengguna LDAP. emr.kafka.security.ldap.group.name.attributeAtribut LDAP yang digunakan untuk mengidentifikasi nama kelompok. emr.kafka.security.ldap.group.base.dnBase DN untuk kelompok pengguna LDAP. emr.kafka.security.ldap.admin.name.attributeAtribut LDAP yang digunakan untuk mengidentifikasi nama pengguna admin. emr.kafka.security.ldap.admin.base.dnBase DN untuk pengguna admin LDAP. emr.kafka.security.ldap.urlURL layanan OpenLDAP. emr.kafka.security.ldap.bind.userUsername administrator LDAP, digunakan untuk otentikasi kelompok pengguna. emr.kafka.security.ldap.bind.user.passwordPassword untuk administrator LDAP. emr.kafka.security.ldap.user.member.of.attributeAtribut LDAP yang mencatat kelompok mana saja yang diikuti oleh pengguna. emr.kafka.security.ldap.group.authorization.supportAtur ke trueuntuk mengaktifkan otorisasi berbasis kelompok. Saat diaktifkan, pengguna mewarisi izin dari kelompok yang mereka ikuti. -
Perbarui file konfigurasi berikut sesuai kebutuhan Anda:
Ganti username dan password dalam
kafka.client.jaas.contentdengan kredensial aktual Anda. Gunakan kredensial superuser untuk akses tingkat broker.File konfigurasi Parameter Nilai Catatan kafka_client_jaas.conf kafka.client.jaas.contentKafkaClient { 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 nilai sudah ada, tambahkan ini di akhir. kafka-rest.properties kafkarest_opts-Djava.security.auth.login.config=/etc/taihao-apps/kafka-conf/kafka-conf/kafka_client_jaas.confJika nilai sudah ada, tambahkan ini di akhir.
Langkah 5: Restart layanan Kafka
-
Pada tab Configure, pilih More > Restart.
-
Pada kotak dialog, isi Execution Reason lalu klik OK.
-
Pada dialog Confirm, klik OK.
Pertimbangan keamanan untuk lingkungan produksi
Contoh pada bagian berikutnya menggunakan SASL_PLAINTEXT, yang mengirimkan kredensial dalam teks biasa. Di lingkungan produksi:
-
Gunakan
SASL_SSLalih-alihSASL_PLAINTEXTuntuk mengenkripsi kredensial saat transit. -
Hindari menyimpan password dalam file konfigurasi teks biasa jika memungkinkan. Password bind LDAP dalam
sasl.jaas.configperlu dilindungi.
Contoh
Contoh berikut menggunakan Kafka open source versi 2.4.1. Untuk versi Kafka lainnya, lihat dokumentasi keamanan Apache Kafka.
Contoh ini menunjukkan otorisasi berbasis kelompok menggunakan kelompok pengguna LDAP dan ACL.
Langkah 1: Buat pengguna uji coba dan kelompok pengguna
1.1 Aktifkan overlay memberOf (jika belum diaktifkan)
Jika fitur memberOf overlay dinonaktifkan untuk layanan OpenLDAP, aktifkan terlebih dahulu sebelum membuat kelompok pengguna.
Langkah untuk mengaktifkan overlay memberOf berbeda-beda tergantung layanan LDAP. Langkah berikut berlaku untuk layanan EMR OpenLDAP.
Aktifkan fitur ini di semua node tempat layanan OpenLDAP dideploy.
Sesuaikan parameter berikut berdasarkan lingkungan Anda:
olcModulepath: Untuk sistem operasi 32-bit, atur nilai ini menjadi/usr/lib/openldap.
dn: cn=module{0},cn=config: Jikacn=module{0}.ldifsudah ada di/etc/openldap/slapd.d/cn=config, ubah0menjadi1. Jikacn=module{1}.ldifsudah ada, ubah1menjadi2, dan seterusnya.
dn: olcOverlay={0}memberof,olcDatabase={2}hdb,cn=config: AturolcDatabaseberdasarkan nilai di/etc/openldap/slapd.d/cn=config. Misalnya, jika filenya adalah{2}hdb.ldif, aturolcDatabasemenjadihdb.
-
Buat
memberof_config.ldifdengan konten 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 -
Buat
refint1.ldifdengan konten berikut:dn: cn=module{0},cn=config add: olcmoduleload olcmoduleload: refint -
Buat
refint2.ldifdengan 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 -
Muat ketiga file konfigurasi tersebut:
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
1.2 Buat pengguna uji coba
Buat kafka-users.ldif dengan konten berikut lalu jalankan ldapadd untuk menambahkan pengguna:
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
1.3 Buat kelompok pengguna uji coba
Buat kafka-groups.ldif dengan konten berikut lalu jalankan ldapadd untuk menambahkan kelompok:
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
Ringkasan keanggotaan kelompok:
-
kafka-group1: kafka-user1, kafka-user2
-
kafka-group2: kafka-user1
1.4 Verifikasi atribut memberOf
Jalankan perintah berikut di server OpenLDAP untuk memastikan atribut memberOf telah terisi:
ldapsearch -Q -Y EXTERNAL -H ldapi:/// -b ou=people,o=emr memberOf
Hasil yang diharapkan:
-
kafka-user1termasuk dalam kafka-group1 dan kafka-group2. -
kafka-user2termasuk dalam kafka-group2.
Langkah 2: Buat file konfigurasi klien
Setiap file konfigurasi klien menentukan kredensial untuk pengguna tertentu. Semua contoh menggunakan SASL_PLAINTEXT sebagai protokol keamanan.
Di lingkungan produksi, gunakanSASL_SSLalih-alihSASL_PLAINTEXTuntuk mencegah kredensial dikirim dalam teks biasa. Lihat dokumentasi keamanan Apache Kafka untuk detail selengkapnya.
Buat tiga file konfigurasi berikut. Ganti username dan password di setiap file sesuai klien yang bersangkutan.
client.properties (superuser):
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";
Langkah 3: Buat topik uji coba
kafka-topics.sh --bootstrap-server core-1-1:9092 --command-config client.properties --create --topic test --replication-factor 3 --partitions 2
Langkah 4: Berikan izin
Daftar kontrol akses (ACL) Kafka mengikuti format: "Principal P [Diizinkan|Ditolak] Operasi O dari Host H pada Resource R." Untuk dokumentasi lengkap tentang ACL, lihat Otorisasi dan ACL Apache Kafka.
Jika suatu resource tidak memiliki ACL, Kafka secara default membatasi akses ke resource tersebut. Hanya superuser yang dapat mengaksesnya.
Jalankan perintah berikut untuk mengatur izin:
# Izinkan kafka-group2 melakukan semua operasi pada kluster dan topik test.
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
# Tolak kafka-group1 semua operasi pada topik test.
kafka-acls.sh --authorizer-properties zookeeper.connect=$KAFKA_ZOOKEEPER --add --deny-principal User:kafka-group1 --deny-host "*" --operation All --topic test
# Tolak kafka-user1 akses baca pada topik test.
kafka-acls.sh --authorizer-properties zookeeper.connect=$KAFKA_ZOOKEEPER --add --deny-principal User:kafka-user1 --deny-host "*" --operation Read --topic test
# Izinkan kafka-user2 akses baca pada topik test.
kafka-acls.sh --authorizer-properties zookeeper.connect=$KAFKA_ZOOKEEPER --add --allow-principal User:kafka-user2 --allow-host "*" --operation Read --topic test
Untuk melihat ACL saat ini untuk topik test:
kafka-acls.sh --authorizer-properties zookeeper.connect=$KAFKA_ZOOKEEPER --list --topic test
Output yang diharapkan:
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: *
Langkah 5: Verifikasi izin
Pengujian berikut memastikan bahwa izin berbasis kelompok diterapkan dengan benar. Izin efektif pengguna merupakan gabungan dari ACL individu mereka dan ACL semua kelompok yang mereka ikuti.
kafka-user1 dapat menulis ke topik test (mewarisi Allow All dari kafka-group2):
kafka-console-producer.sh --broker-list core-1-1:9092 --producer.config ./kafka-user1.properties --topic test
Tulis beberapa pesan untuk verifikasi:
>a
>b
>c
>d
kafka-user1 tidak dapat membaca dari topik test (memiliki Deny Read eksplisit):
# Berikan izin kelompok konsumen terlebih dahulu.
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-consumer
Operasi baca gagal, yang mengonfirmasi bahwa Deny Read eksplisit tetap berlaku meskipun kafka-user1 termasuk dalam kafka-group2.
kafka-user2 tidak dapat menulis ke topik test (tidak diberikan izin menulis):
kafka-console-producer.sh --broker-list core-1-1:9092 --producer.config ./kafka-user2.properties --topic test
Operasi menulis gagal.
kafka-user2 dapat membaca dari topik test (memiliki Allow Read):
# Berikan izin kelompok konsumen terlebih dahulu.
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 berhasil dikonsumsi.