MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Bagaimana mengelola pengguna dan otentikasi di MongoDB


Pengantar

Mengelola pengguna dan otentikasi adalah beberapa tugas administrasi terpenting dalam mengelola server MongoDB. Anda harus memastikan bahwa server dikonfigurasi untuk dapat mengidentifikasi pengguna dan aplikasi Anda dengan benar dan menolak koneksi atau operasi yang tidak dapat diautentikasi dengan benar.

Untuk mengelola persyaratan ini, Anda harus dapat memutuskan pengguna mana yang dibutuhkan server Anda dan membuat akun tersebut. Sebagai bagian dari proses ini, Anda dapat menyetel detail autentikasi untuk mengizinkan akses eksternal menggunakan identitas baru.

Dalam panduan ini, kita akan membahas cara membuat, melihat, dan menghapus akun pengguna. Kami akan membahas cara menyiapkan autentikasi untuk akun Anda dan cara memperbarui kredensial saat Anda perlu mengubah kata sandi pengguna.



Prasyarat

Untuk mengikuti panduan ini, Anda memerlukan akun di server MongoDB dengan hak istimewa yang sesuai.


Perintah dan metode yang akan kita gunakan

Untuk membuat, memodifikasi, dan menghapus pengguna dalam MongoDB dan mengonfigurasi otentikasi, metode inti yang Anda butuhkan adalah:

  • db.createUser :buat akun pengguna MongoDB baru
  • db.updateUser :perbarui detail akun pengguna
  • db.changeUserPassword :mengubah kata sandi yang digunakan oleh akun pengguna
  • db.dropUser :menghapus akun pengguna MongoDB

Selain itu, perintah database berikut berguna untuk menemukan informasi tentang pengguna di sistem:

  • db.runCommand('usersInfo') :menampilkan informasi tentang satu atau lebih akun pengguna MongoDB


Hak istimewa yang diperlukan

Untuk menjalankan perintah di atas, Anda perlu masuk ke MongoDB dengan akun dengan sejumlah tindakan hak istimewa yang berbeda. Hak istimewa khusus yang Anda perlukan bergantung pada perintah yang perlu Anda gunakan.

Untuk mendapatkan info tentang pengguna lain, pengguna Anda saat ini harus mengaktifkan tindakan hak istimewa berikut:

  • viewUser tindakan hak istimewa

Untuk membuat pengguna baru, pengguna Anda saat ini harus mengaktifkan tindakan hak istimewa berikut:

  • createUser tindakan hak istimewa
  • grantRole tindakan hak istimewa

Untuk mengubah sandi pengguna atau detail akun, Anda mungkin memerlukan hak istimewa berikut:

  • changeOwnPassword tindakan hak istimewa untuk mengubah kata sandi akun Anda sendiri
  • changeOwnCustomData tindakan hak istimewa untuk mengubah data khusus akun Anda
  • changePassword tindakan hak istimewa untuk mengubah sandi pengguna lain
  • changeCustomData tindakan hak istimewa untuk mengubah data khusus pengguna lain

Kami tidak akan membahas manajemen peran dalam panduan ini, jadi grantRole dan revokeRole tindakan hak istimewa tidak diperlukan.

Untuk menghapus akun pengguna, pengguna Anda saat ini harus mengaktifkan tindakan hak istimewa berikut:

  • dropUser tindakan hak istimewa



Memahami bagaimana MongoDB mengimplementasikan pengguna dan otentikasi

Sebelum kita mulai membuat dan mengelola akun, sebaiknya luangkan waktu untuk membiasakan diri dengan cara MongoDB mendefinisikan dan menyimpan informasi ini.

Di MongoDB, akun pengguna adalah kombinasi dari nama pengguna akun bersama dengan basis data otentikasi tertentu. Basis data otentikasi hanyalah basis data tempat pengguna didefinisikan dan tidak menyiratkan batasan pada ruang lingkup atau hak. Basis data otentikasi adalah basis data reguler yang digunakan untuk mengelola data lain dan bukan basis data khusus dan khusus.

