Kontrol akses dengan ACL Kafka

Dokumen ini menjelaskan cara menggunakan daftar kontrol akses (ACL) Apache Kafka untuk kontrol akses di Google Cloud Managed Service for Apache Kafka.

ACL Apache Kafka menyediakan kontrol akses terperinci dalam cluster Kafka. Managed Service untuk Apache Kafka mengaktifkan StandardAuthorizer out-of-the-box, yang menyimpan ACL dalam metadata cluster Kafka berbasis KRaft.

  • ACL ini mengontrol pengguna terautentikasi mana yang dapat melakukan operasi tertentu pada resource Kafka tertentu, seperti membuat atau menggunakan pesan pada topik.

  • ACL ini berguna untuk mengontrol interaksi dengan cluster menggunakan klien Apache Kafka standar, yang hanya tunduk pada pemeriksaan IAM tingkat cluster untuk koneksi awal. Untuk mengetahui informasi selengkapnya, lihat Kontrol akses dengan IAM.

Cara kerja kontrol akses ACL Kafka

Klien berinteraksi dengan ACL standar Kafka dalam cluster. Authorizer mengevaluasi ACL Apache Kafka yang relevan untuk mengizinkan operasi tertentu yang diminta oleh principal, seperti memproduksi ke topik atau menggunakan dari grup. Principal yang digunakan untuk pemeriksaan ACL berasal dari salah satu metode autentikasi berikut:

  • SASL: akun utama IAM seperti email akun layanan.

  • mTLS: Nama Khusus (DN) dari sertifikat klien, yang berpotensi diubah oleh aturan pemetaan prinsipal.

Untuk keamanan yang komprehensif, Anda harus mengonfigurasi hal berikut:

  • Izin IAM untuk akses pengelolaan. Untuk mengetahui informasi selengkapnya, lihat Kontrol akses dengan IAM.

  • ACL Kafka untuk akses dan operasi data dalam cluster dari klien Apache Kafka open source, terlepas dari metode autentikasinya.

Penggunaan ACL Apache Kafka

Binding ACL Apache Kafka memiliki format berikut:


Principal P is [Allowed/Denied] Operation O From Host H on any resource matching Resource Pattern RP.

Berikut adalah daftar informasi penting tentang format:

  • Principal(P): Identitas pengguna yang diberi otorisasi. Nilai ini diawali dengan User:.

    • Untuk autentikasi SASL, ini adalah prinsipal IAM, seperti User:my-service-account@my-project.iam.gserviceaccount.com.

    • Untuk autentikasi mTLS, ini adalah Distinguished Name (DN) dari sertifikat klien, seperti User:CN=my-client,OU=my-org-unit. Format yang tepat bergantung pada Subjek sertifikat. Aturan pemetaan prinsipal dapat mengubah nilai ini.

  • Jenis izin(Diizinkan/Ditolak): apakah pengikatan ACL mengizinkan atau menolak akses. Binding penolakan lebih diprioritaskan.

  • Operasi(O): tindakan yang dilakukan seperti Baca, Tulis, atau Buat. Untuk mengetahui informasi tentang operasi mana yang berlaku untuk resource mana untuk berbagai protokol Kafka, lihat Operasi dan Resource pada Protokol dalam dokumentasi Apache Kafka.

  • Host(H): mesin tempat permintaan berasal. Karena Managed Service for Apache Kafka menerjemahkan alamat jaringan klien, penggunaan host selain '*' tidak didukung.

  • Pola Resource(RP): pola yang digunakan untuk mencocokkan resource tertentu. Pola resource terdiri dari jenis resource, nama resource, dan jenis pola (LITERAL atau PREFIXED).

Akses default

