Panduan penting untuk keselamatan MongoDB

David Murphy berperanan sebagai pengurus praktik untuk MongoDB di Percona, penyedia penyelesaian dan perkhidmatan MySQL dan MongoDB kelas perusahaan.

Keselamatan MongoDB ada dalam berita lagi. Beberapa kisah baru-baru ini mengungkapkan bagaimana penggodam telah merebut pangkalan data MongoDB dan menggeledah data untuk bitcoin. Puluhan ribu pemasangan MongoDB telah dikompromikan, menurut Rapid7.

Kita semua bimbangkan keselamatan. Sekiranya anda menjalankan aplikasi, rangkaian, atau pangkalan data, keselamatan selalu menjadi isu utama. Dengan lebih banyak syarikat beralih kepada perisian sumber terbuka seperti MongoDB untuk menyimpan data perusahaan penting, keselamatan menjadi persoalan yang lebih besar. Bergantung pada perniagaan anda, anda mungkin juga mempunyai banyak kerajaan (seperti Akta Kemudahtanggungjawaban dan Kebertanggungjawaban Insurans Kesihatan, atau HIPAA) atau perniagaan (Standard Keselamatan Data Industri Kad Pembayaran, atau PCI DSS) piawaian keselamatan rangkaian yang harus anda patuhi.

Adakah perisian pangkalan data MongoDB selamat? Adakah ia memenuhi piawaian ini? Jawapan ringkas: Ya, dan ya! Ini hanya masalah mengetahui bagaimana mengatur, mengkonfigurasi, dan bekerja dengan pemasangan tertentu anda.

Dalam artikel ini, saya akan membahas keselamatan MongoDB. MongoDB selamat digunakan - jika anda tahu apa yang harus dicari dan bagaimana mengkonfigurasinya.

Pertama sekali, bagaimana orang salah dengan keselamatan MongoDB? Terdapat beberapa bidang utama yang menjangkiti pengguna dalam hal keselamatan MongoDB:

  • Menggunakan port lalai
  • Tidak mengaktifkan pengesahan dengan segera (masalah terbesar!)
  • Semasa menggunakan pengesahan, memberi semua orang akses yang luas
  • Tidak menggunakan LDAP untuk memaksa putaran kata laluan
  • Tidak memaksa penggunaan SSL pada pangkalan data
  • Tidak mengehadkan akses pangkalan data ke peranti rangkaian yang diketahui (host aplikasi, pengimbang beban, dan sebagainya)
  • Tidak mengehadkan rangkaian mana yang mendengar (namun ini tidak lagi mempengaruhi versi yang disokong)

MongoDB mempunyai lima bidang keselamatan utama:

  • Pengesahan. Pengesahan LDAP memusatkan item dalam direktori syarikat anda.
  • Kebenaran. Keizinan menentukan kawalan akses berdasarkan peranan yang disediakan oleh pangkalan data.
  • Penyulitan. Enkripsi boleh dipecah menjadi At-Rest dan In-Transit. Penyulitan sangat penting untuk menjamin MongoDB.
  • Pengauditan. Pengauditan merujuk kepada kemampuan untuk melihat siapa yang melakukan apa dalam pangkalan data.
  • Pemerintahan. Tadbir urus merujuk kepada pengesahan dokumen dan memeriksa data sensitif (seperti nombor akaun, kata laluan, nombor Jaminan Sosial, atau tarikh lahir). Ini merujuk kepada kedua-duanya mengetahui di mana data sensitif disimpan dan mencegah data sensitif dimasukkan ke dalam sistem.

Pengesahan LDAP

MongoDB mempunyai peranan pengguna terbina dalam dan mematikannya secara lalai. Walau bagaimanapun, ia kehilangan item seperti kerumitan kata laluan, putaran berdasarkan usia, dan pemusatan dan pengenalan peranan pengguna berbanding fungsi perkhidmatan. Ini penting untuk meluluskan peraturan seperti pematuhan PCI DSS. Sebagai contoh, PCI DSS melarang penggunaan kata laluan lama dan kata laluan yang mudah rosak dan memerlukan perubahan pada akses pengguna setiap kali status berubah (contohnya, ketika pengguna meninggalkan jabatan atau syarikat).

Syukurlah, LDAP dapat digunakan untuk mengisi banyak jurang ini. Banyak penyambung membenarkan penggunaan sistem Direktori Aktif Windows (AD) untuk bercakap dengan LDAP.

