Panduan penting untuk keamanan MongoDB

David Murphy menjabat sebagai manajer praktik untuk MongoDB di Percona, penyedia solusi dan layanan MySQL dan MongoDB kelas perusahaan.

Keamanan MongoDB kembali menjadi berita. Serentetan cerita baru-baru ini mengungkapkan bagaimana peretas telah merebut database MongoDB dan menebus data untuk bitcoin. Puluhan ribu instalasi MongoDB telah disusupi, menurut Rapid7.

Kita semua khawatir tentang keamanan. Jika Anda menjalankan aplikasi, jaringan, atau database, keamanan selalu menjadi masalah utama. Dengan semakin banyaknya perusahaan yang beralih ke perangkat lunak sumber terbuka seperti MongoDB untuk menyimpan data penting perusahaan, keamanan menjadi pertanyaan yang semakin besar. Bergantung pada bisnis Anda, Anda mungkin juga memiliki beberapa standar peraturan keamanan jaringan pemerintah (seperti Health Insurance Portability and Accountability Act, atau HIPAA) atau bisnis (Payment Card Industry Data Security Standard, atau PCI DSS) yang harus Anda patuhi.

Apakah perangkat lunak database MongoDB aman? Apakah itu memenuhi standar ini? Jawaban singkatnya: Ya, dan ya! Ini hanya masalah mengetahui cara mengatur, mengkonfigurasi, dan bekerja dengan instalasi khusus Anda.

Pada artikel ini, saya akan membahas keamanan MongoDB. MongoDB aman digunakan - jika Anda tahu apa yang harus dicari dan cara mengkonfigurasinya.

Pertama-tama, bagaimana kesalahan orang dengan keamanan MongoDB? Ada beberapa area utama yang membuat pengguna tersandung dalam hal keamanan MongoDB:

  • Menggunakan port default
  • Tidak segera mengaktifkan otentikasi (masalah terbesar!)
  • Saat menggunakan otentikasi, memberi semua orang akses yang luas
  • Tidak menggunakan LDAP untuk memaksa rotasi kata sandi
  • Tidak memaksa penggunaan SSL pada database
  • Tidak membatasi akses database ke perangkat jaringan yang dikenal (host aplikasi, penyeimbang beban, dan sebagainya)
  • Tidak membatasi jaringan mana yang mendengarkan (namun ini tidak lagi memengaruhi versi yang didukung)

MongoDB memiliki lima area keamanan inti:

  • Autentikasi. Autentikasi LDAP memusatkan item di direktori perusahaan Anda.
  • Otorisasi. Otorisasi menentukan kontrol akses berbasis peran apa yang disediakan database.
  • Enkripsi. Enkripsi dapat dipecah menjadi At-Rest dan In-Transit. Enkripsi sangat penting untuk mengamankan MongoDB.
  • Mengaudit. Auditing mengacu pada kemampuan untuk melihat siapa melakukan apa di database.
  • Tata Kelola. Tata kelola mengacu pada validasi dokumen dan pemeriksaan data sensitif (seperti nomor rekening, kata sandi, nomor Jaminan Sosial, atau tanggal lahir). Ini mengacu pada mengetahui di mana data sensitif disimpan dan mencegah data sensitif dimasukkan ke dalam sistem.

Otentikasi LDAP

MongoDB memiliki peran pengguna bawaan dan menonaktifkannya secara default. Namun, ia melewatkan item seperti kerumitan sandi, rotasi berbasis usia, dan sentralisasi serta identifikasi peran pengguna versus fungsi layanan. Ini penting untuk melewati peraturan seperti kepatuhan PCI DSS. Misalnya, PCI DSS melarang penggunaan kata sandi lama dan kata sandi yang mudah dibobol dan memerlukan perubahan pada akses pengguna setiap kali status berubah (misalnya, ketika pengguna meninggalkan departemen atau perusahaan).

Untungnya, LDAP dapat digunakan untuk mengisi banyak celah ini. Banyak konektor memungkinkan penggunaan sistem Windows Active Directory (AD) untuk berkomunikasi dengan LDAP.

Catatan: Dukungan LDAP hanya tersedia di MongoDB Enterprise. Ini tidak ada dalam versi Komunitas. Ini tersedia di versi open source lain dari MongoDB seperti Server Percona untuk MongoDB. 

