MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Как да управлявате потребители и удостоверяване в MongoDB


Въведение

Управлението на потребителите и удостоверяването са едни от най-важните административни задачи при управлението на MongoDB сървъри. Трябва да се уверите, че сървърът е конфигуриран така, че да може правилно да идентифицира вашите потребители и приложения и да отказва връзки или операции, които не могат да се удостоверят правилно.

За да управлявате тези изисквания, трябва да можете да решите кои потребители изисква вашият сървър и да създадете тези акаунти. Като част от този процес можете да зададете данните за удостоверяване, за да разрешите външен достъп с помощта на новата самоличност.

В това ръководство ще разгледаме как да създавате, преглеждате и премахваме потребителски акаунти. Ще разгледаме как да настроите удостоверяване за вашите акаунти и как да актуализирате идентификационните данни, когато трябва да промените потребителските си пароли.



Предварителни условия

За да следвате това ръководство, ще ви е необходим акаунт на сървър на MongoDB със съответните привилегии.


Команди и методи, които ще използваме

За да създавате, променяте и изтривате потребители в MongoDB и конфигурирате удостоверяване, основните методи, от които се нуждаете, са:

  • db.createUser :създайте нов потребителски акаунт в MongoDB
  • db.updateUser :актуализира подробностите за потребителски акаунт
  • db.changeUserPassword :промяна на паролата, използвана от потребителски акаунт
  • db.dropUser :изтриване на потребителски акаунт в MongoDB

Освен това, следната команда за база данни е полезна за намиране на информация за потребители в системата:

  • db.runCommand('usersInfo') :показва информация за един или повече потребителски акаунти в MongoDB


Задължителни привилегии

За да изпълните командите по-горе, трябва да влезете в MongoDB с акаунт с редица различни действия за привилегии. Конкретните привилегии, от които се нуждаете, зависят от командите, които трябва да използвате.

За да получите информация за други потребители, вашият текущ потребител трябва да има активирано следното действие за привилегия:

  • viewUser действие за привилегия

За да създадете нови потребители, настоящият ви потребител трябва да има активирани следните привилегии:

  • createUser действие за привилегия
  • grantRole действие за привилегия

За да промените паролата или данните за акаунта на потребителя, може да са ви необходими следните привилегии:

  • changeOwnPassword действие с привилегия за промяна на паролата за собствен акаунт
  • changeOwnCustomData действие с привилегия за промяна на персонализираните данни на вашия акаунт
  • changePassword действие с привилегия за промяна на паролите на други потребители
  • changeCustomData действие с привилегия за промяна на персонализираните данни на други потребители

Няма да разглеждаме управлението на ролите в това ръководство, така че grantRole и revokeRole не се изискват привилегировани действия.

За да изтриете потребителски акаунт, вашият текущ потребител трябва да има активирано следното действие за привилегия:

  • dropUser действие за привилегия



Разбиране как MongoDB внедрява потребителите и удостоверяването

Преди да започнем да създаваме и управляваме акаунти, е полезно да отделите известно време, за да се запознаете с това как MongoDB дефинира и съхранява тази информация.

В MongoDB потребителските акаунти са комбинация от потребителското име на акаунта заедно със специфична база данни за удостоверяване. Базата данни за удостоверяване е просто базата данни, в която е дефиниран потребителят и не предполага ограничение на обхвата или правата. Базите данни за удостоверяване са обикновени бази данни, използвани за управление на други данни и не са специални, специализирани бази данни.

Името на потребителския акаунт трябва да е уникално в неговата база данни за удостоверяване. Въпреки това, същото потребителско име може да се използва повторно с различна база данни за удостоверяване, за да се създаде нов, различен потребителски акаунт.

В резултат на този дизайн акаунт може да бъде точно идентифициран само чрез включване на потребителското име и базата данни за удостоверяване. За да се удостоверите в акаунт, човек също трябва да може да предостави идентификационните данни, свързани с акаунт. Това обикновено е парола, но може да бъде и сертификат.



