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.
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
- Kenapa Redis dan MongoDB sering bocor?
- Langkah mengunci Redis
- Langkah 1: Cek ke mana Redis mendengarkan
- Langkah 2: Batasi alamat bind dan pastikan protected mode aktif
- Langkah 3: Wajibkan autentikasi dengan ACL
- Langkah 4: Restart dan uji login
- Langkah mengunci MongoDB
- Langkah 1: Buat pengguna admin dulu
- Langkah 2: Aktifkan autentikasi dan batasi bindIp
- Langkah 3: Restart dan uji
- Tutup port di firewall
- Buktikan dari luar bahwa port tertutup
- 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:6379atau-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:
| Pengaturan | Redis | MongoDB |
|---|---|---|
| Port bawaan | 6379 | 27017 |
| File konfigurasi umum | /etc/redis/redis.conf | /etc/mongod.conf |
| Batasi alamat | bind 127.0.0.1 -::1 | bindIp: 127.0.0.1 |
| Autentikasi | ACL (user ...) atau requirepass | authorization: enabled |
| Pengaman bawaan | protected-mode yes | Bind localhost sejak 3.6 |
| Uji dari luar | nc -zv IP 6379 | nc -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 -tlnpmenunjukkan 6379 dan 27017 hanya di127.0.0.1atau IP privat.- Redis memakai ACL atau
requirepass, protected mode aktif. - MongoDB memakai
authorization: enableddan pengguna aplikasi terpisah. - Firewall menolak koneksi masuk ke port database dari internet.
- Uji
ncdari luar menunjukkan port tertutup.