MongoDB 3.2 menyimpan pengguna di LDAP, tetapi bukan peran (ini saat ini disimpan di masing-masing mesin). MongoDB 3.4 Perusahaan harus memperkenalkan kemampuan untuk menyimpan peran di LDAP untuk akses terpusat. (Kami akan membahas peran nanti.)

Percona

Memanfaatkan LDAP dan AD, Anda dapat mengikat pengguna dengan direktori perusahaan Anda. Saat mereka berganti peran atau keluar dari perusahaan, mereka dapat dihapus oleh sumber daya manusia dari grup database Anda. Dengan demikian, Anda memiliki sistem otomatis untuk memastikan hanya mereka yang ingin mengakses data secara manual yang dapat melakukannya, tanpa sengaja melewatkan sesuatu.

LDAP di Mongo sebenarnya mudah. MongoDB memiliki perintah khusus untuk menceritakannya untuk memeriksa database LDAP eksternal: $external.

Beberapa peringatan lain untuk menggunakan LDAP:

  • Buat pengguna .createUserseperti biasa, tetapi pastikan untuk menggunakan tag sumber daya db / collection.
  • Selain itu, otentikasi LDAP memerlukan dua bidang lagi:
    • mekanisme: “PLAIN”
    • digestPassword: false

Peran khusus

Kontrol akses berbasis peran (RBAC) adalah inti dari MongoDB. Peran bawaan telah tersedia di MongoDB sejak versi 2.6. Anda bahkan dapat membuat sendiri, hingga tindakan tertentu yang mungkin diizinkan untuk dilakukan oleh pengguna tertentu. Ini memungkinkan Anda untuk menentukan apa yang dapat dilakukan atau dilihat oleh pengguna tertentu dengan tepat. Ini adalah fitur inti MongoDB yang tersedia di hampir setiap versi vendor perangkat lunak sumber terbuka.

Lima peran utama MongoDB bawaan yang harus Anda ketahui:

  • read:
    • Akses hanya baca, biasanya diberikan kepada sebagian besar pengguna
  • readWrite:
    • readWrite akses memungkinkan pengeditan data
    • readWrite termasuk membaca
  • dbOwner:
    • Termasuk readWrite, dbAdmin, userAdmin(untuk database). userAdminberarti menambahkan atau menghapus pengguna, memberikan hak istimewa kepada pengguna, dan membuat peran. Hak istimewa ini hanya diberikan ke server database tertentu.
  • dbAdminAnyDatabase:
    • Membuat dbAdmindi semua database, tetapi tidak mengizinkan administrasi pengguna (untuk membuat atau menghapus pengguna, misalnya). Anda dapat membuat indeks, pemadatan panggilan, dan lainnya. Ini tidak memberikan akses sharding.
  • root:
    • Ini adalah pengguna super, tetapi dengan batasan
    • Itu dapat melakukan banyak hal, tetapi tidak semua:
      • Tidak dapat mengubah koleksi sistem
      • Beberapa perintah masih belum tersedia untuk peran ini, bergantung pada versinya. Misalnya, peran root MongoDB 3.2 tidak mengizinkan Anda mengubah ukuran oplog atau profiler, dan peran root MongoDB 3.4 tidak mengizinkan Anda membaca tampilan saat ini.

Database dan koleksi karakter pengganti

Karakter pengganti berarti memberikan izin ke kumpulan besar database atau koleksi (atau semuanya) di server. Dengan nilai null, Anda dapat menentukan semua database atau koleksi dan menghindari dbAdminAnyDatabaseperan tersebut. Hal ini memungkinkan pengguna tertentu memiliki semua hak istimewa, termasuk fungsi administrasi.

Ini berbahaya.

Saat Anda menggunakan wildcard, Anda memberikan banyak hak istimewa, dan Anda harus sadar bahwa Anda membuka kemungkinan serangan:

  • readWriteAnyDatabaseadalah sangat luas dan mengekspos nama pengguna dan peran untuk serangan potensial melalui pengguna aplikasi
  • Menggunakan wildcard berarti Anda tidak akan membatasi aplikasi tertentu ke database tertentu
  • Karakter pengganti mencegah Anda menggunakan multitenancy dengan banyak database
  • Database baru tidak secara otomatis diberikan akses

Membuat peran khusus

