Encryption in Transit: Mengamankan Lalu Lintas Data Kafka dengan SSL/TLS #

Ketika kita mengalirkan data melalui Apache Kafka, pesan-pesan tersebut secara default mengalir dalam format teks polos (plaintext) melintasi infrastruktur jaringan. Tanpa adanya enkripsi dalam perjalanan (encryption in transit), siapa pun yang memiliki akses fisik atau logis ke kabel jaringan, switch, router, atau bahkan hypervisor di lingkungan cloud dapat menyadap lalu lintas data tersebut (packet sniffing). Bagi data sensitif seperti data transaksi keuangan, informasi pribadi (PII), atau rekam medis, kelalaian ini dapat berakibat fatal pada kepatuhan regulasi (seperti GDPR, PCI-DSS, atau UU PDP) dan reputasi bisnis.

Enkripsi dalam perjalanan memastikan bahwa data yang dikirimkan oleh produser ke broker, direplikasi antar-broker, serta dikonsumsi oleh konsumen telah disandikan secara kriptografis menggunakan protokol Transport Layer Security (TLS/SSL). Dengan begitu, data tetap aman dari potensi intersepsi pihak ketiga selama berada di kabel jaringan.

Dalam panduan praktis dan mendalam ini, kita akan membahas arsitektur enkripsi TLS di Kafka, langkah demi langkah membangun Public Key Infrastructure (PKI) mandiri untuk sertifikat broker, mengonfigurasi broker dan klien Java, mengoptimalkan Cipher Suites untuk performa tinggi, serta melakukan rotasi sertifikat tanpa menimbulkan downtime pada kluster produksi.

Arsitektur & Mekanisme Handshake SSL/TLS di Kafka #

Mekanisme pertukaran kunci dan enkripsi lalu lintas data di Apache Kafka bertumpu pada protokol TLS (sering kali masih disebut SSL oleh Java/Kafka API). Jabat tangan TLS (TLS Handshake) terjadi di lapisan transport sebelum protokol Kafka (Request/Response API) mulai bertukar data.

Mari kita pelajari alur jabat tangan TLS timbal balik (Mutual TLS / mTLS) antara klien dan broker Kafka melalui diagram berikut:

sequenceDiagram
    autonumber
    actor Client as Kafka Client (Java SDK)
    participant Broker as Kafka Broker

    Note over Client, Broker: Inisiasi Jabat Tangan TLS (mTLS)
    Client->>Broker: ClientHello (Membawa Cipher Suites & Versi TLS yang didukung)
    Broker->>Client: ServerHello (Memilih Cipher Suite & Versi TLS)
    Broker->>Client: Broker Certificate (Sertifikat SSL Broker)
    Broker->>Client: Certificate Request (Meminta sertifikat klien jika ssl.client.auth=required)
    
    Note over Client: Verifikasi Sertifikat Broker
    Client->>Client: Memvalidasi Broker Certificate dengan Truststore Lokal
    
    Client->>Broker: Client Certificate (Sertifikat SSL Klien)
    Client->>Broker: ClientKeyExchange & CertificateVerify (Kunci simetris & tanda tangan kriptografis)
    
    Note over Broker: Verifikasi Sertifikat Klien
    Broker->>Broker: Memvalidasi Client Certificate dengan Truststore Broker
    
    Broker->>Client: Finished (Saluran Terenkripsi Aktif)
    Client->>Broker: Finished (Saluran Terenkripsi Aktif)
    
    Note over Client, Broker: Saluran Aman Terbentuk (Pertukaran Pesan Kafka Terenkripsi Simetris)