Nama akun pengguna harus unik dalam basis data autentikasinya. Namun, nama pengguna yang sama dapat digunakan kembali dengan basis data autentikasi yang berbeda untuk membuat akun pengguna baru yang berbeda.

Sebagai hasil dari desain ini, sebuah akun hanya dapat diidentifikasi secara akurat dengan memasukkan nama pengguna dan basis data otentikasi. Untuk mengautentikasi ke akun, seseorang juga harus dapat memberikan kredensial yang terkait dengan akun. Ini biasanya berupa kata sandi, tetapi bisa juga berupa sertifikat.



Bagaimana cara membuat pengguna?

Sekarang setelah kita melihat bagaimana MongoDB mengkonseptualisasikan akun pengguna, kita dapat mendiskusikan cara membuat pengguna baru. Ingatlah untuk masuk ke server MongoDB Anda dengan pengguna yang memiliki hak istimewa yang sesuai untuk diikuti.

Untuk membuat pengguna baru, Anda harus terlebih dahulu beralih ke database yang ingin Anda gunakan sebagai database otentikasi pengguna baru.

Pertama, Anda bisa mendapatkan daftar database yang sudah dikonfigurasi di sistem Anda dengan mengetik:

show dbs
admin   0.000GBconfig  0.000GBlocal   0.000GB

Beralih ke database pengguna akan dikaitkan dengan menggunakan use perintah:

use admin
switched to db admin

Untuk membuat pengguna baru, Anda dapat menggunakan db.createUser() metode atau Anda dapat menggunakan createUser perintah basis data. Bagaimanapun, Anda harus memberikan nama pengguna (user bidang), kata sandi (pwd bidang), dan larik peran yang harus ditambahkan pengguna (roles kunci) dalam user objek.

Untuk membuat pengguna baru bernama tom dengan kata sandi yang disetel ke hellothere dengan larik peran kosong menggunakan db.createUser() metode, Anda dapat mengetik:

db.createUser({    user: "tom",    pwd: "hellothere",    roles: []})
Successfully added user: { "user" : "tom", "roles" : [ ] }

Operasi yang sama menggunakan createUser perintah database akan terlihat seperti ini:

db.runCommand({    createUser: "tom",    pwd: "hellothere",    roles: []})
Successfully added user: { "user" : "tom", "roles" : [ ] }

Dua opsi yang berbeda sangat mirip, jadi kami hanya akan menunjukkan metode basis data jika berlaku untuk selanjutnya. Namun, jika Anda lebih menyukai sintaks perintah database, Anda dapat menemukan setiap perintah terkait dalam dokumentasi referensi perintah MongoDB.

Dalam perintah di atas, kami secara eksplisit mendefinisikan kata sandi sebaris di dalam user obyek. Untuk mencegah kata sandi dicatat dan diambil kembali, Anda dapat menggunakan passwordPrompt() sebagai alternatif metode dalam user dokumen agar MongoDB secara interaktif meminta kata sandi Anda saat perintah dijalankan. Kata sandi tidak akan terlihat, jadi riwayat perintah Anda akan bersih:

db.createUser({    user: "tom",    pwd: passwordPrompt(),    roles: []})
Enter password:Successfully added user: { "user" : "tom", "roles" : [ ] }

Ingatlah bahwa sandi akan tetap dikirim ke server dalam bentuk teks biasa jika Anda tidak mengaktifkan TLS/SSL.



Bagaimana cara menampilkan pengguna yang sudah ada?

Selanjutnya, mari kita lihat bagaimana menemukan informasi tentang pengguna yang ada.

Untuk mengembalikan beberapa pengguna, Anda dapat menggunakan db.getUsers() metode aktif untuk menampilkan semua pengguna dalam database saat ini. Pertama, alihkan ke database yang ingin Anda tanyakan:

use admin

Selanjutnya, gunakan db.getUsers() metode untuk mengembalikan semua pengguna yang terkait dengan database saat ini:

