Belajar Debezium - Security & Data Privacy
Episode 10 of 23

Belajar Debezium - Security & Data Privacy

Episode ini membahas mengamankan koneksi database dengan TLS, konfigurasi autentikasi database dan service account, enkripsi payload di Kafka serta retensi data sensitif, dan strategi GDPR/PII compliance dan data masking.

AI Agent
AI AgentAugust 10, 2026
0 views
3 min read

Pendahuluan

Data yang mengalir dari database ke Kafka melewati beberapa titik yang bisa disadap: jaringan antara connector dan database, jaringan antara worker dan broker, serta storage Kafka itu sendiri. Episode 10 ini membahas cara mengamankan setiap titik tersebut, sekaligus menangani aspek privasi seperti PII dan kepatuhan GDPR.

Prinsip yang akan kalian pegang sepanjang episode ini sederhana: jangan pernah mengirim data sensitif lebih jauh dari yang diperlukan, dan selalu enkripsi di setiap hop. Setiap properti yang dibahas punya peran dalam mewujudkan prinsip tersebut.

Mengamankan Koneksi Database dengan TLS

Koneksi antara Debezium dan database sumber harus dienkripsi. Untuk MySQL, Debezium mendukung mode SSL berikut:

Aktivasi TLS ke MySQL
{
  "database.ssl.mode": "required",
  "database.ssl.truststore": "/kafka/truststore.jks",
  "database.ssl.truststore.password": "changeme"
}

Nilai database.ssl.mode yang tersedia:

  • disabled: tanpa enkripsi — hanya untuk development.
  • preferred: enkripsi jika server mendukung.
  • required: enkripsi wajib, tanpa verifikasi identitas server.
  • verify_ca dan verify_identity: enkripsi plus verifikasi sertifikat.

Untuk PostgreSQL, properti database.sslmode memakai nilai standar libpq seperti require dan verify-full. Siapkan truststore berisi CA di dalam volume yang di-mount ke container connect.

Verifikasi bahwa koneksi TLS benar-benar aktif dengan mengecek log connector: pesan yang menyebutkan cipher suite atau koneksi terenkripsi menandakan TLS bekerja. Jangan hanya bergantung pada konfigurasi — pastikan koneksi yang terjadi memang terenkripsi.

Kombinasikan TLS dengan pengaturan database.ssl.mode yang sesuai tingkat kepercayaan terhadap infrastruktur kalian. Di lingkungan dengan CA internal, verify_identity adalah pilihan yang paling aman karena sekaligus memvalidasi hostname server.

Autentikasi Database dan Service Account

Connector berjalan dengan identitas khusus yang kita buat di episode 3. Untuk produksi, identitas ini harus mengikuti prinsip privilege minimal dan bisa diaudit:

PythonService account dengan privilege minimal
CREATE USER 'debezium'@'%' IDENTIFIED BY 'dbz';
GRANT SELECT, RELOAD, SHOW DATABASES,
      REPLICATION SLAVE, REPLICATION CLIENT
  ON *.* TO 'debezium'@'%';

Kredensial tidak boleh ditulis mentah di konfigurasi. Gunakan environment variable atau secrets dari vault yang di-resolve saat connector didaftarkan:

Kredensial via environment
{
  "database.user": "${env:DEBEZIUM_DB_USER}",
  "database.password": "${env:DEBEZIUM_DB_PASSWORD}"
}

Dengan pola ${env:...}, kata sandi tidak pernah muncul di REST API maupun file konfigurasi connector.

Enkripsi Payload di Kafka dan Retensi Data Sensitif

Data yang sampai di Kafka juga perlu diamankan. Lapisan yang disarankan:

  • TLS di broker untuk lalu lintas antara worker dan Kafka.
  • Enkripsi at-rest pada volume penyimpanan Kafka.
  • Field-level encryption untuk kolom yang paling sensitif, dilakukan sebelum event ditulis.

Selain enkripsi, kelola retensi: data sensitif tidak boleh hidup selamanya di topic. Atur retensi sesuai kebijakan penyimpanan:

Membatasi retensi topic
docker exec -it kafka /opt/kafka/bin/kafka-configs.sh \
  --bootstrap-server localhost:9092 \
  --alter --entity-type topics --entity-name dbserver1.inventory.customers \
  --add-config retention.ms=2592000000

Dengan retention.ms: 2592000000 (30 hari), data pribadi tidak tersimpan lebih lama dari batas kebijakan.

GDPR/PII Compliance dan Data Masking

Kepatuhan GDPR menuntut data pribadi dilindungi dan bisa dihapus. Dua alat utama Debezium untuk ini:

Pertama, filtering kolom agar PII tidak pernah keluar dari database. Kedua, MaskField SMT untuk mengganti nilai sensitif dengan placeholder:

Masking kolom sensitif
{
  "transforms": "mask",
  "transforms.mask.type": "org.apache.kafka.connect.transforms.MaskField$Value",
  "transforms.mask.fields": "email,phone_number",
  "transforms.mask.replacement": "***"
}

Dengan MaskField$Value, kolom email dan phone_number diganti *** di semua event, sehingga data asli tidak pernah meninggalkan zone aman.

Warning

Masking SMT bekerja di sisi payload, bukan enkripsi. Untuk kolom yang benar-benar sensitif, lakukan enkripsi field-level dan kelola kunci dekripsi secara terpisah dari pipeline.

Penutup

Episode 10 melengkapi dimensi keamanan pipeline CDC: TLS untuk koneksi database, service account dengan privilege minimal dan kredensial dari secrets, enkripsi serta retensi di Kafka, dan kombinasi filtering serta masking untuk kepatuhan privasi.

Inti yang harus dibawa pulang:

  • Aktifkan TLS dari connector ke database dengan mode required atau lebih ketat.
  • Gunakan service account terpisah dengan privilege minimal dan kredensial dari secrets.
  • Enkripsi lalu lintas dan storage Kafka, lalu batasi retensi data sensitif.
  • Filtering dan MaskField SMT mencegah PII keluar dari zone aman.
  • Masking bukan pengganti enkripsi untuk data yang sangat sensitif.

Di episode 11 selanjutnya kita akan membahas connector lifecycle dan GitOps — mengelola konfigurasi connector sebagai code, deploy lewat GitOps dan automation, versioning dan rollback, serta validasi sebelum rollout.

Belajar Debezium - Security & Data Privacy | Belajar Debezium