Proses jabat tangan ini menjamin tiga pilar keamanan informasi:

  1. Kerahasiaan (Confidentiality): Semua payload pesan Kafka disandikan menggunakan enkripsi simetris yang kuat (seperti AES atau ChaCha20).
  2. Integritas (Integrity): Setiap paket data yang ditransmisikan dilengkapi dengan kode otentikasi pesan (Message Authentication Code - MAC) untuk mendeteksi modifikasi data di tengah jalan.
  3. Otentikasi (Authentication): Kedua belah pihak saling membuktikan identitas mereka menggunakan sertifikat digital yang ditandatangani oleh otoritas sertifikat (Certificate Authority - CA) tepercaya.

Panduan Langkah Demi Langkah: Membangun PKI Mandiri untuk Keystore & Truststore #

Untuk lingkungan produksi enterprise, kita sebaiknya menggunakan sertifikat yang diterbitkan oleh CA internal perusahaan (seperti Active Directory Certificate Services atau HashiCorp Vault PKI). Namun, untuk kebutuhan pemahaman mendalam, kita akan membangun CA mandiri menggunakan utilitas openssl dan Java keytool langsung pada shell.

1. Membuat Certificate Authority (CA) Internal #

CA ini bertindak sebagai entitas tepercaya tunggal yang akan menandatangani seluruh sertifikat broker dan klien di kluster kita.

Pertama, buat kunci privat CA (CA Private Key) dan sertifikat CA (Root Certificate):

# Membuat kunci privat untuk CA (dilindungi enkripsi AES-256)
openssl genrsa -aes256 -out ca-key.pem 4096

# Membuat sertifikat CA dengan masa berlaku 10 tahun (3650 hari)
openssl req -new -x509 -key ca-key.pem -days 3650 -out ca-cert.pem \
  -subj "/CN=MyCompany Kafka Root CA/OU=IT Security/O=MyCompany/L=Jakarta/C=ID"

Berkas ca-cert.pem adalah sertifikat publik yang harus diimpor ke dalam Truststore milik setiap broker dan klien agar mereka dapat memvalidasi satu sama lain.

2. Membuat Keystore Broker Kafka #

Setiap broker Kafka membutuhkan sertifikat uniknya sendiri yang disimpan di dalam berkas Keystore (biasanya berformat JKS atau PKCS12).

Jalankan perintah ini di setiap server broker (misalnya untuk broker-1):

# 1. Membuat Keystore baru dan sepasang kunci privat/publik untuk broker-1
keytool -keystore kafka.broker1.keystore.jks \
  -alias broker1 \
  -validity 365 \
  -genkey -keyalg RSA -keysize 2048 \
  -dname "CN=broker1.kafka.mycompany.local,OU=Infrastructure,O=MyCompany,L=Jakarta,C=ID" \
  -storepass SangatRahasia123 \
  -keypass SangatRahasia123

Catatan: Nilai CN (Common Name) wajib disetel sama dengan domain FQDN (Fully Qualified Domain Name) dari server broker tersebut agar pemeriksaan identitas endpoint berjalan sukses.

3. Membuat Certificate Signing Request (CSR) untuk Broker #

Untuk mendapatkan tanda tangan dari CA internal, kita harus mengekspor kunci publik broker dalam bentuk berkas CSR:

# Mengekspor CSR dari Keystore broker-1
keytool -keystore kafka.broker1.keystore.jks \
  -alias broker1 \
  -certreq \
  -file broker1-cert-file-request.csr \
  -storepass SangatRahasia123

4. Menandatangani Sertifikat Broker Menggunakan CA #

Bawa berkas CSR broker-1 ke server CA, lalu tandatangani sertifikat tersebut:

# Menandatangani CSR broker-1 dengan kunci privat CA
openssl x509 -req -CA ca-cert.pem -CAkey ca-key.pem \
  -in broker1-cert-file-request.csr \
  -out broker1-cert-signed.pem \
  -days 365 -CAcreateserial \
  -passin pass:CAPasswordKita

5. Mengimpor Sertifikat ke Keystore Broker #

Agar rantai sertifikat (Certificate Chain) terbentuk dengan benar di dalam Keystore, kita harus mengimpor sertifikat Root CA terlebih dahulu, baru kemudian sertifikat broker yang telah ditandatangani.