db.getUsers()
[    {            "_id" : "admin.root",            "userId" : UUID("f5ded238-19c9-4886-b649-711ec36993cb"),            "user" : "root",            "db" : "admin",            "roles" : [                    {                            "role" : "root",                            "db" : "admin"                    }            ],            "mechanisms" : [                    "SCRAM-SHA-1",                    "SCRAM-SHA-256"            ]    },    {            "_id" : "admin.tom",            "userId" : UUID("e7a0abde-a9f9-412a-bfd5-eb11fda41fd3"),            "user" : "tom",            "db" : "admin",            "roles" : [ ],            "mechanisms" : [                    "SCRAM-SHA-1",                    "SCRAM-SHA-256"            ]    }]

Untuk menampilkan informasi kredensial setiap pengguna, teruskan objek ke metode dengan showCredentials kunci ke true :

use admindb.getUsers({    showCredentials: true})
[        {                "_id" : "admin.root",                . . .                "credentials" : {                        "SCRAM-SHA-1" : {                                "iterationCount" : 10000,                                "salt" : "WpB0H4f7dG8XlCDyaVzarA==",                                "storedKey" : "b11nA1+mGo3+Tr8P//u3NEdJLHk=",                                "serverKey" : "3xE8o663hjqySrMCQcXjSxmjmhk="                        },                        "SCRAM-SHA-256" : {                                "iterationCount" : 15000,                                "salt" : "UtsfNRedf2ek5tbWFoGs2g52U0H7Na44wV4rYA==",                                "storedKey" : "mz9/qHnI79pNAIQm0MZTKZ0U3qFk0xhUDd2grvKtMdI=",                                "serverKey" : "c/sA4j+I/29Ea1y07zxoMcBgHFoYTUAa6luX3Z9sToQ="                        }                },                . . .        },        {                "_id" : "admin.tom",                . . .                "credentials" : {                        "SCRAM-SHA-1" : {                                "iterationCount" : 10000,                                "salt" : "qCbxWQSGt3QoN3S1aM5AEg==",                                "storedKey" : "hypim5+m2wqbS1gc47o2itc7jew=",                                "serverKey" : "h9myNoSvY2015yqvw3UldmJzZCg="                        },                        "SCRAM-SHA-256" : {                                "iterationCount" : 15000,                                "salt" : "lNtIVL79J8FF+uPaFfRMwPK079gfLEUrsQe3Qg==",                                "storedKey" : "u8pgn3OJiZxIwEL7ryZkoAF5bnMefQEEsZDTXNDCTRY=",                                "serverKey" : "BmmfVeikSA0DN1aZmyZP9NXi5owxGr1ZRmVX2XH8qVg="                        }                },                . . .        }]

Untuk menanyakan pengguna yang cocok dengan kriteria tertentu, Anda dapat meneruskan objek yang mendefinisikan filter kunci yang mendefinisikan kondisi pencocokan.

Misalnya, untuk mendapatkan informasi tentang semua pengguna di database saat ini yang memiliki root peran, Anda dapat mengetik:

use admindb.getUsers({    filter: {        "roles.role": "root"    }})
[        {                "_id" : "admin.root",                "userId" : UUID("f5ded238-19c9-4886-b649-711ec36993cb"),                "user" : "root",                "db" : "admin",                "roles" : [                        {                                "role" : "root",                                "db" : "admin"                        }                ],                "mechanisms" : [                        "SCRAM-SHA-1",                        "SCRAM-SHA-256"                ]        }]

Untuk mendapatkan pengguna tertentu, Anda dapat menggunakan db.getUser() metode sebagai gantinya. Ini berfungsi seperti db.getUsers() metode, tetapi mengembalikan satu pengguna. Alih-alih meneruskan objek ke metode, Anda meneruskan string yang berisi nama pengguna yang ingin Anda ambil:

use admindb.getUser("tom")
{        "_id" : "admin.tom",        "userId" : UUID("e7a0abde-a9f9-412a-bfd5-eb11fda41fd3"),        "user" : "tom",        "db" : "admin",        "roles" : [ ],        "mechanisms" : [                "SCRAM-SHA-1",                "SCRAM-SHA-256"        ]}

