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 (
LITERALatauPREFIXED).
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
ALLOWdalam ACL Kafka yang dapat mengakses resource yang cocok (kecuali jika diblokir secara khusus oleh entriDENY).
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:
Buat akun layanan untuk digunakan sebagai proxy untuk grup.
Berikan peran Service Account Token Creator kepada Set utama atau Grup Google di akun layanan. Lihat Mengelola akses ke akun layanan
Tambahkan ACL Kafka untuk akun layanan proxy. Contoh prinsipal adalah:
User:group-proxy@test-project.iam.gserviceaccount.com.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:
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 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 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 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. 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 for Apache Kafka Anda berada, sepertius-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 StandardAuthorizerUser:.--operation=READ: operasi Kafka yang diberi otorisasi, yang dalam hal ini adalahREAD.--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. Gantitopic-prefixdengan awalan sebenarnya dari topik Anda. AwalantopicPrefixed/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, sepertius-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 StandardAuthorizerUser:.--operation=WRITE: operasi Kafka yang diberi otorisasi, yang dalam hal ini adalahWRITE.--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, sepertius-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 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 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