Lapisan paling luar dari defense in depth adalah jaringan: sebelum penyerang berhadapan dengan password atau role, penyerang harus bisa menjangkau server lebih dulu. mongod yang mendengarkan di semua antarmuka jaringan adalah pintu terbuka yang menunggu dipakai. Chapter ini membahas tiga alat pengendalian jangkauan server: bindIp pada konfigurasi, firewall di sistem operasi, dan arsitektur jaringan privat — ditutup dengan padanannya di MongoDB Atlas.

Peta materi Chapter ini:

  • net.bindIp: default localhost, cara mengizinkan alamat tertentu, dan bahaya 0.0.0.0.
  • Memverifikasi alamat yang didengarkan server lewat getCmdLineOpts dan ss.
  • Firewall dengan ufw sebagai penyaring lapisan kedua.
  • Jaringan privat, VPN, dan IP access list di Atlas.

bindIp: Menentukan Alamat yang Didengarkan #

Opsi net.bindIp menentukan alamat IP mana yang dilayani mongod. Nilai default-nya adalah localhost — server hanya menerima koneksi dari mesin yang sama, dan itulah sebabnya semua latihan kita sejauh ini aman berjalan di 127.0.0.1:27017. Kita baca konfigurasi aktif server latihan:

js
const net = db.adminCommand({ getCmdLineOpts: 1 }).parsed.net
printjson(net)

Output yang Dihasilkan:

text
{
  bindIp: '127.0.0.1',
  port: 27017
}

Saat aplikasi berjalan di mesin lain, tambahkan alamat antarmuka yang relevan ke file konfigurasi, lalu restart mongod:

text
net:
  bindIp: 127.0.0.1,192.168.1.10
  port: 27017

Nilai bindIp menerima daftar alamat yang dipisah koma — pertahankan 127.0.0.1 agar koneksi lokal (misalnya tugas terjadwal) tetap berfungsi. Replica set memiliki kebutuhan ekstra: setiap anggota harus bisa dijangkau anggota lain, dan alamat yang dipublikasikan cluster pun ikut terlihat oleh klien:

js
printjson({ hosts: db.hello().hosts, me: db.hello().me })

Output yang Dihasilkan:

text
{
  hosts: [
    '127.0.0.1:27017'
  ],
  me: '127.0.0.1:27017'
}

Field hosts memuat daftar alamat yang diberitahu MongoDB kepada klien; me adalah identitas anggota yang kita hubungi. Keduanya menunjukkan 127.0.0.1:27017 — pada cluster produksi, pastikan alamat-alamat itu adalah IP privat atau hostname DNS internal, bukan IP publik.

Memverifikasi dengan ss #

Klaim konfigurasi sebaiknya selalu diverifikasi dari luar proses. Perintah ss menampilkan socket yang sedang didengarkan sistem:

bash
ss -ltn 'sport = :27017'

Output yang Dihasilkan:

text
State  Recv-Q Send-Q Local Address:Port  Peer Address:Port
LISTEN 0      4096       127.0.0.1:27017      0.0.0.0:*   

Baris LISTEN pada 127.0.0.1:27017 mengonfirmasi bahwa hanya antarmuka loopback yang dilayani — kolom Local Address:Port adalah kunci bacanya. Sebaliknya, bila kolom itu menampilkan 0.0.0.0:27017 atau *:27017, server mendengarkan di semua antarmuka dan Anda perlu meninjau bindIp segera.

Firewall: Menyaring Lapisan Kedua #

bindIp memilih alamat; firewall memilih siapa yang boleh melewati alamat itu. Keduanya saling melengkapi — firewall tetap melindungi saat ada layanan lain yang tanpa sengaja mendengarkan di 0.0.0.0. Di Ubuntu, alat standarnya adalah ufw:

bash
sudo ufw default deny incoming
sudo ufw allow from 192.168.1.0/24 to any port 27017 proto tcp
sudo ufw status numbered

Tiga perintah di atas menutup semua koneksi masuk secara default, lalu membuka port 27017 khusus untuk subnet privat 192.168.1.0/24, dan menampilkan aturan yang terpasang. Prinsip yang sama berlaku di iptables, firewalld, atau security group di cloud — yang penting adalah kebijakan default deny: koneksi ditolak kecuali secara eksplisit diizinkan.

Jaringan Privat dan VPN #

Pengendalian terkuat adalah arsitektur: jangan sampai port database bisa dijangkau dari internet sama sekali. Pola yang lazim dipakai produksi:

  • Subnet privat: cluster hidup di VPC subnet privat; hanya server aplikasi yang berada di subnet yang sama yang bisa terhubung.
  • VPN / tunnel: administrator masuk lewat VPN atau tunnel terenkripsi (misalnya WireGuard) sebelum bisa menjangkau port database.
  • Bastion: akses mongosh dari luar melewati satu host lompat yang diawasi ketat.

Atlas menyediakan fitur Network Access (dahulu bernama IP whitelist) untuk kebutuhan yang sama: pada panel Atlas, daftarkan IP atau CIDR yang diizinkan menghubungi cluster, dan Atlas menolak koneksi dari selain daftar itu. Pengaturannya berada di menu Network Access setiap project — langkah naratifnya bisa Anda ikuti di dokumentasi resmi Atlas.

Rangkuman #

  • net.bindIp default localhost; tambahkan alamat eksplisit (dipisah koma) saat aplikasi berada di mesin lain, dan jangan pakai 0.0.0.0 tanpa perlindungan penuh.
  • Verifikasi dari luar dengan ss -ltn: kolom Local Address menunjukkan antarmuka yang benar-benar didengarkan.
  • Firewall ufw dengan kebijakan default deny menjadi lapisan kedua yang independen dari konfigurasi mongod.
  • Subnet privat, VPN, dan bastion membuat port database tidak pernah terekspos internet; di Atlas, padanannya adalah Network Access (IP access list).