Cluster Managed Service for Apache Kafka beroperasi dengan properti Apache Kafka allow.everyone.if.no.acl.found yang ditetapkan ke true. Ada atau tidaknya ACL Kafka secara langsung menentukan tingkat akses ke resource:

  • Jika tidak ada ACL Kafka yang ditentukan untuk resource tertentu seperti topik, semua principal yang diautentikasi akan diberi akses ke resource tersebut. Konfigurasi ini memungkinkan cluster Managed Service for Apache Kafka dapat langsung dioperasikan, tanpa perlu mengonfigurasi ACL.

  • Segera setelah Anda menentukan ACL Kafka untuk resource tersebut, akses akan dibatasi. Hanya entity utama yang diberi izin secara eksplisit menggunakan entri ALLOW dalam ACL Kafka yang dapat mengakses resource yang cocok (kecuali jika diblokir secara khusus oleh entri DENY).

Managed Service for Apache Kafka memberikan akses administratif agen layanannya ke cluster Anda. Akses ini memungkinkan agen layanan melakukan operasi yang diminta oleh Managed Service for Apache Kafka API, terlepas dari ACL lain yang dikonfigurasi di cluster. Managed Service for Apache Kafka melakukannya dengan mengubah implementasi StandardAuthorizer. Modifikasi ini memberikan izin agen layanan yang serupa dengan pengguna super, kecuali untuk operasi baca dan tulis. Anda tidak dapat mengubah konfigurasi ini.

Principal Kafka

Principal Kafka untuk cluster Managed Service for Apache Kafka ditentukan dengan awalan Kafka StandardAuthorizer "User:".

  • Untuk SASL/IAM: prinsipal adalah Google Cloud akun. Misalnya, untuk memberikan akses ke akun layanan test-kafka-client@test-project.iam.gserviceaccount.com, gunakan akun utama Kafka "User:test-kafka-client@test-project.iam.gserviceaccount.com". Akun utama ACL Kafka harus menentukan pengguna, akun layanan, atau akun utama IAM perorangan, tetapi bukan grup atau set akun utama. ACL Kafka tidak mendukung penyelesaian keanggotaan grup untuk prinsipal Google Cloud .

  • Untuk mTLS: prinsipal berasal dari Nama yang Dibedakan (DN) Subjek sertifikat klien. Contoh, User:CN=client1,OU=dev,O=MyOrg,L=City,ST=State,C=US. Anda dapat menggunakan aturan pemetaan principal mTLS untuk mengubah DN menjadi string principal yang lebih mudah digunakan untuk ACL.

Untuk membuat ACL yang berlaku untuk semua anggota Grup Google atau set akun utama, Anda dapat menggunakan akun utama akun layanan proxy dan peniruan akun layanan:

  1. Buat akun layanan untuk digunakan sebagai proxy untuk grup.

  2. Berikan peran Service Account Token Creator kepada Set utama atau Grup Google di akun layanan. Lihat Mengelola akses ke akun layanan

  3. Tambahkan ACL Kafka untuk akun layanan proxy. Contoh prinsipal adalah: User:group-proxy@test-project.iam.gserviceaccount.com.

  4. Gunakan peniruan identitas akun layanan di klien Kafka untuk mengautentikasi ke Kafka sebagai akun layanan. Google Cloud IAM mengizinkan akun utama perorangan sebagai anggota grup yang diizinkan untuk meniru identitas akun layanan proxy. Kafka juga mengizinkan akun layanan proxy terhadap ACL yang ada di cluster.

Operasi Kafka untuk produsen dan konsumen

Operasi adalah tindakan yang dilakukan pada resource. Untuk setiap resource, operasi dipetakan ke satu atau beberapa permintaan protokol Kafka untuk resource tersebut. Misalnya, operasi READ untuk jenis resource topic dipetakan ke protokol Apache Kafka Fetch, OffsetCommit, dan TxnOffsetCommit.

Untuk memberikan akses produser utama pada topik, lakukan langkah-langkah berikut:

  1. Pada resource topik, izinkan operasi WRITE dan CREATE.

  2. Jika menggunakan ID transaksional, di resource ID transaksional, izinkan operasi WRITE.