Catatan: Sokongan LDAP hanya tersedia di MongoDB Enterprise. Ini bukan dalam versi Komuniti. Ia tersedia dalam versi sumber terbuka lain dari MongoDB seperti Percona Server untuk MongoDB. 

MongoDB 3.2 menyimpan pengguna dalam LDAP, tetapi bukan peranan (ini disimpan pada mesin individu). MongoDB 3.4 Enterprise harus memperkenalkan kemampuan untuk menyimpan peranan dalam LDAP untuk akses terpusat. (Kami akan membincangkan peranan kemudian.)

Percona

Dengan menggunakan LDAP dan AD, anda dapat menghubungkan pengguna dengan direktori syarikat anda. Apabila mereka menukar peranan atau meninggalkan syarikat, mereka dapat dikeluarkan oleh sumber manusia dari kumpulan pangkalan data anda. Oleh itu, anda mempunyai sistem automatik untuk memastikan hanya mereka yang ingin mengakses data secara manual yang boleh melakukannya, tanpa kehilangan sesuatu secara tidak sengaja.

LDAP di Mongo sebenarnya mudah. MongoDB mempunyai arahan khas beritahu kepada memeriksa pangkalan data LDAP luar: $external.

Beberapa peringatan lain untuk menggunakan LDAP:

  • Buat pengguna dengan .createUserseperti biasa, tetapi pastikan untuk menggunakan tag sumber db / koleksi.
  • Di samping itu, pengesahan LDAP memerlukan dua bidang lagi:
    • mekanisme: "PLAIN"
    • digestPassword: salah

Peranan tersuai

Kawalan akses berasaskan peranan (RBAC) adalah teras kepada MongoDB. Peranan terbina dalam telah tersedia di MongoDB sejak versi 2.6. Anda juga boleh membuat sendiri, hingga tindakan tertentu yang mungkin dibenarkan oleh pengguna tertentu. Ini membolehkan anda menentukan apa yang boleh dilakukan atau dilihat oleh pengguna tertentu dengan ketepatan pisau cukur. Ini adalah ciri utama MongoDB yang terdapat di hampir setiap versi perisian sumber terbuka.

Lima peranan utama MongoDB yang mesti anda ketahui:

  • read:
    • Akses baca sahaja, biasanya diberikan kepada kebanyakan pengguna
  • readWrite:
    • readWrite akses membolehkan mengedit data
    • readWrite merangkumi membaca
  • dbOwner:
    • Termasuk readWrite, dbAdmin, userAdmin(untuk pangkalan data). userAdminbermaksud menambah atau membuang pengguna, memberi hak istimewa kepada pengguna, dan membuat peranan. Keistimewaan ini hanya diberikan kepada pelayan pangkalan data tertentu.
  • dbAdminAnyDatabase:
    • Membuat dbAdmindi semua pangkalan data, tetapi tidak membenarkan pentadbiran pengguna (misalnya untuk membuat atau membuang pengguna). Anda boleh membuat indeks, pemadatan panggilan dan banyak lagi. Ini tidak memberikan akses yang sukar.
  • root:
    • Ini adalah superuser, tetapi mempunyai had
    • Ia boleh melakukan banyak perkara, tetapi tidak semua:
      • Tidak dapat menukar koleksi sistem
      • Beberapa arahan masih belum tersedia untuk peranan ini, bergantung pada versi. Sebagai contoh, peranan root MongoDB 3.2 tidak membenarkan anda menukar ukuran oplog atau profiler, dan peranan root MongoDB 3.4 tidak membenarkan anda membaca paparan semasa.

Pangkalan data dan koleksi wildcarding

Wildcarding bermaksud memberi kebenaran kepada kumpulan pangkalan data atau koleksi besar (atau semuanya) pada pelayan. Dengan nilai nol, anda boleh menentukan semua pangkalan data atau koleksi dan mengelakkan dbAdminAnyDatabaseperanannya. Ini membolehkan pengguna tertentu memiliki semua hak istimewa, termasuk fungsi pentadbiran.

Ini berbahaya.

Apabila anda menggunakan wildcard, anda memberikan banyak keistimewaan, dan anda harus sedar bahawa anda membuka jalan penyerang yang mungkin:

  • readWriteAnyDatabaseadalah amat luas dan mendedahkan nama pengguna dan peranan kepada serangan yang berpotensi melalui pengguna permohonan
  • Menggunakan wildcard bermaksud anda tidak akan menghadkan aplikasi tertentu ke pangkalan data tertentu
  • Wildcarding menghalang anda menggunakan multitenancy dengan pelbagai pangkalan data
  • Pangkalan data baru tidak diberi akses secara automatik

