Chapter TLS dan Enkripsi sudah membuktikan di lab bahwa tanpa TLS seluruh percakapan klien-server berjalan sebagai teks polos. Sekarang kita melengkapi gambar produksinya: data MongoDB tidak hanya bergerak antara aplikasi dan server — data juga mengalir antar anggota replica set melalui oplog, dan dari tools seperti mongodump ke server. Setiap jalur yang lupa dikunci menjadi celah penyadapan meskipun jalur lain sudah terenkripsi. Chapter ini merangkum versi TLS yang diizinkan, verifikasi identitas sertifikat, larangan tlsInsecure, dan pengamanan lalu lintas internal cluster.
Peta materi Chapter ini:
- Tiga jalur lalu lintas data dan pengaman masing-masing.
- Versi TLS dan cipher yang diizinkan MongoDB.
- Sertifikat server, CA bundle klien, dan hostname verification.
tlsInsecure: perilaku sebenarnya dan alasannya dilarang di produksi.- Internal membership auth dengan
clusterFiledan tangga migrasitlsMode.
Tiga Jalur Lalu Lintas Data #
| Jalur | Isi lalu lintas | Pengaman |
|---|---|---|
Aplikasi ↔ mongod | Query, hasil, kredensial SCRAM | net.tls.mode di server, tls=true di klien |
| Anggota ↔ anggota replica set | Perubahan data lewat oplog | net.tls.clusterFile |
Tools ↔ mongod | Data mongodump, metrik mongostat | Opsi --tls pada tools |
Baris kedua paling sering terlewat: replication menyalin seluruh perubahan data ke tiap anggota, sehingga satu koneksi antar anggota yang polos membocorkan isi database sama luasnya dengan koneksi aplikasi yang polos. Checklist keamanan resmi MongoDB karenanya mewajibkan TLS untuk semua koneksi masuk dan keluar, termasuk di antara komponen mongod dan mongos.
Versi dan Cipher yang Diizinkan #
MongoDB menonaktifkan TLS 1.0 dan 1.1 pada sistem yang sudah mendukung TLS 1.2 ke atas, dan hanya mengizinkan cipher kuat dengan panjang kunci minimal 128 bit untuk semua koneksi. Praktisnya, deployment modern menegosiasikan TLS 1.2 atau 1.3 — protokol lawas yang rentan tidak lagi menjadi opsi. Mode net.tls.mode dengan empat nilainya (disabled, allowTLS, preferTLS, requireTLS) sudah kita bahas di Chapter TLS dan Enkripsi; satu tambahan penting untuk produksi adalah bahwa mode itu bisa dinaikkan tanpa restart, satu anggota demi satu anggota:
// mdtest: skip — mengubah tlsMode server bersama akan merusak sesi latihan
// Jalankan pada tiap anggota, satu per satu (prosedur resmi upgrade cluster):
db.adminCommand({ setParameter: 1, tlsMode: "preferTLS" })
db.adminCommand({ setParameter: 1, tlsMode: "requireTLS" })Tangga migrasinya: mulai dengan allowTLS saat startup, naikkan ke preferTLS lewat setParameter setelah semua klien siap, lalu kunci dengan requireTLS. Setelah requireTLS aktif, klien non-TLS ditolak sejak jabat tangan — tidak ada jalan kembali tanpa menurunkan mode lagi.
Sertifikat Server dan CA Bundle Klien #
Saat TLS aktif, server mempresentasikan sertifikatnya lewat net.tls.certificateKeyFile. Untuk produksi, sertifikat harus diterbitkan CA yang dipercaya — sertifikat self-signed mengenkripsi koneksi tetapi tidak memvalidasi identitas server, sehingga koneksi rentan disusupi man-in-the-middle. Di sisi klien, dua hal harus benar: koneksi dimulai dengan tls=true, dan klien memegang CA bundle yang menandatangani sertifikat server lewat tlsCAFile. Connection string lengkapnya berbentuk:
mongodb://app_toko:[email protected]:27017/toko
?tls=true&tlsCAFile=/etc/app/ca-bundle.pem&authSource=adminKlien juga memverifikasi bahwa hostname di URI cocok dengan subjectAltName sertifikat — inilah hostname verification yang dulu menjebak lab kita ketika sertifikat dibuat tanpa SAN. Apa yang terjadi bila klien TLS menghubungi server yang tidak menjalankan TLS sama sekali? Kita buktikan pada server latihan kita:
try {
new Mongo("mongodb://127.0.0.1:27017/?tls=true&directConnection=true&serverSelectionTimeoutMS=3000")
} catch (e) {
print(e.constructor.name + ": " + e.message)
}Output yang Dihasilkan:
MongoServerSelectionError: Client network socket disconnected before secure TLS connection was establishedKlien memulai jabat tangan TLS, server polos tidak meresponsnya, dan koneksi terputus sebelum terbangun. Perilaku ini melindungi kita dari konfigurasi setengah jalan: lebih baik gagal nyaring daripada diam-diam jatuh ke mode polos.
tlsInsecure: Jangan di Produksi #
Opsi tlsInsecure melonggarkan validasi klien: sertifikat yang tidak dikenal dan hostname yang tidak cocok diabaikan. Versi tlsInsecure sering muncul di kode pengembangan yang menyalin-tempel dari tutorial lab. Kita uji apakah opsi itu bisa “menyelamatkan” koneksi ke server tanpa TLS:
try {
new Mongo("mongodb://127.0.0.1:27017/?tls=true&tlsInsecure=true&directConnection=true&serverSelectionTimeoutMS=3000")
} catch (e) {
print(e.constructor.name + ": " + e.message)
}Output yang Dihasilkan:
MongoServerSelectionError: Client network socket disconnected before secure TLS connection was establishedHasilnya tetap gagal dengan galat yang sama — tlsInsecure tidak bisa menciptakan TLS di sisi server; opsi ini hanya melemahkan pemeriksaan klien. Ketika sertifikat ditolak di produksi, perbaikannya adalah membetulkan CA bundle atau hostname, bukan mematikan validasi.
Internal Membership Auth #
Lalu lintas antar anggota diamankan dengan sertifikat keanggotaan lewat net.tls.clusterFile. Sertifikat anggota punya dua syarat: minimal satu entri subjectAltName-nya cocok dengan hostname yang dipakai anggota lain, dan atribut O, OU, atau DC-nya identik di seluruh anggota — inilah yang memverifikasi bahwa yang menghubungi memang anggota cluster sendiri, bukan penyusup. Bila clusterFile tidak diisi, certificateKeyFile dipakai untuk keduanya. Alternatif non-TLS untuk keanggotaan adalah keyfile bersama (security.keyFile), tetapi pola produksi yang dianjurkan adalah x.509 karena sekaligus mengaktifkan TLS antar anggota. Di MongoDB Atlas, TLS selalu aktif untuk semua jalur — klien cukup mengunduh CA bundle Atlas dan seluruh pembahasan bagian ini sudah ditangani.
Rangkuman #
- Tiga jalur lalu lintas — aplikasi↔server, anggota↔anggota, tools↔server — semuanya wajib TLS; jalur replication membawa salinan seluruh data.
- MongoDB menonaktifkan TLS 1.0/1.1 dan hanya menerima cipher minimal 128 bit;
tlsModebisa dinaikkan bertahap tanpa restart lewatsetParameter. - Klien membutuhkan
tls=trueplustlsCAFileyang benar; hostname verification mencocokkan URI dengansubjectAltNamesertifikat. tlsInsecurehanya melemahkan validasi klien — terbukti tidak menolong koneksi ke server tanpa TLS — dan dilarang di produksi.net.tls.clusterFiledengan atributO/OU/DCseragam mengamankan sekaligus mengautentikasi lalu lintas antar anggota.