Untuk memberikan akses konsumen utama pada topik, lakukan langkah-langkah berikut:

  1. Pada resource topik, izinkan operasi READ.

  2. Pada resource grup konsumen, izinkan operasi READ.

Untuk mengetahui informasi selengkapnya tentang operasi yang valid pada resource yang didukung Kafka API, lihat Operasi dan Resource pada Protokol dalam dokumentasi Apache Kafka.

Mengonfigurasi ACL untuk perilaku penolakan default

Cluster Kafka terkelola dikonfigurasi dengan allow.everyone.if.no.acl.found = true. Jadi, secara default, jika tidak ada ACL yang ditetapkan pada resource, semua akun utama dapat mengakses resource tersebut.

Untuk mengonfigurasi perilaku default-deny yang serupa dengan yang ada di IAM, Anda dapat mengonfigurasi akses terlebih dahulu untuk pengguna administrator di semua resource dalam cluster. Akibatnya, setiap resource mendapatkan ACL yang ditentukan di dalamnya, dan perilaku allow.everyone.if.no.acl.found dihentikan. Secara default, setiap entity utama yang tidak diizinkan secara eksplisit oleh ACL ALLOW akan ditolak aksesnya.

Misalnya, untuk menyetel ACL pada semua resource di cluster untuk akun layanan clusterAdmin@test-project.iam.gserviceaccount.com, buat entri ACL berikut.

Perintah gcloud CLI berikut memberikan akses administratif penuh (--operation=ALL) ke akun layanan bernama clusterAdmin@test-project.iam.gserviceaccount.com untuk cluster Kafka tertentu yang berada di region tertentu. Izin ini memungkinkan akun layanan melakukan operasi apa pun pada cluster dari host mana pun.

gcloud managed-kafka acls add-acl-entry cluster \
    --principal=`User:clusterAdmin@test-project.iam.gserviceaccount.com` \
    --operation=ALL \
    --permission-type=ALLOW \
    --host=* \
    --cluster=CLUSTER_ID \
    --location=LOCATION

Perintah gcloud CLI berikut memberikan akses administratif penuh (--operation=ALL) ke semua topik dalam cluster Kafka tertentu yang berada di region tertentu kepada akun layanan bernama clusterAdmin@test-project.iam.gserviceaccount.com. Izin ini memungkinkan akun layanan melakukan operasi apa pun pada semua topik dari host mana pun.

gcloud managed-kafka acls add-acl-entry allTopics \
    --principal=`User:clusterAdmin@test-project.iam.gserviceaccount.com` \
    --operation=ALL \
    --permission-type=ALLOW \
    --host=* \
    --cluster=CLUSTER_ID \
    --location=LOCATION

Perintah gcloud CLI berikut memberikan akses administratif penuh (--operation=ALL) ke semua grup konsumen dalam cluster Kafka tertentu yang berada di region tertentu kepada akun layanan bernama clusterAdmin@test-project.iam.gserviceaccount.com. Izin ini memungkinkan akun layanan melakukan operasi apa pun pada semua grup konsumen dari host mana pun.

gcloud managed-kafka acls add-acl-entry allConsumerGroups \
    --principal=`User:clusterAdmin@test-project.iam.gserviceaccount.com` \
    --operation=ALL \
    --permission-type=ALLOW \
    --host=* \
    --cluster=CLUSTER_ID \
    --location=LOCATION

Perintah gcloud CLI berikut memberikan akses administratif penuh (--operation=ALL) ke akun layanan bernama clusterAdmin@test-project.iam.gserviceaccount.com untuk semua ID transaksi dalam cluster Kafka tertentu yang berada di region tertentu. Dengan izin ini, akun layanan dapat melakukan operasi apa pun pada semua ID transaksi dari host mana pun.