# A. Impor sertifikat Root CA ke Keystore broker-1 (sebagai jangkar kepercayaan)
keytool -keystore kafka.broker1.keystore.jks \
  -alias CARoot \
  -import -file ca-cert.pem \
  -storepass SangatRahasia123 -noprompt

# B. Impor sertifikat broker-1 yang telah ditandatangani oleh CA
keytool -keystore kafka.broker1.keystore.jks \
  -alias broker1 \
  -import -file broker1-cert-signed.pem \
  -storepass SangatRahasia123

6. Membuat Truststore untuk Broker dan Klien #

Truststore adalah wadah yang hanya berisi sertifikat publik CA tepercaya. Baik broker maupun klien hanya memerlukan salinan sertifikat Root CA di dalamnya.

# Membuat Truststore baru dan mengimpor sertifikat Root CA
keytool -keystore kafka.truststore.jks \
  -alias CARoot \
  -import -file ca-cert.pem \
  -storepass TruststoreSecret123 -noprompt

Konfigurasi SSL di Sisi Broker Kafka #

Setelah Keystore (kafka.broker1.keystore.jks) dan Truststore (kafka.truststore.jks) siap di server broker, kita perlu mengonfigurasi berkas server.properties broker agar mendengarkan port SSL terenkripsi.

Berikut adalah konfigurasi produksi yang aman untuk broker Kafka:

# ==============================================================================
# KONFIGURASI SSL/TLS BROKER (server.properties)
# ==============================================================================

# 1. Definisikan Listener Jaringan
# Kita pisahkan listener klien (CLIENT) dengan replikasi internal (REPLICATION)
listeners=CLIENT://0.0.0.0:9093,REPLICATION://0.0.0.0:9092
advertised.listeners=CLIENT://broker1.kafka.mycompany.local:9093,REPLICATION://broker1.kafka.mycompany.local:9092

# 2. Asosiasikan Protokol Keamanan dengan Listener
listener.security.protocol.map=CLIENT:SASL_SSL,REPLICATION:SSL
security.inter.broker.protocol=REPLICATION

# 3. Konfigurasi Lokasi Keystore dan Truststore
# Sebaiknya gunakan ConfigProvider, namun di bawah ini adalah representasi parameternya
ssl.keystore.location=/var/private/ssl/kafka.broker1.keystore.jks
ssl.keystore.password=SangatRahasia123
ssl.key.password=SangatRahasia123

ssl.truststore.location=/var/private/ssl/kafka.truststore.jks
ssl.truststore.password=TruststoreSecret123

# 4. Kebijakan Otentikasi Klien (Mutual TLS)
# - required: Klien wajib menyajikan sertifikat SSL yang valid (mTLS).
# - requested: Broker meminta sertifikat, tetapi koneksi tetap berjalan jika klien tidak memilikinya.
# - none: Otentikasi satu arah (hanya klien yang memverifikasi broker).
listener.name.replication.ssl.client.auth=required
listener.name.client.ssl.client.auth=required

# 5. Keamanan Tambahan
# Mengharuskan FQDN broker diverifikasi dari Common Name sertifikatnya
ssl.endpoint.identification.algorithm=HTTPS

Konfigurasi SSL di Sisi Klien (Producer & Consumer) #

Aplikasi klien Java (seperti produser Spring Boot, Kafka Streams, atau skrip CLI) harus dikonfigurasi agar dapat melakukan jabat tangan SSL secara sukses dengan kluster.

Berikut adalah properti konfigurasi klien untuk otentikasi timbal balik (mTLS):

# ==============================================================================
# KLIEN KAFKA - KONFIGURASI SSL (client.properties)
# ==============================================================================

# Definisikan protokol keamanan
security.protocol=SSL