Membuat peranan tersuai

Kekuatan peranan MongoDB berasal dari membuat peranan khusus. Dalam peranan khusus, anda dapat menentukan bahawa tindakan apa pun pada sumber apa pun dapat ditentukan untuk pengguna tertentu. Dengan tahap perincian ini, anda dapat mengawal siapa yang dapat melakukan apa yang berlaku di persekitaran MongoDB anda.

Untuk menentukan peranan khusus, terdapat empat jenis sumber:

  • db. Menentukan pangkalan data. Anda boleh menggunakan rentetan untuk nama, atau "" untuk "any" (tanpa wildcarding).
  • collection. Menentukan koleksi dokumen. Anda boleh menggunakan rentetan untuk nama atau "" untuk "any" (tanpa wildcarding).
  • cluster. Menentukan kluster terlindung atau sumber metadata lain. Ini adalah nilai Boolean yang benar / salah.
  • anyResource. Menentukan akses ke apa sahaja, di mana sahaja. Ini adalah nilai Boolean yang benar / salah.

Apa-apa peranan boleh mewarisi sifat peranan lain. Terdapat array yang disebut "role", dan anda boleh melepaskan peranan baru dalam array. Ia akan mewarisi sifat peranan yang ditentukan.

Gunakan createRoleuntuk menambahkan peranan pada tatasusunan.

Anda boleh menambahkan pangkalan data baru atau sedia ada kepada pengguna atau peranan. Sebagai contoh, anda boleh menambahkan akses membaca dan menulis ke pangkalan data dengan menambahkan pangkalan data ke peranan.

Gunakan grantPrivilegesToRolearahan untuk menambahkan sumber baru ke peranan yang ada.

Berikut adalah contoh membuat peranan pengguna Super baru. Tujuan peranan ini, sekali lagi, adalah untuk memiliki satu pengguna yang sama sekali tidak dibatasi dalam persekitaran MongoDB (untuk situasi kecemasan).

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-perintah ini membuat peranan baru pada pangkalan data yang geSiblingDBdisebut superRootdan menetapkan peranan itu sebagai sumber dan tindakan apa pun. Kemudian kami membuat pengguna baru di pangkalan data yang sama yang disebut companyDBA(dengan kata laluan) dan memberikannya superRootperanan baru .

Menggunakan SSL untuk semua perkara

SSL membantu memastikan keselamatan data anda melalui rangkaian yang tidak terjamin. Sekiranya anda menggunakan pangkalan data yang berinteraksi dengan internet, anda harus menggunakan SSL.

Terdapat dua sebab yang sangat baik untuk menggunakan SSL untuk menjamin MongoDB: privasi dan pengesahan. Tanpa SSL, data anda dapat diakses, disalin, dan digunakan untuk tujuan haram atau berbahaya. Dengan pengesahan, anda mempunyai tahap keselamatan sekunder. Infrastruktur kunci peribadi SSL (PKI) menjamin bahawa hanya pengguna dengan sijil CA yang betul dapat mengakses MongoDB.

MongoDB telah lama mendapat sokongan SSL, tetapi telah meningkatkan sokongan SSL secara dramatik dalam beberapa versi terakhir. Sebelum ini, jika anda ingin menggunakan SSL, anda harus memuat turunnya dan menyusunnya secara manual dengan versi Komuniti MongoDB. Pada MongoDB 3.0, SSL disusun dengan perisian secara lalai. 

Versi lama MongoDB juga kekurangan pemeriksaan host yang sah; pengesahan host hanyalah bendera yang boleh anda periksa dalam fail konfigurasi yang memenuhi permintaan SSL dari sambungan.

Versi SSL terkini di MongoDB merangkumi ciri utama berikut:

  • Pemeriksaan untuk hos yang sah (pilihan)
  • Keupayaan untuk menunjuk ke fail .key penyediaan tertentu untuk digunakan
  • Custom Certificate Authority (CA) untuk sijil yang ditandatangani sendiri atau penandatangan alternatif
  • allowSSL, preferSSL, requireSSLMod, yang membolehkan anda untuk memilih butiran untuk kegunaan SSL anda (dari kurang selamat kepada lebih selamat)

SSL: Menggunakan CA tersuai

