Въведение
Управлението на потребителите и удостоверяването са едни от най-важните административни задачи при управлението на MongoDB сървъри. Трябва да се уверите, че сървърът е конфигуриран така, че да може правилно да идентифицира вашите потребители и приложения и да отказва връзки или операции, които не могат да се удостоверят правилно.
За да управлявате тези изисквания, трябва да можете да решите кои потребители изисква вашият сървър и да създадете тези акаунти. Като част от този процес можете да зададете данните за удостоверяване, за да разрешите външен достъп с помощта на новата самоличност.
В това ръководство ще разгледаме как да създавате, преглеждате и премахваме потребителски акаунти. Ще разгледаме как да настроите удостоверяване за вашите акаунти и как да актуализирате идентификационните данни, когато трябва да промените потребителските си пароли.
Предварителни условия
За да следвате това ръководство, ще ви е необходим акаунт на сървър на MongoDB със съответните привилегии.
Команди и методи, които ще използваме
За да създавате, променяте и изтривате потребители в MongoDB и конфигурирате удостоверяване, основните методи, от които се нуждаете, са:
db.createUser
:създайте нов потребителски акаунт в MongoDBdb.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 ви позволява да контролирате кой може да се свързва с вашите сървъри и какви са техните потребителски свойства. В следващата статия ще покрием как да ограничим нивото на достъп, което потребителите имат, като се справим с частта за оторизация от управлението на потребителите.