gcloud managed-kafka acls add-acl-entry allTransactionalIds \
    --principal=`User:clusterAdmin@test-project.iam.gserviceaccount.com` \
    --operation=ALL \
    --permission-type=ALLOW \
    --host=* \
    --cluster=CLUSTER_ID \
    --location=LOCATION

Berikut adalah daftar informasi penting tentang perintah:

  • --principal='User:test-kafka-client@test-project.iam.gserviceaccount.com': akun utama yang ACL-nya diterapkan. Akun utama adalah Google Cloud akun, dengan awalan Kafka StandardAuthorizer User:.

  • --operation=all: operasi Kafka yang diberikan, yaitu akses penuh dalam kasus ini.

  • --permission-type=ALLOW: entri ACL ini memberikan akses.

  • --host='*': host tempat akun utama dapat mengakses resource. '*' memberikan akses dari host mana pun. Managed Service for Apache Kafka hanya mendukung ACL dengan host '*'.

  • CLUSTER_ID: nama cluster Managed Service for Apache Kafka Anda.

  • LOCATION: Google Cloud region tempat cluster Managed Service for Apache Kafka Anda berada, seperti us-central1.

Mengonfigurasi ACL

Anda dapat mengonfigurasi ACL Apache Kafka dengan Managed Service for Apache Kafka ACL API, atau dengan alat Apache Kafka open source seperti Apache Kafka authorizer cli kafka-acls.sh, atau Admin Client.

Managed Service for Apache Kafka mengatur ACL menurut pola resource Kafka. Pola resource ditentukan oleh hal berikut:

  • Jenis resource: cluster, topik, grup konsumen, atau ID transaksional

  • Jenis pola: literal, atau berprefiks (semua resource yang namanya diawali dengan string yang diberikan)

  • Nama resource: nama atau awalan resource yang menerapkan entri ACL.

Resource ACL Managed Service untuk Apache Kafka merepresentasikan semua kontrol akses yang dikonfigurasi untuk satu pola resource Kafka, sebagai daftar entri ACL yang berulang. Nama resource ACL secara unik mengidentifikasi pola resource binding ACL. Untuk mengetahui informasi selengkapnya, lihat ID ACL.

Anda dapat mengelola ACL Managed Service untuk Apache Kafka di tingkat resource ACL (semua entri ACL untuk pola resource), atau secara inkremental dengan menambahkan dan menghapus setiap entri ACL untuk pola resource ACL.

Untuk mengetahui informasi selengkapnya, lihat Membuat ACL Kafka Terkelola dan Menambahkan entri ACL Kafka Terkelola.

Mengizinkan membaca dari topik

Untuk mengizinkan klien Apache Kafka open source yang berjalan sebagai akun layanan test-kafka-client@test-project.iam.gserviceaccount.com membaca dari topik topic-name, buat entri ACL Managed Service untuk Apache Kafka menggunakan perintah managed-kafka acls add-acl-entry:

gcloud managed-kafka acls add-acl-entry topic/topic-name \
    --cluster=CLUSTER_ID \
    --location=LOCATION
    --principal='User:test-kafka-client@test-project.iam.gserviceaccount.com' \
    --operation=READ \
    --permission-type=ALLOW \
    --host='*'

Berikut adalah daftar informasi penting tentang perintah:

  • topic/topic-name: menentukan topik Managed Service for Apache Kafka yang ingin Anda beri akses. Ganti topic-name dengan nama topik Anda yang sebenarnya. Awalan topic/ menunjukkan bahwa entri ACL ini berlaku untuk pola resource topik tertentu (literal).

  • LOCATION: Google Cloud region tempat cluster Managed Service for Apache Kafka Anda berada, seperti us-central1.

  • CLUSTER_ID: nama cluster Managed Service for Apache Kafka Anda.

  • --principal='User:test-kafka-client@test-project.iam.gserviceaccount.com': akun utama yang ACL-nya diterapkan. Akun utama adalah Google Cloud akun, dengan awalan Kafka StandardAuthorizer User:.

  • --operation=READ: operasi Kafka yang diberi otorisasi, yang dalam hal ini adalah READ.

  • --permission-type=ALLOW: menunjukkan bahwa entri ACL ini memberikan akses.

  • --host='*': menentukan host tempat akun utama dapat mengakses resource. '*' memberikan akses dari host mana pun. Managed Service for Apache Kafka hanya mendukung ACL dengan host '*'.