Как създавате потребители?

След като разгледахме как MongoDB концептуализира потребителските акаунти, можем да обсъдим как да създаваме нови потребители. Не забравяйте да влезете във вашия MongoDB сървър с потребител, който има съответните привилегии, за да следвате.

За да създадете нов потребител, първо трябва да преминете към базата данни, която искате да използвате като база данни за удостоверяване на новия потребител.

Първо, можете да получите списък с базите данни, които вече са конфигурирани във вашата система, като напишете:

show dbs
admin   0.000GBconfig  0.000GBlocal   0.000GB

Превключете към базата данни, с която потребителят ще бъде свързан с помощта на use команда:

use admin
switched to db admin

За да създадете нов потребител, можете да използвате или db.createUser() метод или можете да използвате createUser команда за база данни. Така или иначе ще трябва да подадете потребителското име (user поле), парола (pwd поле) и масив от роли, към които потребителят трябва да бъде добавен (roles ключ) в рамките на user обект.

За да създадете нов потребител, наречен tom с парола, зададена на hellothere с празен масив от роли, използвайки db.createUser() метод, можете да въведете:

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

Същата операция с помощта на createUser командата база данни ще изглежда така:

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

Двете различни опции са много сходни, така че ще показваме само методите на базата данни, където е приложимо, за напред. Въпреки това, ако предпочитате командния синтаксис на базата данни, можете да намерите всяка от свързаните команди в справочната документация на MongoDB.

В горните команди ние изрично дефинирахме паролата в рамките на user обект. За да предотвратите регистрирането и извличането на паролата, можете алтернативно да използвате passwordPrompt() метод в user документ, за да може MongoDB интерактивно да ви подкани за парола, когато командата се изпълнява. Паролата няма да се вижда, така че историята на вашите команди ще бъде чиста:

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

Имайте предвид, че паролата пак ще бъде изпратена до сървъра в обикновен текст, ако не сте активирали TLS/SSL.



Как показвате съществуващите потребители?

След това нека да разгледаме как да намерим информация за съществуващите потребители.

За да върнете множество потребители, можете да използвате db.getUsers() включен метод за показване на всички потребители в текущата база данни. Първо, превключете към базата данни, от която се интересувате:

use admin

След това използвайте db.getUsers() метод за връщане на всички потребители, свързани с текущата база данни:

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"            ]    }]

За да покажете допълнително информацията за идентификационни данни на всеки потребител, предайте обект на метода с showCredentials ключ към 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="                        }                },                . . .        }]

За да направите заявка за потребители, които отговарят на определени критерии, можете да подадете обект, който дефинира filter ключ, който определя условието за съвпадение.

Например, за да получите информация за всички потребители в текущата база данни, които имат root роля, можете да въведете:

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"                ]        }]

За да получите конкретен потребител, можете да използвате db.getUser() вместо това метод. Това работи като db.getUsers() метод, но връща един потребител. Вместо да предавате обект на метода, вие предавате низ, съдържащ потребителското име, което искате да извлечете:

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"        ]}

По желание можете да включите допълнителни args обект, който ви позволява да посочите допълнителна информация, която искате, като зададете следните ключове на true :

  • showCredentials :показва информация за идентификационни данни в допълнение към обикновения изход
  • showPrivileges :показва информация за привилегии в допълнение към обикновения изход
  • showAuthenticationRestrictions :показва ограничения за удостоверяване на акаунта в допълнение към обикновения изход

Например, можете да кажете на MongoDB да ви предостави цялата горна информация, като напишете:

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" : [ ]}


Как да промените паролата за потребител на MongoDB?

За да промените паролата на потребителя, можете да използвате db.changeUserPassword() метод. Отново трябва да превключите към базата данни за удостоверяване на потребителя, преди да изпълните командата.

db.changeUserPassword() методът приема два аргумента:потребителското име на акаунта, който искате да промените, и новата парола за акаунта.