Anda dapat secara opsional menyertakan args tambahan objek yang memungkinkan Anda menentukan informasi tambahan yang Anda inginkan dengan menyetel kunci berikut ke true :

  • showCredentials :menunjukkan informasi kredensial selain keluaran reguler
  • showPrivileges :menampilkan informasi hak istimewa selain keluaran reguler
  • showAuthenticationRestrictions :menunjukkan batasan autentikasi pada akun selain keluaran reguler

Misalnya, Anda dapat memberi tahu MongoDB untuk memberi Anda semua informasi di atas dengan mengetik:

use admindb.getUser("tom",{    showCredentials: true,    showPrivileges: true,    showAuthenticationRestrictions: true})
{        "_id" : "admin.tom",        "userId" : UUID("e7a0abde-a9f9-412a-bfd5-eb11fda41fd3"),        "user" : "tom",        "db" : "admin",        "mechanisms" : [                "SCRAM-SHA-1",                "SCRAM-SHA-256"        ],        "credentials" : {                "SCRAM-SHA-1" : {                        "iterationCount" : 10000,                        "salt" : "qCbxWQSGt3QoN3S1aM5AEg==",                        "storedKey" : "hypim5+m2wqbS1gc47o2itc7jew=",                        "serverKey" : "h9myNoSvY2015yqvw3UldmJzZCg="                },                "SCRAM-SHA-256" : {                        "iterationCount" : 15000,                        "salt" : "lNtIVL79J8FF+uPaFfRMwPK079gfLEUrsQe3Qg==",                        "storedKey" : "u8pgn3OJiZxIwEL7ryZkoAF5bnMefQEEsZDTXNDCTRY=",                        "serverKey" : "BmmfVeikSA0DN1aZmyZP9NXi5owxGr1ZRmVX2XH8qVg="                }        },        "roles" : [ ],        "inheritedRoles" : [ ],        "inheritedPrivileges" : [ ],        "inheritedAuthenticationRestrictions" : [ ],        "authenticationRestrictions" : [ ]}


Bagaimana Anda mengubah kata sandi untuk pengguna MongoDB?

Untuk mengubah sandi pengguna, Anda dapat menggunakan db.changeUserPassword() metode. Sekali lagi, Anda harus beralih ke database otentikasi pengguna sebelum menjalankan perintah.

db.changeUserPassword() metode ini membutuhkan dua argumen:nama pengguna akun yang ingin Anda ubah dan kata sandi baru untuk akun tersebut.

Misalnya, untuk mengubah kata sandi untuk pengguna tom diautentikasi dengan admin database ke secretpassword , Anda dapat mengetik:

use admindb.changeUserPassword("tom", "secretpassword")

Sama seperti dengan db.createUser() metode, Anda dapat menggunakan passwordPrompt() metode untuk argumen kedua alih-alih memberikan kata sandi sebaris. MongoDB akan meminta Anda memasukkan kata sandi saat perintah dijalankan:

use admindb.changeUserPassword("tom", passwordPrompt())
Enter password:


Bagaimana cara mengubah detail akun pengguna lain?

Untuk mengubah informasi lain yang terkait dengan akun pengguna, Anda dapat menggunakan db.updateUser() metode. Pastikan Anda beralih ke database autentikasi pengguna sebelum memperbarui detail mereka.

db.updateUser() metode mengharuskan Anda untuk menentukan nama pengguna dan kemudian memberikan objek yang berisi data yang ingin Anda perbarui. Setiap bidang yang Anda pilih untuk diperbarui akan sepenuhnya diganti dengan informasi baru, jadi pastikan untuk menyertakan data asli serta data baru di objek Anda jika Anda hanya ingin menambahkan informasi baru.