# Konfigurasi lokasi truststore (klien memvalidasi broker)
ssl.truststore.location=/var/private/ssl/kafka.truststore.jks
ssl.truststore.password=TruststoreSecret123

# Konfigurasi lokasi keystore (klien mengirimkan sertifikat ke broker untuk mTLS)
ssl.keystore.location=/var/private/ssl/kafka.client.keystore.jks
ssl.keystore.password=ClientStoreSecret123
ssl.key.password=ClientKeySecret123

# Aktifkan validasi hostname broker (sangat disarankan untuk mencegah DNS spoofing)
ssl.endpoint.identification.algorithm=HTTPS

Pilihan Cipher Suites dan Optimasi Performa Enkripsi #

Banyak organisasi enggan mengaktifkan enkripsi penuh karena khawatir akan penalti performa (CPU overhead dan peningkatan latensi). Namun, dengan pemilihan protokol dan Cipher Suites yang tepat, ditambah optimalisasi perangkat keras modern, biaya performa enkripsi ini dapat ditekan hingga di bawah 3-5%.

1. Gunakan TLSv1.3 Alih-Alih TLSv1.2 #

Protokol TLSv1.3 memangkas waktu jabat tangan dari 2 round-trips (pada TLSv1.2) menjadi hanya 1 round-trip (1-RTT). Selain itu, TLSv1.3 menghapus algoritma kriptografi lawas yang lambat dan tidak aman, serta hanya menyisakan cipher suites berbasis AEAD (Authenticated Encryption with Associated Data) yang sangat cepat dan aman secara fundamental.

Di dalam server.properties, batasi versi TLS yang diizinkan:

ssl.enabled.protocols=TLSv1.3

2. Pilih Cipher Suites Berbasis GCM (Galois/Counter Mode) #

Algoritma berbasis GCM jauh lebih cepat karena dirancang untuk dijalankan secara paralel di tingkat prosesor. Jika infrastruktur kita berjalan di atas CPU modern x86_64, prosesor tersebut hampir pasti memiliki instruksi perangkat keras AES-NI (Advanced Encryption Standard New Instructions). Dengan AES-NI aktif, enkripsi AES dilakukan langsung di tingkat sirkuit silikon CPU, bukan di software JVM, sehingga kecepatannya berlipat ganda.

Berikut adalah rekomendasi Cipher Suites berperforma tinggi untuk kluster kita:

# Rekomendasi Cipher Suites TLSv1.3
ssl.cipher.suites=TLS_AES_256_GCM_SHA384,TLS_AES_128_GCM_SHA256,TLS_CHACHA20_POLY1305_SHA256

Catatan: Gunakan TLS_CHACHA20_POLY1305_SHA256 jika klien kita adalah perangkat mobile atau IoT berdaya rendah yang CPU-nya tidak memiliki akselerasi hardware AES-NI.

3. Tuning Parameter JVM & Socket Buffer #

Untuk mengimbangi tambahan beban ukuran paket (payload overhead) akibat enkripsi TLS, sesuaikan parameter buffer socket TCP pada broker:

# Menambahkan ukuran buffer socket untuk menangani throughput terenkripsi yang besar
send.buffer.bytes=1048576
receive.buffer.bytes=1048576

Rotasi Sertifikat SSL Tanpa Downtime #

Salah satu kesalahan fatal terbesar adalah membiarkan kluster padam hanya untuk merotasi sertifikat SSL yang kedaluwarsa. Apache Kafka mendukung pemuatan ulang sertifikat SSL secara dinamis (Dynamic SSL Reloading) sejak versi 1.1.0 tanpa perlu melakukan restart proses JVM broker.

Mekanisme Kerja Dinamis Keystore Reload #

Ketika kita memicu konfigurasi pemuatan ulang dinamis, Kafka Broker akan memuat ulang instansi SSL Engine JVM, membuka kembali file keystore dan truststore baru yang terletak di disk, dan menerapkannya untuk jabat tangan koneksi baru secara instan. Koneksi TCP terenkripsi yang sudah terbentuk sebelumnya (existing connections) akan tetap berjalan menggunakan parameter lama hingga koneksi tersebut ditutup secara alami atau terputus.