Например, за да промените паролата за потребителя tom удостоверено с admin база данни към secretpassword , можете да въведете:

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

Точно както при db.createUser() метод, можете да използвате passwordPrompt() метод за втория аргумент вместо да предоставя вградена парола. MongoDB ще ви подкани да въведете парола, когато се изпълни командата:

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


Как променяте други подробности за потребителския акаунт?

За да промените друга информация, свързана с потребителски акаунт, можете да използвате db.updateUser() метод. Уверете се, че сте превключили към базата данни за удостоверяване на потребителя, преди да актуализирате техните данни.

db.updateUser() методът изисква да посочите потребителското име и след това да предоставите обект, съдържащ данните, които искате да актуализирате. Всяко поле, което изберете да актуализирате, ще бъде напълно заменено с новата информация, така че не забравяйте да включите оригиналните данни, както и новите данни във вашия обект, ако се надявате само да добавите нова информация.

Обектът, който включвате в командата с информацията за промяна, може да съдържа много различни полета. Нека ги разгледаме:

  • customData :Всички произволни данни, които да бъдат свързани с потребителския акаунт.
  • roles :Ролите, които се предоставят на потребителя. Често е по-добре да използвате db.grantRolesToUser() и db.revokeRolesFromUser() методи за контрол на членството в роли, вместо да актуализирате с този ключ, тъй като можете да добавяте и премахвате роли поотделно.
  • pwd :Парола на потребителя. Използване на db.ChangeUserPassword() методът обикновено е по-лесен, ако това е единственото поле, което трябва да се актуализира.
  • authenticationRestrictions :Определя ограничения за акаунта, които могат да ограничат IP адресите, от които потребителите могат да се свързват. Стойността на този ключ е обект или масив, който дефинира clientSource и или serverAddress , които съдържат масиви, посочващи валидните IP адреси или диапазони. Научете повече в документите на MongoDB за ограниченията за удостоверяване.
  • mechanisms :Специфичните механизми за удостоверяване, които да се използват за идентификационни данни. Може да бъде настроен на един или и на двата от SCRAM-SHA-1 или SCRAM-SHA-256 , но може да бъде променена само на подмножество от текущите механизми, ако в момента не се предоставя нова парола.
  • passwordDigestor :Указва кой компонент обработва паролата на потребителя. Може да бъде или server (по подразбиране) или client .

Като пример можем да актуализираме tom акаунт, който се удостоверява срещу admin база данни, за да можете да влизате само от същия компютър, който хоства самия сървър чрез промяна на authenticationRestrictions поле:

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

Сега, ако поискате MongoDB да ви покаже съответната информация за потребителя, той ще покаже допълнителни ограничения за акаунта:

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" : [ ]}

За да отменим тези ограничения, можем да изпълним командата отново с празен масив:

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


Как се изтриват потребители на MongoDB?

За да премахнете потребителски акаунти в MongoDB, можете да използвате db.dropUser() метод. Не забравяйте да се свържете с базата данни за удостоверяване на потребителя, преди да ги премахнете.

За да изпълните db.dropUser() метод, трябва да посочите името на потребителя, който искате да премахнете:

db.dropUser("tom")

При успешно изтриване MongoDB ще върне true :

true

Ако акаунтът не съществува в текущата база данни, той вместо това ще върне false .



Заключение

Конфигурацията за управление и удостоверяване на потребителите на MongoDB ви позволява да контролирате кой може да се свързва с вашите сървъри и какви са техните потребителски свойства. В следващата статия ще покрием как да ограничим нивото на достъп, което потребителите имат, като се справим с частта за оторизация от управлението на потребителите.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB findOneAndDelete()

  2. Как да оптимизирате производителността на ClusterControl и неговите компоненти

  3. MongoDB - Пуснете база данни

  4. Индекс в MongoDB

  5. mongodb текстово търсене с помощта на няколко езика