Belajar MongoDB - Security: Authentication, Authorization & Encryption
Episode 17 of 21

Belajar MongoDB - Security: Authentication, Authorization & Encryption

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.

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

Pendahuluan

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.

Authentication: Mengaktifkan Mode --auth

Membuat Admin User Pertama

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:

Membuat admin user sebelum mengaktifkan auth
mongosh "mongodb://localhost:27017"
Membuat root user di database admin
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.

Mengaktifkan Mode --auth

Setelah admin user ada, hidupkan autentikasi dengan memulai mongod dengan flag --auth:

Menjalankan mongod dengan autentikasi
mongod --auth --dbpath /data/db --port 27017

Untuk instalasi native dengan systemd, tambahkan --auth di file konfigurasi mongod.conf:

Konfigurasi autentikasi di mongod.conf
security:
  authorization: enabled

Setelah ini, semua koneksi wajib login. Koneksi dari mongosh kini memerlukan kredensial:

Masuk dengan autentikasi
mongosh "mongodb://admin:rahasia@localhost:27017/admin"

Mekanisme Autentikasi

MongoDB mendukung beberapa mekanisme autentikasi:

  • SCRAM-SHA-256 — default sejak MongoDB 4.0. Kredensial di-hash di sisi server, password tidak pernah dikirim mentah. Paling umum untuk deployment sendiri.
  • x.509 Certificates — autentikasi berbasis sertifikat untuk klien dan antar node; umum di lingkungan enterprise dengan PKI.
  • LDAP Proxy — meneruskan autentikasi ke server LDAP/Active Directory, untuk integrasi ke infrastruktur identitas perusahaan.

Authorization: RBAC (Role-Based Access Control)

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.

Built-in Roles

MongoDB menyediakan roles bawaan untuk kebutuhan umum:

RoleHak
readMembaca collection di database
readWriteMembaca dan menulis
dbAdminMengelola database (index, collection, validator)
userAdminMengelola user dan roles di database
clusterAdminMengelola cluster: sharding, replica set, backup
rootSemua hak di semua database
Membuat user aplikasi dengan hak terbatas
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.

Custom Roles

Built-in roles sering terlalu lebar atau terlalu sempit. Untuk hak granular, definisikan custom roles:

Membuat custom role dengan hak spesifik
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

Encryption at rest melindungi data fisik di disk — jika disk dicuri atau snapshot bocor, data tetap tidak terbaca tanpa kunci. Dua pendekatan umum:

  • WiredTiger Encrypted Storage Engine — fitur MongoDB Enterprise yang mengenkripsi datafile secara transparan dengan AES-256. Kunci dikelola lewat Key Management Interoperability Protocol (KMIP) atau local keyfile.
  • Linux Disk Encryption (LUKS) — enkripsi level OS pada seluruh partisi disk, bekerja untuk MongoDB Community juga. Simpel dan kuat, tanpa bergantung pada fitur Enterprise.
Mengaktifkan enkripsi WiredTiger di mongod.conf
security:
  enableEncryption: true
  encryptionKeyFile: /etc/mongodb-keys/keyfile

Encryption in Transit: TLS/SSL

Enkripsi 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:

  • Client-to-server — koneksi antara driver aplikasi dan mongod/mongos.
  • Intra-cluster — komunikasi antar node replica set dan sharded cluster.
Terhubung dengan TLS
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.

Client-Side Field Level Encryption (CSFLE)

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.

Penutup

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:

  • Selalu buat admin user sebelum mengaktifkan --auth.
  • Beri user hak paling kecil yang cukup — aplikasi tidak pernah root.
  • TLS adalah minimum mutlak: tanpa enkripsi koneksi, data bisa disadap.
  • Encryption at rest melindungi disk; CSFLE melindungi field sensitif bahkan dari admin.
  • Simpan dan rotasi kredensial via secret manager, bukan di repo.

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!

Belajar MongoDB - Security: Authentication, Authorization & Encryption | Belajar MongoDB