Akses tidak sah ke database MongoDB dapat menyebabkan kebocoran data, penghapusan data, atau bahkan pemerasan.
Informasi latar belakang
Untuk memastikan keamanan bisnis dan aplikasi Anda, Cloud Firewall menyediakan solusi untuk menangani kerentanan terkait akses tidak sah ke database MongoDB.
Setelah layanan MongoDB diinstal, database admin dibuat. Secara default, database admin kosong dan tidak berisi informasi autentikasi pengguna.
Secara default, MongoDB tidak memerlukan autentikasi pengguna. Jika parameter tidak dikonfigurasi saat memulai layanan MongoDB, autentikasi pengguna tidak diperlukan untuk mengakses database. Pengguna dapat melakukan operasi berisiko tinggi seperti menyisipkan, menghapus, memodifikasi, atau menanyakan data melalui port default dalam mode tanpa kata sandi. Selain itu, pengguna juga dapat mengakses database secara remote.
Untuk mengatasi masalah ini, tambahkan pengguna ke koleksi admin.system.users. Dengan cara ini, autentikasi pengguna akan diaktifkan untuk database MongoDB.
Solusi
Configure access control policies in Cloud Firewall.
Konfigurasikan kebijakan untuk mengizinkan akses ke layanan MongoDB hanya dari server yang berada di jaringan internal.
Masuk ke Konsol Cloud Firewall. Di panel navigasi sebelah kiri, pilih . Pada halaman Eksposur Internet, buka tab . Kemudian, periksa alamat IP publik layanan MongoDB. Jika layanan MongoDB dimaksudkan hanya untuk server jaringan internal, disarankan untuk mengonfigurasi pengaturan agar layanan MongoDB tidak diekspos ke Internet.
Jalankan perintah berikut untuk mengikat layanan MongoDB ke alamat IP sehingga hanya mengizinkan akses dari server jaringan internal. Dalam contoh ini, alamat IP privat 192.168.XX.XX diikat ke layanan MongoDB, dan layanan tersebut hanya memantau permintaan dari alamat IP tersebut.
mongod --bind_ip 192.168.XX.XXKonfigurasikan kebijakan kontrol akses untuk mengizinkan akses ke layanan MongoDB hanya dari sumber tepercaya.
Konfigurasikan kebijakan Allow untuk mengizinkan akses ke layanan MongoDB hanya dari sumber tepercaya.
Masuk ke Konsol Cloud Firewall. Di panel navigasi sebelah kiri, pilih . Pada halaman Batas Internet, klik tab Inbound dan konfigurasikan kebijakan untuk mengizinkan akses ke layanan MongoDB hanya dari server yang bergantung pada database MongoDB.
Pada tab Inbound, klik Address Books. Pada tab , buat buku alamat dan tambahkan semua sumber tepercaya layanan MongoDB ke buku alamat tersebut.
Pada tab Inbound, klik Create Policy. Pada tab , tentukan buku alamat untuk membuat kebijakan Allow.
Source: Tentukan kotak alamat yang berisi sumber tepercaya layanan MongoDB.
Destination: Tentukan alamat IP publik layanan MongoDB.
Protocol Type: Pilih TCP, yang menunjukkan trafik akses Internet.
Port: Tentukan 0/0, yang menunjukkan semua port dari sumber tepercaya.
Konfigurasikan kebijakan Deny untuk menolak akses ke layanan MongoDB dari semua sumber.
Di panel navigasi sebelah kiri, pilih . Pada halaman yang muncul, klik tab Inbound dan konfigurasikan kebijakan untuk menolak akses ke layanan MongoDB dari semua sumber.
Pada tab Inbound, klik Create Policy. Pada tab , buat kebijakan untuk menolak akses ke layanan MongoDB dari semua sumber.
Source: Tentukan 0.0.0.0/0, yang menunjukkan semua sumber.
Destination: Tentukan alamat IP publik layanan MongoDB.
Protocol Type: Pilih TCP, yang menunjukkan trafik akses Internet.
Port: Tentukan 0/0, yang menunjukkan semua port dari sumber.
Aktifkan autentikasi pengguna berbasis peran.
Jalankan perintah berikut untuk masuk ke database sebelum autentikasi pengguna diaktifkan:
./mongo 127.0.0.1:27028 (Port default tidak digunakan.)Jalankan perintah berikut untuk beralih ke database admin:
use admin switched to db adminCatatanAkun administrator hanya dapat dibuat di database admin.
Jalankan perintah berikut untuk membuat akun administrator di database admin. Dalam contoh ini, nama pengguna adalah su****, dan kata sandinya adalah supWDx****.
CatatanPada MongoDB V3 dan versi lebih baru, metode addUser tidak lagi didukung. Gunakan perintah db.createUser untuk membuat pengguna.
db.addUser("su****", "supWDx****") or { "n" : 0, "connectionId" : 4, "err" : null, "ok" : 1 } db.createUser({user:"****",pwd:"***********",roles:["root"]}) { "user" : "****", "readOnly" : false, "pwd" : "**************","_id" ObjectId("4f2bc0d357a309043c6947a4") } # Simpan akun administrator di koleksi system.users. db.getCollectionNames() [ "system.indexes", "system.users", "system.version" ]Akun administrator yang dibuat disimpan di koleksi system.users.
CatatanHindari menggunakan nama pengguna umum. Gunakan kata sandi yang kompleks dengan minimal delapan karakter, mencakup huruf besar, huruf kecil, angka, dan karakter khusus.
Verifikasi bahwa akun administrator telah dibuat.
Jalankan perintah berikut. Jika 1 dikembalikan, akun administrator telah berhasil dibuat.
db.auth("su****","supWDx****") 1Hentikan proses MongoDB dan mulai ulang layanan MongoDB.
db.auth("su****","supWDx****") exit byeJalankan perintah berikut untuk mengaktifkan autentikasi pengguna.
Setelah autentikasi pengguna diaktifkan, pengguna yang tidak masuk ke database MongoDB tidak dapat melakukan operasi apa pun.
mongod --dbpath=/path/mongodb --bind_ip=10.0.0.1 --port=27028 --fork=true logpath=/path/mongod.log --auth&
CatatanPengguna yang disimpan di koleksi admin.system.users memiliki izin superuser, sedangkan pengguna yang dibuat di database lain tidak. Pengguna yang dibuat di database admin dapat melakukan operasi pada data di database lain dalam sistem MongoDB saat ini.
Dalam sistem MongoDB, database dibuat oleh superuser. Database dapat menyimpan beberapa pengguna, tetapi satu pengguna hanya dapat disimpan di satu database. Pengguna di database yang berbeda dapat berbagi nama yang sama.
Sebagai contoh, User1 yang disimpan di DB1 tidak dapat mengakses DB2 tetapi dapat mengakses data yang dibuat oleh pengguna lain di DB1.
Pengguna yang berbagi nama yang sama di database yang berbeda hanya dapat masuk ke satu database. Sebagai contoh, jika User1 ada di DB1 dan DB2 dan masuk ke DB1, User1 tidak dapat masuk ke DB2.
Pengguna yang dibuat di database admin memiliki izin superuser dan dapat melakukan operasi pada data di semua database dalam sistem MongoDB saat ini.
Gunakan metode db.auth() untuk mengotentikasi pengguna di database. Jika otentikasi berhasil, nilai 1 dikembalikan. Jika tidak, nilai 0 dikembalikan. Metode db.auth() hanya dapat mengotentikasi pengguna di database tempat pengguna logon saat ini.
Periksa intrusi
Jika Anda adalah administrator database MongoDB, Anda dapat mengambil langkah-langkah berikut untuk memeriksa intrusi:
Periksa apakah log MongoDB lengkap. Kemudian, periksa alamat IP pengguna yang menghapus database dan waktu ketika database dihapus.
Jalankan perintah db.system.users.find() untuk memeriksa apakah kata sandi dikonfigurasi untuk setiap akun MongoDB.
Jalankan perintah db.fs.files.find() untuk memeriksa apakah pengguna lain menyimpan file menggunakan GridFS.
Jalankan perintah show log global untuk melihat file log. Kemudian, periksa apakah pengguna lain mengakses database MongoDB.