Kekuatan peran MongoDB berasal dari pembuatan peran khusus. Dalam peran khusus, Anda dapat menentukan bahwa tindakan apa pun pada sumber daya apa pun dapat ditentukan untuk pengguna tertentu. Dengan tingkat perincian ini, Anda dapat sepenuhnya mengontrol siapa yang dapat melakukan apa di lingkungan MongoDB Anda.

Saat membahas tentang menentukan peran khusus, ada empat jenis sumber daya yang berbeda:

  • db. Menentukan database. Anda dapat menggunakan string untuk nama, atau "" untuk "apa saja" (tanpa karakter pengganti).
  • collection. Menentukan kumpulan dokumen. Anda dapat menggunakan string untuk nama atau "" untuk "apa saja" (tanpa karakter pengganti).
  • cluster. Menentukan cluster dengan sharded atau resource metadata lainnya. Ini adalah nilai Boolean true / false.
  • anyResource. Menentukan akses ke apa pun, di mana pun. Ini adalah nilai Boolean true / false.

Peran apa pun dapat mewarisi properti dari peran lain. Ada sebuah array yang disebut "peran", dan Anda dapat melepaskan peran baru dalam array tersebut. Ini akan mewarisi properti dari peran yang ditentukan.

Gunakan createRoleuntuk menambahkan peran ke larik.

Anda dapat menambahkan database baru atau yang sudah ada ke pengguna atau peran. Misalnya, Anda bisa menambahkan akses baca dan tulis ke database dengan menambahkan database ke peran.

Gunakan grantPrivilegesToRoleperintah untuk menambahkan sumber daya baru ke peran yang sudah ada.

Di bawah ini adalah contoh pembuatan peran Pengguna super baru. Tujuan dari peran ini, sekali lagi, adalah untuk memiliki satu pengguna yang sama sekali tidak dibatasi di lingkungan MongoDB (untuk situasi darurat).

db = db.geSiblingDB(“admin”);

db.createRole({     

     role: “superRoot”,     

     privileges:[{          

          resource: {anyResource:true},          

          actions: [‘anyAction’]     

     }]     

     roles:[]

});

db.createUser({     

     user: “comanyDBA”,     

     pwd: “EWqeeFpUt9*8zq”,     

     roles: [“superRoot”]

})

Perintah ini membuat peran baru pada database yang geSiblingDBdipanggil superRootdan menetapkan peran itu sumber daya dan tindakan apa pun. Kemudian kami membuat pengguna baru di database yang sama yang disebut companyDBA(dengan kata sandi) dan menetapkannya superRootperan baru .

Menggunakan SSL untuk semua hal

SSL membantu memastikan keamanan data Anda melalui jaringan yang tidak aman. Jika Anda menggunakan database yang berinteraksi dengan internet, Anda harus menggunakan SSL.

Ada dua alasan yang sangat bagus untuk menggunakan SSL untuk mengamankan MongoDB: privasi dan otentikasi. Tanpa SSL, data Anda dapat diakses, disalin, dan digunakan untuk tujuan ilegal atau berbahaya. Dengan otentikasi, Anda memiliki tingkat keamanan sekunder. Infrastruktur kunci pribadi (PKI) SSL menjamin bahwa hanya pengguna dengan sertifikat CA yang benar yang dapat mengakses MongoDB.

MongoDB telah memiliki dukungan SSL untuk waktu yang lama, tetapi telah meningkatkan dukungan SSL secara dramatis dalam beberapa versi terakhir. Sebelumnya, jika Anda ingin menggunakan SSL, Anda harus mendownload dan mengkompilasinya secara manual dengan versi Komunitas MongoDB. Pada MongoDB 3.0, SSL dikompilasi dengan perangkat lunak secara default. 

Versi lama MongoDB juga tidak memiliki pemeriksaan host yang valid; validasi host hanyalah sebuah tanda yang dapat Anda periksa di file konfigurasi yang memenuhi permintaan SSL dari sebuah koneksi.

Versi terbaru SSL di MongoDB mencakup fitur-fitur utama berikut:

  • Memeriksa host yang valid (opsional)
  • Kemampuan untuk mengarahkan ke file .key penyiapan tertentu untuk digunakan
  • Otoritas Sertifikat Khusus (CA) untuk sertifikat yang ditandatangani sendiri atau penandatangan alternatif
  • allowSSL, preferSSL, requireSSLMode, yang memungkinkan Anda untuk memilih rincian untuk digunakan SSL Anda (dari kurang aman untuk lebih aman)