Untuk menghapus akses baca, Anda dapat menggunakan perintah remove-acl-entry dengan parameter yang sama.

gcloud managed-kafka acls remove-acl-entry topic/topic-name \
    --cluster=CLUSTER_ID \
    --location=LOCATION
    --principal='User:test-kafka-client@test-project.iam.gserviceaccount.com' \
    --operation=READ \
    --permission-type=ALLOW \
    --host='*'

Mengizinkan penulisan ke semua topik dengan awalan umum

Untuk mengizinkan klien Apache Kafka open source yang berjalan sebagai akun layanan test-kafka-client@test-project.iam.gserviceaccount.com menulis ke semua topik yang namanya diawali dengan awalan topic-prefix, tambahkan entri ACL Managed Kafka sebagai berikut:

gcloud managed-kafka acls add-acl-entry topicPrefixed/topic-prefix \
    --cluster=CLUSTER_ID \
    --location=LOCATION
    --principal='User:test-kafka-client@test-project.iam.gserviceaccount.com' \
    --operation=WRITE \
    --permission-type=ALLOW \
    --host='*'

Berikut adalah daftar informasi penting tentang perintah:

  • topicPrefixed/topic-prefix: menentukan pola resource Managed Service for Apache Kafka yang ingin Anda beri akses. Ganti topic-prefix dengan awalan sebenarnya dari topik Anda. Awalan topicPrefixed/ menunjukkan bahwa entri ACL ini berlaku untuk pola resource berawalan: semua topik yang cocok dengan awalan yang diberikan.

  • PROJECT: ID project Google Cloud tempat cluster Managed Service for Apache Kafka Anda berada.

  • LOCATION: Google Cloud region tempat cluster Managed Service for Apache Kafka Anda berada, seperti us-central1.

  • CLUSTER_ID: nama cluster Managed Service for Apache Kafka Anda.

  • --principal='User:test-kafka-client@test-project.iam.gserviceaccount.com': akun utama yang ACL-nya diterapkan. Akun utama adalah Google Cloud akun, dengan awalan Kafka StandardAuthorizer User:.

  • --operation=WRITE: operasi Kafka yang diberi otorisasi, yang dalam hal ini adalah WRITE.

  • --permission-type=ALLOW: entri ACL ini memberikan akses.

  • --host='*': host tempat akun utama dapat mengakses resource. '*' memberikan akses dari host mana pun. Managed Service for Apache Kafka hanya mendukung ACL dengan host '*'.

Untuk menghapus akses tulis bagi akun layanan ini, hapus entri ACL:

gcloud managed-kafka acls remove-acl-entry topicPrefixed/topic-prefix \
    --cluster=CLUSTER_ID \
    --location=LOCATION
    --principal='User:test-kafka-client@test-project.iam.gserviceaccount.com' \
    --operation=WRITE \
    --permission-type=ALLOW \
    --host='*'

Menolak mengubah semua topik

Untuk mencegah klien Apache Kafka open source yang berjalan sebagai akun layanan test-kafka-client@test-project.iam.gserviceaccount.com memodifikasi semua topik dalam cluster, Anda dapat membuat resource ACL Managed Service for Apache Kafka dengan daftar AclEntry resource untuk menolak operasi ALTER, ALTER_CONFIGS, dan DELETE pada semua topik. Pendekatan ini menentukan status yang diperlukan dalam satu konfigurasi.

