Lewati ke isi

Keamanan/Cyber Security

Cara Mengunci Redis dan MongoDB agar Tidak Terbuka Publik

Kunci Redis dan MongoDB di VPS: bind ke localhost, wajibkan password atau ACL, tutup port di firewall, lalu uji dari luar.

Terbit 6 menit baca

Jawaban singkat

Redis dan MongoDB aman bila hanya mendengarkan di localhost atau jaringan privat, mewajibkan autentikasi, dan port 6379 serta 27017 ditutup firewall. Setelah diatur, uji dari komputer lain bahwa port tidak bisa dihubungi.

Daftar isi
  1. Kenapa Redis dan MongoDB sering bocor?
  2. Langkah mengunci Redis
  3. Langkah 1: Cek ke mana Redis mendengarkan
  4. Langkah 2: Batasi alamat bind dan pastikan protected mode aktif
  5. Langkah 3: Wajibkan autentikasi dengan ACL
  6. Langkah 4: Restart dan uji login
  7. Langkah mengunci MongoDB
  8. Langkah 1: Buat pengguna admin dulu
  9. Langkah 2: Aktifkan autentikasi dan batasi bindIp
  10. Langkah 3: Restart dan uji
  11. Tutup port di firewall
  12. Buktikan dari luar bahwa port tertutup
  13. Pertanyaan yang sering diajukan

Pernahkah kamu mengecek apakah Redis atau MongoDB di servermu bisa dihubungi siapa saja dari internet? Kalau belum, lakukan sekarang. Database yang terbuka tanpa password adalah salah satu pintu masuk paling mudah bagi penyerang, karena tidak perlu celah canggih: cukup tersambung, lalu baca, hapus, atau tulis data.

Kabar baiknya, menguncinya tidak sulit. Prinsipnya ada tiga: database hanya mendengarkan di alamat yang perlu (biasanya 127.0.0.1), setiap koneksi wajib login, dan port database ditutup di firewall. Panduan ini membahas langkahnya untuk Redis dan MongoDB di VPS Linux, lalu cara membuktikan bahwa keduanya benar-benar tertutup.

Kenapa Redis dan MongoDB sering bocor?

Keduanya dirancang untuk berjalan di jaringan tepercaya. Dokumentasi resmi Redis menyebut Redis dibuat untuk diakses klien tepercaya di dalam lingkungan tepercaya, bukan untuk dibuka langsung ke internet. Masalah muncul saat konfigurasi diubah agar "gampang diakses dari mana saja", misalnya bind 0.0.0.0 di Redis atau bindIp: 0.0.0.0 di MongoDB, tanpa autentikasi.

Penyebab lain yang sering terjadi:

  • Database dijalankan lewat Docker dengan -p 6379:6379 atau -p 27017:27017, sehingga port terbuka ke semua alamat. Di banyak distro, aturan Docker juga melewati UFW.
  • Firewall belum aktif sama sekali di VPS baru.
  • Password lemah atau dipakai ulang dari layanan lain.
  • Konfigurasi contoh dari tutorial lama disalin tanpa diperiksa.

Port yang perlu kamu waspadai: 6379 untuk Redis dan 27017 untuk MongoDB.

Langkah mengunci Redis

Langkah 1: Cek ke mana Redis mendengarkan

Jalankan perintah berikut di server:

sudo ss -tlnp | grep -E '6379|27017'

Kalau hasilnya 127.0.0.1:6379, Redis hanya bisa dihubungi dari server itu sendiri. Kalau 0.0.0.0:6379 atau *:6379, Redis mendengarkan di semua antarmuka dan perlu segera dibatasi.

Langkah 2: Batasi alamat bind dan pastikan protected mode aktif

Buka file konfigurasi, biasanya /etc/redis/redis.conf di Ubuntu dan Debian:

bind 127.0.0.1 -::1
protected-mode yes

Kalau aplikasi ada di server lain, tambahkan IP privat server itu saja, bukan IP publik. Protected mode adalah pengaman bawaan Redis sejak versi 3.2: bila Redis tidak punya password dan tidak dibatasi alamat bind, koneksi dari luar loopback akan ditolak. Jangan mematikannya.

Langkah 3: Wajibkan autentikasi dengan ACL

Sejak Redis 6, kamu bisa membuat pengguna dengan hak terbatas lewat ACL. Contoh di redis.conf:

user default off
user appuser on >GantiDenganPasswordPanjangAcak ~app:* +@all -@dangerous

Baris pertama mematikan pengguna default tanpa nama. Baris kedua membuat pengguna appuser yang hanya boleh mengakses kunci berawalan app: dan tidak boleh menjalankan perintah berbahaya seperti FLUSHALL atau CONFIG. Sesuaikan pola kunci dengan aplikasimu, dan pastikan aplikasimu sudah mendukung login dengan nama pengguna. Cara lama requirepass masih bisa dipakai untuk satu password bersama.

Buat password panjang secara acak, misalnya dengan openssl rand -base64 32.

Langkah 4: Restart dan uji login

sudo systemctl restart redis-server
redis-cli --user appuser --pass 'passwordmu' ping

