Dokumen ini menjelaskan cara menggunakan daftar kontrol akses (ACL) Apache Kafka untuk kontrol akses di Google Cloud Managed Service untuk Apache Kafka.
ACL Apache Kafka menyediakan kontrol akses terperinci dalam cluster Kafka.
Managed Service untuk Apache Kafka mengaktifkan StandardAuthorizer langsung, 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 di 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 Pembeda (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 formatnya:
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 bagi berbagai protokol Kafka, lihat Operasi dan Resource pada Protokol dalam dokumentasi Apache Kafka.
Host(H): mesin tempat permintaan berasal. Karena Managed Service untuk 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 (
LITERALatauPREFIXED).
Akses default
Cluster Managed Service untuk 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 untuk 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
ALLOWdalam ACL Kafka yang dapat mengakses resource yang cocok (kecuali jika diblokir secara khusus oleh entriDENY).
Managed Service untuk Apache Kafka memberikan akses administratif agen layanan ke cluster Anda. Akses ini memungkinkan agen layanan melakukan operasi yang diminta oleh Managed Service untuk Apache Kafka API, terlepas dari ACL lain yang dikonfigurasi di cluster.
Managed Service untuk Apache Kafka melakukannya dengan mengubah implementasi
StandardAuthorizer. Modifikasi ini memberikan izin kepada 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 untuk Apache Kafka ditentukan dengan awalan Kafka StandardAuthorizer "User:".
Untuk SASL/IAM: prinsipal adalah akun Google Cloud. 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 CloudUntuk mTLS: principal berasal dari Subject Distinguished Name (DN) sertifikat klien. Contoh,
User:CN=client1,OU=dev,O=MyOrg,L=City,ST=State,C=US. Anda dapat menggunakan aturan pemetaan entity utama mTLS untuk mengubah DN menjadi string entity utama yang lebih mudah digunakan untuk ACL.
Untuk membuat ACL yang berlaku untuk semua anggota Google Grup atau set akun utama, Anda dapat menggunakan akun utama akun layanan proxy dan peniruan akun layanan:
Buat akun layanan untuk digunakan sebagai proxy untuk grup.
Berikan peran Service Account Token Creator kepada Grup Google atau set akun utama di akun layanan. Lihat Mengelola akses ke akun layanan
Tambahkan ACL Kafka untuk akun layanan proxy. Contoh akun utama adalah:
User:group-proxy@test-project.iam.gserviceaccount.com.Gunakan peniruan 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 akan memberikan otorisasi 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:
Pada resource topik, izinkan operasi
WRITEdanCREATE.Jika menggunakan ID transaksional, di resource ID transaksional, izinkan operasi
WRITE.
Untuk memberikan akses konsumen utama pada topik, lakukan langkah-langkah berikut:
Pada resource topik, izinkan operasi
READ.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 untuk pengguna administrator di semua resource dalam
cluster terlebih dahulu. 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 wilayah tertentu. Dengan izin ini, akun layanan dapat 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 terletak 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 semua ID transaksi dalam cluster Kafka tertentu yang berada di region tertentu kepada akun layanan bernama clusterAdmin@test-project.iam.gserviceaccount.com. 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 StandardAuthorizerUser:.--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 untuk Apache Kafka hanya mendukung ACL dengan host'*'.CLUSTER_ID: nama cluster Managed Service untuk Apache Kafka Anda.
LOCATION: Google Cloud region tempat cluster Managed Service untuk Apache Kafka Anda berada, seperti
us-central1.
Mengonfigurasi ACL
Anda dapat mengonfigurasi ACL Apache Kafka dengan Managed Service untuk Apache Kafka ACL API, atau dengan alat Apache Kafka open source seperti Apache Kafka authorizer cli kafka-acls.sh, atau Admin Client.
Managed Service untuk 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 entri ACL individual untuk pola resource ACL.
Untuk mengetahui informasi selengkapnya, lihat Membuat ACL Kafka Terkelola dan Menambahkan entri ACL Kafka Terkelola.
Mengizinkan pembacaan dari topik
Untuk mengizinkan klien Apache Kafka open source yang berjalan sebagai akun layanan
test-kafka-client@test-project.iam.gserviceaccount.com untuk 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 tersebut:
topic/topic-name: menentukan topik Managed Service untuk Apache Kafka yang ingin Anda beri akses. Gantitopic-namedengan nama topik Anda yang sebenarnya. Awalantopic/menunjukkan bahwa entri ACL ini berlaku untuk pola resource topik tertentu (literal).LOCATION: Google Cloud region tempat cluster Managed Service untuk Apache Kafka Anda berada, sepertius-central1.CLUSTER_ID: nama cluster Managed Service untuk 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 StandardAuthorizerUser:.--operation=READ: operasi Kafka yang diberikan, yaituREADdalam kasus ini.--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 untuk 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='*'
Izinkan 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 untuk menulis ke semua topik yang namanya dimulai 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 tersebut:
topicPrefixed/topic-prefix: menentukan pola resource Managed Service untuk Apache Kafka yang ingin Anda beri akses. Gantitopic-prefixdengan awalan topik Anda yang sebenarnya. AwalantopicPrefixed/menunjukkan bahwa entri ACL ini berlaku untuk pola resource berawalan: semua topik yang cocok dengan awalan yang diberikan.PROJECT: ID project tempat cluster Managed Service untuk Apache Kafka Anda berada. Google CloudLOCATION: Google Cloud region tempat cluster Managed Service untuk Apache Kafka Anda berada, sepertius-central1.CLUSTER_ID: nama cluster Managed Service untuk 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 StandardAuthorizerUser:.--operation=WRITE: operasi Kafka yang diberikan, yaituWRITEdalam 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 untuk 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 pengubahan 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 untuk Apache Kafka dengan daftar resource AclEntry 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 untuk Apache Kafka.LOCATION: Google Cloud region tempat cluster Managed Service untuk Apache Kafka Anda berada, sepertius-central1.CLUSTER_ID: nama cluster Managed Service untuk Apache Kafka Anda.--principal='User:test-kafka-client@test-project.iam.gserviceaccount.com': menentukan akun utama yang ACL-nya berlaku. Akun utama adalah akun Google Cloud , dengan awalan KafkaStandardAuthorizerUser:.--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 untuk 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 akun utama, 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