Atau, Anda dapat mencapai hasil yang sama dengan menambahkan tiga entri ACL terpisah secara imperatif menggunakan perintah gcloud managed-kafka acls add-acl-entry. Metode ini melibatkan menjalankan perintah untuk menolak akses ke setiap operasi ALTER, ALTER_CONFIGS, dan DELETE, sebagai berikut:

gcloud managed-kafka acls add-acl-entry allTopics \
    --cluster=CLUSTER_ID \
    --location=LOCATION
    --principal='User:test-kafka-client@test-project.iam.gserviceaccount.com' \
    --operation=ALTER \
    --permission-type=DENY \
    --host='*'
gcloud managed-kafka acls add-acl-entry allTopics \
    --cluster=CLUSTER_ID \
    --location=LOCATION
    --principal='User:test-kafka-client@test-project.iam.gserviceaccount.com' \
    --operation=ALTER_CONFIGS \
    --permission-type=DENY \
    --host='*'
gcloud managed-kafka acls add-acl-entry allTopics \
    --cluster=CLUSTER_ID \
    --location=LOCATION
    --principal='User:test-kafka-client@test-project.iam.gserviceaccount.com' \
    --operation=DELETE \
    --permission-type=DENY \
    --host='*'

Informasi berikut berlaku untuk setiap perintah add-acl-entry:

  • allTopics: menentukan bahwa ACL ini berlaku untuk semua topik dalam cluster Managed Service for Apache Kafka.

  • LOCATION: region Google Cloud tempat cluster Managed Service for Apache Kafka Anda berada, seperti us-central1.

  • CLUSTER_ID: nama cluster Managed Service for Apache Kafka Anda.

  • --principal='User:test-kafka-client@test-project.iam.gserviceaccount.com': menentukan akun utama yang ACL-nya diterapkan. Akun utama adalah Google Cloud akun, dengan awalan Kafka StandardAuthorizer User:.

  • --operation: menentukan operasi Kafka yang ditolak:

    • ALTER: mencakup tindakan seperti mengubah jumlah partisi atau faktor replikasi.

    • ALTER_CONFIGS: mencakup pengubahan konfigurasi tingkat topik.

    • DELETE: mencakup penghapusan topik.

  • --permission-type=DENY: menunjukkan bahwa entri ACL ini memblokir akses untuk operasi yang ditentukan.

  • --host='*': menentukan bahwa penolakan ini berlaku terlepas dari host tempat permintaan berasal. Managed Service for Apache Kafka hanya mendukung ACL dengan host '*'.

Untuk menghapus batasan ini, gunakan perintah remove-acl-entry untuk setiap entri yang ditambahkan, menggunakan parameter yang sama. Misalnya, untuk mengizinkan kembali penghapusan topik:

gcloud managed-kafka acls remove-acl-entry allTopics \
    --cluster=CLUSTER_ID \
    --location=LOCATION
    --principal='User:test-kafka-client@test-project.iam.gserviceaccount.com' \
    --operation=DELETE \
    --permission-type=DENY \
    --host='*'

Memecahkan masalah ACL

Apache Kafka Standard Authorizer menulis log audit secara default pada penolakan otorisasi. Jika menerima error Otorisasi Kafka, Anda dapat mengonfirmasi entitas, resource, dan operasi yang ditolak dengan menelusuri log cluster untuk StandardAuthorizerData logAuditMessage.

Misalnya, berikut adalah contoh log cluster.

org.apache.kafka.metadata.authorizer.StandardAuthorizerData logAuditMessage\n
INFO: Principal = User:556291496362-compute@developer.iam.gserviceaccount.com is
Denied operation = DESCRIBE from host = 172.16.0.20 on resource = Topic:LITERAL:t1
for request = Metadata with resourceRefCount = 1 based on rule DefaultDeny

Langkah berikutnya

Apache Kafka® adalah merek dagang terdaftar milik The Apache Software Foundation atau afiliasinya di Amerika Serikat dan/atau negara lain.