Jawaban PONG berarti login berhasil. Coba juga redis-cli ping tanpa password; hasilnya harus berupa pesan NOAUTH atau ditolak. Nama layanan bisa berbeda (redis di sebagian distro).

Langkah mengunci MongoDB

Langkah 1: Buat pengguna admin dulu

Sebelum mengaktifkan autentikasi, buat pengguna admin agar kamu tidak terkunci di luar. Masuk dengan mongosh dari server, lalu:

use admin
db.createUser({
  user: "adminutama",
  pwd: passwordPrompt(),
  roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
})

Setelah itu buat pengguna khusus untuk aplikasi, dengan hak readWrite hanya pada database aplikasinya. Jangan pakai akun admin di aplikasi.

Langkah 2: Aktifkan autentikasi dan batasi bindIp

Edit /etc/mongod.conf:

net:
  port: 27017
  bindIp: 127.0.0.1
security:
  authorization: enabled

Sejak MongoDB 3.6, mongod bawaan sudah mendengarkan di localhost saja. Jadi kalau di konfigurasimu tertulis 0.0.0.0, itu hasil perubahan manual. Kalau aplikasi di server lain, tambahkan IP privatnya dipisah koma, misalnya 127.0.0.1,10.0.0.5.

Langkah 3: Restart dan uji

sudo systemctl restart mongod
mongosh "mongodb://adminutama@127.0.0.1:27017/admin"

Coba juga perintah show dbs tanpa login. Seharusnya ditolak dengan pesan butuh autentikasi.

Untuk koneksi antar-server lewat jaringan yang tidak sepenuhnya kamu kendalikan, checklist keamanan resmi MongoDB menyarankan TLS. Bila memungkinkan, lebih sederhana lagi memakai jaringan privat atau VPN antar-server.

Tutup port di firewall

Pengaturan bind adalah lapisan pertama. Firewall adalah lapisan kedua, berjaga kalau suatu hari konfigurasi berubah. Dengan UFW di Ubuntu:

sudo ufw default deny incoming
sudo ufw allow OpenSSH
sudo ufw allow from 10.0.0.5 to any port 6379 proto tcp
sudo ufw enable

Baris ketiga hanya perlu bila ada server aplikasi lain (ganti IP-nya). Kalau semua berjalan di satu server, jangan buka 6379 atau 27017 sama sekali. Panduan lengkapnya ada di cara setting UFW di Ubuntu 24.04.

Kalau database berjalan di Docker, petakan port ke loopback saja, misalnya -p 127.0.0.1:6379:6379, atau jangan petakan port sama sekali bila aplikasi ada di jaringan Docker yang sama. Detailnya dibahas di cara mengamankan Docker di VPS.

Buktikan dari luar bahwa port tertutup

Jangan berhenti di "sepertinya sudah aman". Dari komputer lain (bukan server itu), jalankan:

nc -zv IP_PUBLIK_SERVER 6379
nc -zv IP_PUBLIK_SERVER 27017

Hasil yang diharapkan adalah koneksi gagal atau timeout. Kalau muncul "succeeded" atau "open", ada lapisan yang masih terbuka. Ulangi pemeriksaan setiap kali kamu mengubah konfigurasi, memasang ulang container, atau memindahkan server.

Ringkasan pengaturan yang dibahas:

PengaturanRedisMongoDB
Port bawaan637927017
File konfigurasi umum/etc/redis/redis.conf/etc/mongod.conf
Batasi alamatbind 127.0.0.1 -::1bindIp: 127.0.0.1
AutentikasiACL (user ...) atau requirepassauthorization: enabled
Pengaman bawaanprotected-mode yesBind localhost sejak 3.6
Uji dari luarnc -zv IP 6379nc -zv IP 27017

Pertanyaan yang sering diajukan

Apakah cukup memasang password tanpa mengubah bind?

Tidak disarankan. Password melindungi dari akses tanpa login, tapi port yang terbuka tetap bisa ditebak passwordnya terus-menerus. Gabungkan bind ke localhost atau IP privat, autentikasi, dan firewall.

Bagaimana kalau aplikasi saya ada di server lain?

Hubungkan lewat jaringan privat penyedia VPS atau VPN, izinkan hanya IP server aplikasi di firewall, dan pakai TLS bila koneksi melewati jaringan publik.

Apakah mengganti port bawaan membantu?

Sedikit mengurangi pemindaian otomatis, tapi bukan pengamanan. Pemindai bisa memeriksa semua port, jadi bind, autentikasi, dan firewall tetap wajib.

Saya menemukan database sudah terbuka berbulan-bulan, apa yang harus dilakukan?

Tutup aksesnya dulu, lalu periksa apakah ada data yang hilang, kunci asing, atau pengguna baru yang tidak kamu kenal. Ganti semua password terkait dan ikuti panduan respons insiden bila ada tanda data diakses.

Checklist singkat sebelum selesai:

  • ss -tlnp menunjukkan 6379 dan 27017 hanya di 127.0.0.1 atau IP privat.
  • Redis memakai ACL atau requirepass, protected mode aktif.
  • MongoDB memakai authorization: enabled dan pengguna aplikasi terpisah.
  • Firewall menolak koneksi masuk ke port database dari internet.
  • Uji nc dari luar menunjukkan port tertutup.

Sumber & referensi

Baca juga