Versi SSL yang lebih baru di MongoDB membolehkan anda menggunakan CA tersuai. Walaupun ini memberi anda fleksibiliti dalam menentukan bagaimana anda ingin bekerjasama dengan SSL, ia dilengkapi dengan peringatan. Sekiranya anda hanya berusaha mendapatkan sambungan, anda mungkin tergoda untuk memilihnya sslAllowInvalidCertficates. Walau bagaimanapun, ini adalah idea yang tidak baik kerana beberapa sebab:

  • Membolehkan sebarang sambungan dari sijil yang tamat tempoh hingga dicabut
  • Anda tidak memastikan sekatan pada nama host tertentu
  • Anda hampir tidak selamat seperti yang anda fikirkan

Untuk memperbaikinya, cukup tetapkan net.ssl.CAFile, dan MongoDB akan menggunakan kedua - dua kunci dan fail CA (anda mesti melakukan ini pada klien).

Namun, menggunakan SSL mempunyai kelemahan: prestasi. Anda pasti akan kehilangan sedikit prestasi semasa menggunakan SSL.

Penyulitan cakera

Data sama ada "dalam perjalanan" atau "dalam keadaan rehat". Anda boleh menyulitkan salah satu atau kedua-duanya di MongoDB. Kami telah membincangkan penyulitan data dalam perjalanan (SSL). Sekarang mari kita lihat data pada waktu rehat.

Data rehat adalah data yang disimpan pada cakera. Penyulitan data pada waktu rehat biasanya merujuk pada data yang disimpan ke lokasi penyimpanan yang dienkripsi. Ini untuk mengelakkan pencurian dengan cara fizikal dan membuat sandaran yang disimpan dengan cara yang tidak mudah dibaca oleh pihak ketiga. Terdapat had praktikal untuk ini. Yang terbesar adalah mempercayai pentadbir sistem anda - dan menganggap penggodam belum memperoleh akses pentadbiran ke sistem.

Ini bukan masalah yang unik untuk MongoDB. Langkah pencegahan yang digunakan dalam sistem lain juga berfungsi di sini. Mereka mungkin merangkumi alat penyulitan seperti LUKS dan cryptfs atau kaedah yang lebih selamat seperti menandatangani kunci penyulitan dengan LDAP, kad pintar, dan token jenis RSA.

Semasa melakukan enkripsi tahap ini, anda perlu mempertimbangkan faktor-faktor seperti penghilangan automatik dan penyahsulitan drive. Tetapi ini bukan perkara baru bagi pentadbir sistem anda. Mereka dapat menguruskan keperluan ini dengan cara yang sama seperti yang mereka jalankan di bahagian lain dari rangkaian. Manfaat tambahan adalah satu prosedur untuk penyulitan penyimpanan, bukan satu dari apa sahaja teknologi yang digunakan oleh fungsi tertentu.

Penyulitan data semasa rehat dapat diselesaikan dengan salah satu atau semua perkara berikut:

  • Enkripsi keseluruhan kelantangan
  • Enkripsi hanya fail pangkalan data
  • Enkripsi dalam aplikasi

Item pertama dapat diselesaikan dengan enkripsi cakera pada sistem fail. Ia mudah disediakan menggunakan LUKS dan dm-crypt. Hanya pilihan pertama dan kedua yang diperlukan untuk pematuhan PCI DSS dan syarat pensijilan lain.

Pengauditan

Pusat reka bentuk keselamatan yang baik adalah dapat mengesan pengguna mana yang melakukan tindakan dalam pangkalan data (serupa dengan bagaimana anda harus mengendalikan pelayan anda yang sebenarnya). Pengauditan membolehkan anda menyaring output pengguna, pangkalan data, koleksi, atau lokasi sumber tertentu. Ini menghasilkan log untuk meninjau sebarang kejadian keselamatan. Lebih penting lagi, ini menunjukkan kepada mana-mana juruaudit keselamatan bahawa anda telah mengambil langkah yang betul untuk melindungi pangkalan data anda dari pencerobohan dan untuk memahami kedalaman pencerobohan sekiranya berlaku.

Pengauditan membolehkan anda mengesan sepenuhnya tindakan penceroboh di persekitaran anda.

Catatan: Pengauditan hanya tersedia di MongoDB Enterprise. Ini bukan dalam versi Komuniti. Ia tersedia dalam beberapa versi sumber terbuka lain dari MongoDB seperti Percona Server untuk MongoDB.