Kodeloka
  1. Kodeloka
  2. Kelas Apache Kafka
  3. Materi

5 · Operasi · Modul 12 dari 13

Keamanan: TLS, SASL, ACL & Kuota

Klaster Kafka default tidak punya autentikasi maupun enkripsi. Siapa pun yang bisa menjangkau port 9092 dapat membaca dan menghapus segalanya.

Tiga Lapis yang Terpisah

LapisPertanyaan yang dijawabMekanisme
EnkripsiBisakah orang lain menguping?TLS
AutentikasiSiapa Anda?SASL atau sertifikat klien mTLS
OtorisasiApa yang boleh Anda lakukan?ACL
🚫 PLAINTEXT tanpa ACL adalah pintu terbuka

Konfigurasi bawaan menerima koneksi anonim tanpa enkripsi. Siapa pun yang bisa menjangkau broker dapat membaca seluruh topik, menulis pesan palsu, dan menghapus topik. Konfigurasi pengembangan yang tidak sengaja terbawa ke jaringan yang lebih luas adalah salah satu penyebab kebocoran data yang paling sering terjadi.

Pilihan SASL

MekanismeCocok untukCatatan
SASL/PLAINSederhana, di atas TLSKata sandi terkirim polos — wajib dibungkus TLS
SASL/SCRAM-SHA-512Pilihan default yang baikKredensial disimpan di dalam Kafka, tidak pernah dikirim polos
SASL/GSSAPILingkungan KerberosKompleks; hanya bila memang sudah ada Kerberos
SASL/OAUTHBEARERIntegrasi OIDC modernToken berumur pendek, cocok untuk lingkungan cloud
mTLSKomunikasi antar layananIdentitas dari sertifikat; perlu pengelolaan rotasi
listeners=SASL_SSL://:9093
security.inter.broker.protocol=SASL_SSL
sasl.enabled.mechanisms=SCRAM-SHA-512
sasl.mechanism.inter.broker.protocol=SCRAM-SHA-512

ssl.keystore.location=/etc/kafka/secrets/broker.keystore.jks
ssl.truststore.location=/etc/kafka/secrets/broker.truststore.jks

authorizer.class.name=org.apache.kafka.metadata.authorizer.StandardAuthorizer
allow.everyone.if.no.acl.found=false
🚫 allow.everyone.if.no.acl.found=true membatalkan seluruh ACL

Setelan ini sering dinyalakan "sementara" saat migrasi agar layanan lama tidak rusak, lalu tidak pernah dimatikan. Efeknya: setiap sumber daya yang belum punya ACL terbuka untuk semua pihak yang terautentikasi. Selesaikan migrasi dengan menambahkan ACL, lalu kembalikan nilainya ke false.

ACL: Beri Hak Sekecil Mungkin

# Produser hanya boleh menulis ke satu topik
kafka-acls.sh --bootstrap-server localhost:9093 --command-config admin.properties \
  --add --allow-principal User:layanan-pesanan \
  --operation Write --operation Describe --topic pesanan

# Konsumen: baca topik + pakai satu group id
kafka-acls.sh --bootstrap-server localhost:9093 --command-config admin.properties \
  --add --allow-principal User:layanan-notifikasi \
  --operation Read --operation Describe --topic pesanan \
  --group layanan-notifikasi
⚠️ Konsumen membutuhkan izin pada group, bukan hanya topik

Kesalahan paling umum saat menerapkan ACL: memberi izin Read pada topik tetapi lupa izin pada --group. Konsumen gagal bergabung ke grup dengan galat otorisasi yang menunjuk grup, bukan topik — dan pesan itu mudah disalahtafsirkan.

⚠️ Jangan biarkan pembuatan topik otomatis di produksi

auto.create.topics.enable=true membuat salah ketik nama topik menghasilkan topik baru dengan konfigurasi default — biasanya satu partisi tanpa replikasi. Setel false di produksi dan kelola topik lewat kode infrastruktur.

Kuota: Mencegah Satu Klien Menjatuhkan Klaster

# Batasi produser tertentu ke 10 MB/detik
kafka-configs.sh --bootstrap-server localhost:9093 --alter \
  --add-config 'producer_byte_rate=10485760,consumer_byte_rate=20971520' \
  --entity-type clients --entity-name layanan-impor
💡 Kuota adalah rem, bukan penolakan

Klien yang melampaui kuota tidak mendapat galat; broker menahan responsnya sehingga klien melambat dengan sendirinya. Ini membuat pekerjaan impor massal tidak dapat menenggelamkan lalu lintas transaksional, tanpa perlu perubahan kode di sisi klien.