SSL: Menggunakan CA khusus

Versi SSL yang lebih baru di MongoDB memungkinkan Anda menggunakan CA khusus. Meskipun ini memberi Anda fleksibilitas dalam menentukan bagaimana Anda ingin bekerja dengan SSL, ini disertai dengan peringatan. Jika Anda hanya mencoba mengamankan koneksi, Anda mungkin tergoda untuk memilih sslAllowInvalidCertficates. Namun, ini umumnya ide yang buruk karena beberapa alasan:

  • Mengizinkan koneksi apa pun dari kedaluwarsa hingga sertifikat yang dicabut
  • Anda tidak memastikan pembatasan pada nama host tertentu
  • Anda tidak seaman yang Anda kira

Untuk memperbaiki ini, hanya mengatur net.ssl.CAFile, dan MongoDB akan menggunakan kedua kunci dan berkas CA (Anda harus melakukan ini pada klien).

Namun, menggunakan SSL memiliki kelemahan yang diketahui: kinerja. Anda pasti akan kehilangan beberapa performa saat menggunakan SSL.

Enkripsi disk

Data bisa "dalam perjalanan" atau "diam". Anda dapat mengenkripsi salah satu atau keduanya di MongoDB. Kami telah membahas enkripsi data saat transit (SSL). Sekarang mari kita lihat data diam.

Data at-rest adalah data yang disimpan pada disk. Enkripsi data saat istirahat biasanya mengacu pada data yang disimpan ke lokasi penyimpanan terenkripsi. Ini untuk mencegah pencurian dengan cara fisik dan membuat cadangan yang disimpan dengan cara yang tidak mudah dibaca oleh pihak ketiga mana pun. Ada batasan praktis untuk ini. Yang terbesar adalah mempercayai administrator sistem Anda - dan dengan asumsi peretas belum memperoleh akses administratif ke sistem.

Ini bukan masalah khusus MongoDB. Tindakan pencegahan yang digunakan dalam sistem lain juga berfungsi di sini. Mereka mungkin menyertakan alat enkripsi seperti LUKS dan cryptfs atau bahkan metode yang lebih aman seperti menandatangani kunci enkripsi dengan LDAP, kartu pintar, dan token jenis RSA.

Saat melakukan tingkat enkripsi ini, Anda perlu mempertimbangkan faktor-faktor seperti pemasangan otomatis dan dekripsi drive. Tapi ini bukan hal baru bagi administrator sistem Anda. Mereka dapat mengelola persyaratan ini dengan cara yang sama seperti mereka mengelolanya di bagian lain jaringan. Manfaat tambahannya adalah prosedur tunggal untuk enkripsi penyimpanan, bukan satu per teknologi apa pun yang digunakan fungsi tertentu.

Enkripsi data saat istirahat dapat diselesaikan dengan salah satu atau semua hal berikut:

  • Enkripsi seluruh volume
  • Enkripsi hanya file database
  • Enkripsi dalam aplikasi

Item pertama dapat diselesaikan dengan enkripsi disk pada sistem file. Mudah diatur menggunakan LUKS dan dm-crypt. Hanya opsi pertama dan kedua yang diperlukan untuk kepatuhan PCI DSS dan persyaratan sertifikasi lainnya.

Mengaudit

Inti dari setiap desain keamanan yang baik adalah mampu melacak pengguna mana yang melakukan tindakan apa dalam database (mirip dengan bagaimana Anda harus mengontrol server Anda yang sebenarnya). Auditing memungkinkan Anda untuk memfilter output dari pengguna, database, koleksi, atau lokasi sumber tertentu. Ini menghasilkan log untuk meninjau setiap insiden keamanan. Lebih penting lagi, ini menunjukkan setiap auditor keamanan bahwa Anda telah mengambil langkah-langkah yang benar untuk melindungi database Anda dari intrusi dan untuk memahami kedalaman intrusi jika terjadi.

Audit memungkinkan Anda untuk melacak sepenuhnya tindakan penyusup di lingkungan Anda.

Catatan: Pengauditan hanya tersedia di MongoDB Enterprise. Ini tidak ada dalam versi Komunitas. Ini tersedia di beberapa versi open source lain dari MongoDB seperti Server Percona untuk MongoDB.