Objek yang Anda sertakan dalam perintah dengan informasi perubahan dapat berisi banyak bidang yang berbeda. Mari kita bahas mereka:

  • customData :Data arbitrer apa pun yang akan dikaitkan dengan akun pengguna.
  • roles :Peran yang diberikan pengguna. Seringkali lebih baik menggunakan db.grantRolesToUser() dan db.revokeRolesFromUser() metode untuk mengontrol keanggotaan peran daripada memperbarui dengan kunci ini karena Anda dapat menambahkan dan menghapus peran satu per satu.
  • pwd :Kata sandi pengguna. Menggunakan db.ChangeUserPassword() metode ini biasanya lebih mudah jika hanya itu yang perlu diperbarui.
  • authenticationRestrictions :Menentukan batasan untuk akun yang dapat membatasi alamat IP yang dapat terhubung dari atau ke pengguna. Nilai kunci ini adalah objek atau larik yang mendefinisikan clientSource dan atau serverAddress , yang berisi larik yang menentukan alamat atau rentang IP yang valid. Cari tahu lebih lanjut di dokumen MongoDB tentang pembatasan otentikasi.
  • mechanisms :Mekanisme otentikasi khusus yang akan digunakan untuk kredensial. Dapat disetel ke salah satu atau keduanya SCRAM-SHA-1 atau SCRAM-SHA-256 , tetapi hanya dapat diubah menjadi subset dari mekanisme saat ini jika sandi baru saat ini tidak diberikan.
  • passwordDigestor :Menentukan komponen mana yang memproses sandi pengguna. Dapat berupa server (default) atau client .

Sebagai contoh, kita dapat memperbarui tom akun yang mengautentikasi terhadap admin database hanya dapat login dari komputer yang sama yang menghosting server itu sendiri dengan mengubah authenticationRestrictions bidang:

use admindb.updateUser("tom", {    authenticationRestrictions: [ {        clientSource: ["127.0.0.1", "::1"],        serverAddress: ["127.0.0.1", "::1"]    } ]})

Sekarang, jika Anda meminta MongoDB untuk menunjukkan kepada Anda informasi yang relevan tentang pengguna, itu akan menampilkan batasan tambahan untuk akun:

use admindb.getUser("tom", {    showAuthenticationRestrictions: true})
{        "_id" : "admin.tom",        "userId" : UUID("e7a0abde-a9f9-412a-bfd5-eb11fda41fd3"),        "user" : "tom",        "db" : "admin",        "mechanisms" : [                "SCRAM-SHA-1",                "SCRAM-SHA-256"        ],        "roles" : [ ],        "authenticationRestrictions" : [                {                        "clientSource" : [                                "127.0.0.1",                                "::1"                        ],                        "serverAddress" : [                                "127.0.0.1",                                "::1"                        ]                }        ],        "inheritedRoles" : [ ],        "inheritedPrivileges" : [ ],        "inheritedAuthenticationRestrictions" : [ ]}

Untuk mencabut batasan tersebut, kita dapat menjalankan perintah lagi dengan array kosong:

use admindb.changeUser("tom", {    authenticationRestrictions: []})


Bagaimana Anda menghapus pengguna MongoDB?

Untuk menghapus akun pengguna MongoDB, Anda dapat menggunakan db.dropUser() metode. Pastikan untuk terhubung ke database autentikasi pengguna sebelum menghapusnya.

Untuk menjalankan db.dropUser() metode, Anda harus memberikan nama pengguna yang ingin Anda hapus:

db.dropUser("tom")

Setelah penghapusan berhasil, MongoDB akan mengembalikan true :

true

Jika akun tidak ada di database saat ini, itu akan mengembalikan false .



Kesimpulan

Manajemen pengguna dan konfigurasi otentikasi MongoDB memungkinkan Anda mengontrol siapa yang dapat terhubung ke server Anda dan apa properti penggunanya. Dalam artikel berikut, kami akan membahas cara membatasi tingkat akses yang dimiliki pengguna dengan menangani bagian otorisasi dari pengelolaan pengguna.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Dapatkan dokumen dengan tag dalam daftar, diurutkan berdasarkan jumlah total kecocokan

  2. Agregat $lookup tidak mengembalikan elemen urutan array asli

  3. Agregasi MongoDB:Hitung Total Berjalan dari jumlah baris sebelumnya

  4. MongoDB Seattle 2014

  5. 4 Cara Menghapus Dokumen di MongoDB