Langkah Praktis Rotasi Sertifikat: #

  1. Perbarui file sertifikat fisik keystore JKS/PKCS12 broker di lokasi disk yang sama (misalnya menimpa file /var/private/ssl/kafka.broker1.keystore.jks dengan file sertifikat baru).
  2. Jalankan perintah kafka-configs.sh untuk memicu pemuatan ulang pada broker target:
# Memicu reload SSL Keystore dinamis pada broker-1 (node 1)
kafka-configs.sh --bootstrap-server broker1.kafka.mycompany.local:9093 \
  --command-config /etc/kafka/client.properties \
  --entity-type brokers \
  --entity-name 1 \
  --alter \
  --add-config "listener.name.client.ssl.keystore.type=JKS"

Tip: Mengubah properti penunjang keystore (seperti mengubah tipe keystore, atau merujuk ulang nama properti yang sama) akan memaksa broker untuk mendeteksi perubahan tanggal modifikasi file di disk dan segera memuat ulang sertifikat baru ke memori.

  1. Verifikasi apakah sertifikat baru sudah aktif menggunakan perintah openssl:
echo | openssl s_client -connect broker1.kafka.mycompany.local:9093 -servername broker1.kafka.mycompany.local 2>/dev/null | openssl x509 -noout -dates

Periksa apakah tanggal notAfter sudah bergeser ke masa depan sesuai dengan sertifikat baru yang kita pasang.


Checklist Audit Keamanan Enkripsi dalam Perjalanan #

Gunakan checklist kepatuhan berikut untuk memverifikasi implementasi enkripsi lalu lintas data kluster kita:

No Kriteria Audit Keamanan Metode Verifikasi Status
1 Nonaktifkan Port Unencrypted Pindai port 9092 dari luar VPC; port wajib ditutup atau menolak koneksi. [ ]
2 Gunakan TLSv1.3 Coba paksa jabat tangan TLSv1.1/TLSv1.2 via openssl: openssl s_client -connect broker:9093 -tls1_1. Koneksi wajib gagal. [ ]
3 Validasi Endpoint (Ident Algorithm) Pastikan ssl.endpoint.identification.algorithm disetel HTTPS di client config untuk mencegah Man-in-the-Middle. [ ]
4 Pemisahan Port Inter-Broker Protokol inter-broker harus berjalan di listener internal terpisah (bukan listener client). [ ]
5 Otentikasi Klien Aktif (mTLS) Jika menggunakan mTLS, coba hubungkan klien Java tanpa keystore. Koneksi wajib ditolak dengan pesan bad_certificate. [ ]
6 Audit Masa Aktif Sertifikat Pasang monitoring sisa hari kedaluwarsa sertifikat pada sistem alert internal. [ ]

Ringkasan #

  • Matikan PLAINTEXT — Selalu gunakan SSL atau SASL_SSL di lingkungan produksi untuk memproteksi kerahasiaan data.
  • Terapkan mTLS — Aktifkan otentikasi timbal balik (ssl.client.auth=required) untuk mengotentikasi identitas klien menggunakan sertifikat digital sebelum mereka dapat terhubung.
  • Gunakan TLSv1.3 & GCM — Manfaatkan efisiensi performa TLSv1.3 dan akselerasi perangkat keras CPU AES-NI untuk meminimalisir overhead latensi enkripsi.
  • Rotasi Dinamis — Jangan pernah mematikan broker hanya untuk memperbarui sertifikat SSL. Gunakan perintah alter configs di Kafka Configs CLI untuk memicu pemuatan ulang keystore secara dinamis.

← Sebelumnya: Common Security Mistakes   Berikutnya: Encryption at Rest →

About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact