sql >> Databáze >  >> NoSQL >> MongoDB

Jak spravovat uživatele a ověřování v MongoDB


Ú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 MongoDB
  • db.updateUser :aktualizace údajů o uživatelském účtu
  • db.changeUserPassword :změna hesla používaného uživatelským účtem
  • db.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 privilegia
  • grantRole 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 účtu
  • changeOwnCustomData akci oprávnění změnit vlastní data vašeho účtu
  • changePassword 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ýstupu
  • showAuthenticationRestrictions :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žít db.grantRolesToUser() a db.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é definuje clientSource a nebo serverAddress , 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ě z SCRAM-SHA-1 nebo SCRAM-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í) nebo client .

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ů.




  1. parametr maxmemory v redis.conf

  2. Heslo MongoDB s @

  3. Naformátujte číslo jako procento v SQL

  4. Vlastní doména Heroku nefunguje