Mengamankan MongoDB dengan autentikasi SCRAM, membangun authorization berbasis RBAC dengan built-in roles dan custom roles, serta melindungi data melalui encryption at rest, TLS untuk koneksi, dan client-side field level encryption untuk field sensitif.

Sejauh ini kalian menjalankan MongoDB tanpa autentikasi — wajar untuk lab belajar, fatal untuk produksi. Database yang tidak diamankan adalah bom waktu: siapa pun yang bisa mencapai port 27017 bisa membaca, mengubah, atau menghapus semua data. Episode 17 menutup lubang keamanan ini secara menyeluruh.
Roadmap-nya: pertama kita nyalakan authentication dengan membuat admin user dan mode --auth, kedua kita bangun authorization dengan RBAC — built-in roles dan custom roles, ketiga kita lindungi data dengan encryption at rest, keempat TLS untuk enkripsi koneksi, dan kelima client-side field level encryption untuk field paling sensitif. Mari mulai.
Sebelum mengaktifkan autentikasi, kalian harus membuat admin user — jika tidak, tidak akan ada yang bisa login. Prosesnya: mulai server tanpa auth, buat user di database admin, lalu aktifkan auth:
mongosh "mongodb://localhost:27017"use admin
db.createUser({
user: "admin",
pwd: passwordPrompt(),
roles: [{ role: "root", db: "admin" }]
})passwordPrompt() meminta password secara interaktif — jangan pernah menaruh password di command line. Role root memberikan hak penuh atas cluster.
Setelah admin user ada, hidupkan autentikasi dengan memulai mongod dengan flag --auth:
mongod --auth --dbpath /data/db --port 27017Untuk instalasi native dengan systemd, tambahkan --auth di file konfigurasi mongod.conf:
security:
authorization: enabledSetelah ini, semua koneksi wajib login. Koneksi dari mongosh kini memerlukan kredensial:
mongosh "mongodb://admin:rahasia@localhost:27017/admin"MongoDB mendukung beberapa mekanisme autentikasi:
Autentikasi hanya membuktikan identitas; authorization menentukan apa yang boleh dilakukan identitas itu. MongoDB memakai RBAC: user diberi roles, dan roles berisi kumpulan hak (privileges) pada database/collection tertentu.
MongoDB menyediakan roles bawaan untuk kebutuhan umum:
| Role | Hak |
|---|---|
read | Membaca collection di database |
readWrite | Membaca dan menulis |
dbAdmin | Mengelola database (index, collection, validator) |
userAdmin | Mengelola user dan roles di database |
clusterAdmin | Mengelola cluster: sharding, replica set, backup |
root | Semua hak di semua database |
db.getSiblingDB("app").createUser({
user: "appUser",
pwd: passwordPrompt(),
roles: [{ role: "readWrite", db: "app" }]
})Praktik terbaiknya jelas: berikan hak paling kecil yang cukup. Aplikasi cukup readWrite pada database-nya; jangan pernah menjalankan aplikasi sebagai root.
Built-in roles sering terlalu lebar atau terlalu sempit. Untuk hak granular, definisikan custom roles:
db.getSiblingDB("app").createRole({
role: "orderViewer",
privileges: [
{
resource: { db: "app", collection: "orders" },
actions: ["find", "count"]
}
],
roles: []
})Role orderViewer di atas hanya bisa membaca (find, count) collection orders — tidak bisa menulis, tidak bisa menyentuh collection lain. Inilah contoh minimal privilege yang layak diterapkan di tim dengan banyak developer.
Encryption at rest melindungi data fisik di disk — jika disk dicuri atau snapshot bocor, data tetap tidak terbaca tanpa kunci. Dua pendekatan umum:
security:
enableEncryption: true
encryptionKeyFile: /etc/mongodb-keys/keyfileEnkripsi at rest melindungi data di disk, tapi koneksi antara aplikasi dan MongoDB mengalir sebagai teks biasa — bisa disadap di jaringan. Solusinya TLS/SSL untuk mengamankan dua jalur:
mongosh "mongodb://localhost:27017/?tls=true&tlsCAFile=/etc/ssl/ca.pem"Pada deployment produksi, aktifkan TLS di mana-mana — driver, mongod, mongos, dan antar node. Tanpa TLS, semua pertahanan lain (auth, enkripsi disk) tetap membuat data rentan saat transit.
Tingkat enkripsi tertinggi: CSFLE mengenkripsi field sensitif di sisi aplikasi sebelum data dikirim ke server. Server hanya melihat ciphertext — bahkan admin database sekalipun tidak bisa membaca nilai aslinya. Ini melindungi data dari insider threat dan memenuhi compliance ketat (NIK, nomor kartu, data medis).
Konsep kerjanya: aplikasi mendefinisikan skema yang menandai field terenkripsi, kunci enkripsi disimpan di KMS eksternal (AWS KMS, Azure Key Vault, dsb.), dan driver mengenkripsi field tersebut secara transparan. Server MongoDB menyimpan dan mengindeks ciphertext tanpa pernah melihat plaintext.
Info
Pandangan berlapis keamanan MongoDB: autentikasi memastikan pengguna sah, RBAC membatasi hak mereka, TLS mengamankan koneksi, encryption at rest mengamankan disk, dan CSFLE mengamankan field paling sensitif bahkan dari admin database. Semakin sensitif datanya, semakin banyak lapisan yang harus aktif. Mulailah dari auth + RBAC + TLS sebagai minimum mutlak produksi, lalu naik ke enkripsi sesuai kebutuhan.
Warning
Dengan --auth aktif, jangan lupa dokumenkan dan amankan kredensial admin. Kehilangan password admin = terkunci dari data sendiri; kebocoran password root = cluster sepenuhnya di tangan penyerang. Simpan kredensial di secret manager (bukan file repo!), rotasi password secara berkala, dan beri setiap aplikasi user-nya sendiri — bukan berbagi satu user root.
Pada episode 17 ini kalian telah mengamankan MongoDB berlapis-lapis: mengaktifkan authentication dengan admin user dan mode --auth plus mekanisme SCRAM-SHA-256, x.509, dan LDAP; membangun authorization berbasis RBAC dengan built-in roles read, readWrite, dbAdmin, hingga root serta custom roles untuk hak granular; melindungi data dengan encryption at rest via WiredTiger atau LUKS; mengamankan koneksi dengan TLS untuk client-to-server dan intra-cluster; dan memakai client-side field level encryption untuk field paling sensitif.
Inti yang harus dibawa pulang:
--auth.root.Di episode 18 berikutnya kita menyiapkan rencana penyelamatan: Backup, Restore & Change Streams. Kalian akan memakai mongodump dan mongorestore untuk logical backup, filesystem snapshots untuk physical backup, mengenal point-in-time restore di Atlas, serta memanfaatkan change streams untuk mendengarkan perubahan data secara real-time. Sampai jumpa di episode 18!