Úvod
Správa uživatelů a ověřování jsou některé z nejdůležitějších administrativních úkolů správy serverů MongoDB. Musíte zajistit, aby byl server nakonfigurován tak, aby byl schopen správně identifikovat vaše uživatele a aplikace a odmítnout připojení nebo operace, které se nemohou správně ověřit.
Chcete-li tyto požadavky spravovat, musíte být schopni rozhodnout, které uživatele váš server vyžaduje, a vytvořit tyto účty. V rámci tohoto procesu můžete nastavit autentizační detaily tak, aby umožňovaly externí přístup pomocí nové identity.
V této příručce si projdeme, jak vytvořit, zobrazit a odebrat uživatelské účty. Projdeme si, jak nastavit ověřování pro vaše účty a jak aktualizovat přihlašovací údaje, když potřebujete změnit uživatelská hesla.
Předpoklady
Abyste mohli postupovat podle tohoto průvodce, budete potřebovat účet na serveru MongoDB s příslušnými oprávněními.
Příkazy a metody, které použijeme
Chcete-li vytvářet, upravovat a odstraňovat uživatele v rámci MongoDB a konfigurovat ověřování, potřebujete tyto základní metody:
db.createUser
:vytvořte nový uživatelský účet MongoDBdb.updateUser
:aktualizace údajů o uživatelském účtudb.changeUserPassword
:změna hesla používaného uživatelským účtemdb.dropUser
:smazat uživatelský účet MongoDB
Následující databázový příkaz je navíc užitečný pro vyhledání informací o uživatelích v systému:
db.runCommand('usersInfo')
:zobrazit informace o jednom nebo více uživatelských účtech MongoDB
Požadovaná oprávnění
Chcete-li provést výše uvedené příkazy, musíte se přihlásit k MongoDB pomocí účtu s řadou různých akcí oprávnění. Konkrétní oprávnění, která požadujete, závisí na příkazech, které musíte použít.
Chcete-li získat informace o ostatních uživatelích, váš aktuální uživatel musí mít povolenou následující akci oprávnění:
viewUser
akci privilegia
Chcete-li vytvořit nové uživatele, váš aktuální uživatel musí mít povoleny následující akce oprávnění:
createUser
akci privilegiagrantRole
akci privilegia
Chcete-li změnit heslo uživatele nebo podrobnosti o účtu, možná budete potřebovat následující oprávnění:
changeOwnPassword
akci oprávnění změnit heslo vlastního účtuchangeOwnCustomData
akci oprávnění změnit vlastní data vašeho účtuchangePassword
akci oprávnění ke změně hesel ostatních uživatelůchangeCustomData
akci oprávnění ke změně vlastních dat ostatních uživatelů
V této příručce se nebudeme zabývat správou rolí, takže grantRole
a revokeRole
akce oprávnění nejsou vyžadovány.
Chcete-li odstranit uživatelský účet, váš aktuální uživatel musí mít povolenou následující akci oprávnění:
dropUser
akci privilegia
Porozumění tomu, jak MongoDB implementuje uživatele a ověřování
Než začneme vytvářet a spravovat účty, je užitečné věnovat nějaký čas tomu, abyste se seznámili s tím, jak MongoDB definuje a ukládá tyto informace.
V MongoDB jsou uživatelské účty kombinací uživatelského jména účtu spolu se specifickou ověřovací databází. Autentizační databáze je jednoduše databáze, ve které je definován uživatel a neznamená omezení rozsahu nebo práv. Autentizační databáze jsou běžné databáze používané ke správě jiných dat a nejsou to speciální, specializované databáze.
Název uživatelského účtu musí být v ověřovací databázi jedinečný. Stejné uživatelské jméno však může být znovu použito s jinou ověřovací databází k vytvoření nového, odlišného uživatelského účtu.
V důsledku tohoto návrhu lze účet přesně identifikovat pouze pomocí uživatelského jména a autentizační databáze. Chcete-li se ověřit k účtu, musíte být také schopni poskytnout přihlašovací údaje přidružené k účtu. Obvykle se jedná o heslo, ale může to být také certifikát.
Jak vytváříte uživatele?
Nyní, když jsme se podívali na to, jak MongoDB konceptualizuje uživatelské účty, můžeme diskutovat o tom, jak vytvářet nové uživatele. Nezapomeňte se přihlásit ke svému serveru MongoDB pomocí uživatele, který má příslušná oprávnění, aby vás mohl sledovat.
Chcete-li vytvořit nového uživatele, musíte se nejprve přepnout do databáze, kterou chcete použít jako ověřovací databázi nového uživatele.
Nejprve můžete získat seznam databází, které jsou již ve vašem systému nakonfigurovány, zadáním:
show dbs
admin 0.000GBconfig 0.000GBlocal 0.000GB
Přepněte se do databáze, ke které bude uživatel přidružen pomocí use
příkaz:
use admin
switched to db admin
Chcete-li vytvořit nového uživatele, můžete použít buď db.createUser()
nebo můžete použít createUser
databázový příkaz. V každém případě budete muset předat uživatelské jméno (user
pole), heslo (pwd
pole) a pole rolí, do kterých by měl být uživatel přidán (roles
klíč) v rámci user
objekt.
Chcete-li vytvořit nového uživatele s názvem tom
s heslem nastaveným na hellothere
s prázdným polem rolí pomocí db.createUser()
můžete zadat:
db.createUser({ user: "tom", pwd: "hellothere", roles: []})
Successfully added user: { "user" : "tom", "roles" : [ ] }
Stejná operace pomocí createUser
Database příkaz by vypadal takto:
db.runCommand({ createUser: "tom", pwd: "hellothere", roles: []})
Successfully added user: { "user" : "tom", "roles" : [ ] }
Tyto dvě různé možnosti jsou velmi podobné, takže vpřed ukážeme pouze databázové metody tam, kde je to vhodné. Pokud však dáváte přednost syntaxi databázových příkazů, můžete každý z přidružených příkazů najít v referenční dokumentaci příkazů MongoDB.
Ve výše uvedených příkazech jsme explicitně definovali heslo vložené do user
objekt. Chcete-li zabránit tomu, aby bylo heslo zaznamenáno a načteno, můžete alternativně použít passwordPrompt()
metoda v rámci user
document, aby vás MongoDB interaktivně vyzval k zadání hesla při spuštění příkazu. Heslo nebude viditelné, takže historie příkazů bude čistá:
db.createUser({ user: "tom", pwd: passwordPrompt(), roles: []})
Enter password:Successfully added user: { "user" : "tom", "roles" : [ ] }
Pamatujte, že pokud nemáte povoleno TLS/SSL, bude heslo na server stále odesláno jako prostý text.
Jak zobrazíte stávající uživatele?
Dále se podívejme na to, jak najít informace o stávajících uživatelích.
Chcete-li vrátit více uživatelů, můžete použít db.getUsers()
Metoda zapnuta k zobrazení všech uživatelů v aktuální databázi. Nejprve se přepněte do databáze, kterou chcete dotazovat:
use admin
Dále použijte db.getUsers()
metoda pro návrat všech uživatelů přidružených k aktuální databázi:
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" ] }]
Chcete-li navíc zobrazit informace o pověření každého uživatele, předejte metodě objekt s showCredentials
klíč na 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=" } }, . . . }]
Chcete-li se dotazovat na uživatele, kteří splňují určitá kritéria, můžete předat objekt, který definuje filter
klíč, který definuje podmínku shody.
Chcete-li například získat informace o všech uživatelích v aktuální databázi, kteří mají root
role, můžete napsat:
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" ] }]
Chcete-li získat konkrétního uživatele, můžete použít db.getUser()
místo toho. Funguje to jako db.getUsers()
metoda, ale vrátí jednoho uživatele. Místo předání objektu metodě předáte řetězec obsahující uživatelské jméno, které chcete získat:
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" ]}
Volitelně můžete přidat další args
objekt, který vám umožní zadat další požadované informace nastavením následujících klíčů na true
:
showCredentials
:kromě běžného výstupu zobrazuje informace o pověřeníshowPrivileges
:zobrazuje informace o oprávněních navíc k běžnému výstupushowAuthenticationRestrictions
:kromě běžného výstupu zobrazuje omezení ověřování na účtu
Můžete například říci MongoDB, aby vám poskytl všechny výše uvedené informace zadáním:
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" : [ ]}
Jak změníte heslo pro uživatele MongoDB?
Chcete-li změnit heslo uživatele, můžete použít db.changeUserPassword()
metoda. Před provedením příkazu se opět musíte přepnout do ověřovací databáze uživatele.
db.changeUserPassword()
metoda používá dva argumenty:uživatelské jméno účtu, který chcete změnit, a nové heslo k účtu.
Například ke změně hesla pro uživatele tom
ověřeno admin
databáze na secretpassword
, můžete napsat:
use admindb.changeUserPassword("tom", "secretpassword")
Stejně jako u db.createUser()
můžete použít passwordPrompt()
metoda pro druhý argument namísto poskytnutí vloženého hesla. MongoDB vás po provedení příkazu vyzve k zadání hesla:
use admindb.changeUserPassword("tom", passwordPrompt())
Enter password:
Jak změníte další podrobnosti uživatelského účtu?
Chcete-li změnit další informace spojené s uživatelským účtem, můžete použít db.updateUser()
metoda. Před aktualizací údajů o uživateli se ujistěte, že jste přepnuli do ověřovací databáze uživatele.
db.updateUser()
metoda vyžaduje, abyste zadali uživatelské jméno a poté poskytli objekt obsahující data, která chcete aktualizovat. Jakékoli pole, které se rozhodnete aktualizovat, bude zcela nahrazeno novými informacemi, takže pokud chcete pouze přidat nové informace, nezapomeňte do objektu zahrnout původní data i nová data.
Objekt, který zahrnete do příkazu s informací o změně, může obsahovat mnoho různých polí. Pojďme si je projít:
customData
:Libovolná data, která mají být přidružena k uživatelskému účtu.roles
:Role, které jsou uživateli přiděleny. Často je lepší použítdb.grantRolesToUser()
adb.revokeRolesFromUser()
metody pro ovládání členství v rolích spíše než aktualizace pomocí tohoto klíče, protože můžete přidávat a odebírat role jednotlivě.pwd
:Heslo uživatele. Pomocídb.ChangeUserPassword()
metoda je obvykle jednodušší, pokud je to jediné pole, které je třeba aktualizovat.authenticationRestrictions
:Určuje omezení pro účet, která mohou omezit adresy IP, ze kterých se mohou uživatelé připojovat. Hodnota tohoto klíče je objekt nebo pole, které definujeclientSource
a neboserverAddress
, které obsahují pole určující platné IP adresy nebo rozsahy. Další informace o omezeních ověřování naleznete v dokumentech MongoDB.mechanisms
:Specifické mechanismy ověřování, které se mají použít pro pověření. Lze nastavit na jednu nebo obě zSCRAM-SHA-1
neboSCRAM-SHA-256
, ale lze jej změnit pouze na podmnožinu aktuálních mechanismů, pokud není aktuálně zadáno nové heslo.passwordDigestor
:Určuje, která komponenta zpracovává heslo uživatele. Může to být buďserver
(výchozí) neboclient
.
Jako příklad můžeme aktualizovat tom
účet, který se ověřuje proti admin
databáze, aby se bylo možné přihlásit pouze ze stejného počítače, který je hostitelem samotného serveru změnou authenticationRestrictions
pole:
use admindb.updateUser("tom", { authenticationRestrictions: [ { clientSource: ["127.0.0.1", "::1"], serverAddress: ["127.0.0.1", "::1"] } ]})
Pokud nyní požádáte MongoDB, aby vám ukázal relevantní informace o uživateli, zobrazí se další omezení pro účet:
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" : [ ]}
Chcete-li tato omezení zrušit, můžeme příkaz spustit znovu s prázdným polem:
use admindb.changeUser("tom", { authenticationRestrictions: []})
Jak odstraníte uživatele MongoDB?
Chcete-li odebrat uživatelské účty MongoDB, můžete použít db.dropUser()
metoda. Před odebráním se ujistěte, že jste se připojili k ověřovací databázi uživatele.
Chcete-li spustit db.dropUser()
musíte zadat jméno uživatele, kterého chcete odebrat:
db.dropUser("tom")
Po úspěšném smazání MongoDB vrátí true
:
true
Pokud účet v aktuální databázi neexistoval, místo toho vrátí false
.
Závěr
Konfigurace správy uživatelů a ověřování MongoDB vám umožňuje řídit, kdo se může připojit k vašim serverům a jaké jsou jejich uživatelské vlastnosti. V následujícím článku se budeme zabývat tím, jak omezit úroveň přístupu uživatelů tím, že se vypořádáme s autorizační částí správy uživatelů.