sql >> Database >  >> NoSQL >> MongoDB

Hoe gebruikers en authenticatie in MongoDB te beheren


Inleiding

Het beheren van gebruikers en authenticatie zijn enkele van de belangrijkste beheertaken bij het beheren van MongoDB-servers. U moet ervoor zorgen dat de server is geconfigureerd om uw gebruikers en toepassingen correct te kunnen identificeren en verbindingen of bewerkingen te weigeren die niet correct kunnen worden geverifieerd.

Om deze vereisten te beheren, moet u kunnen beslissen welke gebruikers uw server nodig heeft en die accounts maken. Als onderdeel van dit proces kunt u de authenticatiegegevens instellen om externe toegang toe te staan ​​met de nieuwe identiteit.

In deze handleiding laten we zien hoe u gebruikersaccounts kunt maken, bekijken en verwijderen. We bespreken hoe u authenticatie voor uw accounts instelt en hoe u de inloggegevens bijwerkt wanneer u uw gebruikerswachtwoorden moet wijzigen.



Vereisten

Om deze handleiding te volgen, heeft u een account nodig op een MongoDB-server met de juiste rechten.


Opdrachten en methoden die we zullen gebruiken

Om gebruikers binnen MongoDB aan te maken, te wijzigen en te verwijderen en authenticatie te configureren, zijn de belangrijkste methoden die u nodig hebt:

  • db.createUser :maak een nieuw MongoDB-gebruikersaccount aan
  • db.updateUser :de details van een gebruikersaccount bijwerken
  • db.changeUserPassword :het wachtwoord wijzigen dat door een gebruikersaccount wordt gebruikt
  • db.dropUser :een MongoDB-gebruikersaccount verwijderen

Daarnaast is het volgende databasecommando handig om informatie over gebruikers op het systeem te vinden:

  • db.runCommand('usersInfo') :toon informatie over een of meer MongoDB-gebruikersaccounts


Vereiste privileges

Om de bovenstaande opdrachten uit te voeren, moet u inloggen op MongoDB met een account met een aantal verschillende privilege-acties. De specifieke privileges die je nodig hebt, zijn afhankelijk van de commando's die je moet gebruiken.

Om informatie over andere gebruikers te krijgen, moet uw huidige gebruiker de volgende privilege-actie hebben ingeschakeld:

  • viewUser privilege actie

Om nieuwe gebruikers aan te maken, moet uw huidige gebruiker de volgende privilege-acties hebben ingeschakeld:

  • createUser privilege actie
  • grantRole privilege actie

Om het wachtwoord of de accountgegevens van een gebruiker te wijzigen, hebt u mogelijk de volgende rechten nodig:

  • changeOwnPassword privilege-actie om uw eigen accountwachtwoord te wijzigen
  • changeOwnCustomData privilege-actie om de aangepaste gegevens van uw eigen account te wijzigen
  • changePassword privilege-actie om de wachtwoorden van andere gebruikers te wijzigen
  • changeCustomData privilege-actie om de aangepaste gegevens van andere gebruikers te wijzigen

In deze handleiding gaan we niet in op rolbeheer, dus de grantRole en revokeRole privilege-acties zijn niet vereist.

Om een ​​gebruikersaccount te verwijderen, moet uw huidige gebruiker de volgende privilege-actie hebben ingeschakeld:

  • dropUser privilege actie



Begrijpen hoe MongoDB gebruikers en authenticatie implementeert

Voordat we beginnen met het maken en beheren van accounts, is het handig om even de tijd te nemen om vertrouwd te raken met hoe MongoDB deze informatie definieert en opslaat.

In MongoDB zijn gebruikersaccounts een combinatie van de gebruikersnaam van het account en een specifieke authenticatiedatabase. De authenticatiedatabase is gewoon de database waarin de gebruiker is gedefinieerd en houdt geen beperking in op het gebied van reikwijdte of rechten. Authenticatiedatabases zijn reguliere databases die worden gebruikt om andere gegevens te beheren en zijn geen speciale, speciale databases.

De naam van een gebruikersaccount moet uniek zijn in de verificatiedatabase. Dezelfde gebruikersnaam kan echter opnieuw worden gebruikt met een andere authenticatiedatabase om een ​​nieuwe, afzonderlijke gebruikersaccount aan te maken.

Als gevolg van dit ontwerp kan een account alleen nauwkeurig worden geïdentificeerd door de gebruikersnaam en de authenticatiedatabase op te nemen. Om te authenticeren voor een account, moet men ook de inloggegevens kunnen verstrekken die aan een account zijn gekoppeld. Dit is meestal een wachtwoord, maar kan ook een certificaat zijn.



Hoe maakt u gebruikers aan?

Nu we hebben gekeken naar hoe MongoDB gebruikersaccounts conceptualiseert, kunnen we bespreken hoe we nieuwe gebruikers kunnen maken. Vergeet niet in te loggen op uw MongoDB-server met een gebruiker die de juiste rechten heeft om mee te volgen.

Om een ​​nieuwe gebruiker aan te maken, moet u eerst overschakelen naar de database die u wilt gebruiken als de authenticatiedatabase van de nieuwe gebruiker.

Ten eerste kunt u een lijst krijgen van de databases die al op uw systeem zijn geconfigureerd door te typen:

show dbs
admin   0.000GBconfig  0.000GBlocal   0.000GB

Schakel over naar de database waaraan de gebruiker zal worden gekoppeld met behulp van de use commando:

use admin
switched to db admin

Om een ​​nieuwe gebruiker aan te maken, kunt u ofwel de db.createUser() methode of u kunt de createUser . gebruiken database-opdracht. Hoe dan ook, u moet de gebruikersnaam (de user veld), wachtwoord (de pwd veld), en een reeks rollen waaraan de gebruiker moet worden toegevoegd (de roles sleutel) binnen een user voorwerp.

Een nieuwe gebruiker maken met de naam tom met een wachtwoord ingesteld op hellothere met een lege rollen-array met behulp van de db.createUser() methode kunt u typen:

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

Dezelfde bewerking met de createUser database commando ziet er als volgt uit:

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

De twee verschillende opties lijken erg op elkaar, dus we zullen in de toekomst alleen de databasemethoden tonen waar van toepassing. Als u echter de voorkeur geeft aan de syntaxis van de databaseopdracht, kunt u elk van de bijbehorende opdrachten vinden in de MongoDB-opdrachtreferentiedocumentatie.

In de bovenstaande opdrachten hebben we het wachtwoord expliciet inline gedefinieerd binnen de user voorwerp. Om te voorkomen dat het wachtwoord wordt vastgelegd en kan worden opgehaald, kunt u ook de passwordPrompt() gebruiken methode binnen de user document om MongoDB interactief om een ​​wachtwoord te laten vragen wanneer de opdracht wordt uitgevoerd. Het wachtwoord is niet zichtbaar, dus uw opdrachtgeschiedenis is schoon:

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

Houd er rekening mee dat het wachtwoord nog steeds in platte tekst naar de server wordt verzonden als u TLS/SSL niet hebt ingeschakeld.



Hoe laat je bestaande gebruikers zien?

Laten we vervolgens eens kijken hoe we informatie over de bestaande gebruikers kunnen vinden.

Om meerdere gebruikers te retourneren, kunt u de db.getUsers() . gebruiken methode aan om alle gebruikers in de huidige database weer te geven. Schakel eerst over naar de database die u wilt opvragen:

use admin

Gebruik vervolgens de db.getUsers() methode om alle gebruikers te retourneren die aan de huidige database zijn gekoppeld:

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

Om bovendien de inloggegevens van elke gebruiker weer te geven, geeft u een object door aan de methode met de showCredentials sleutel tot 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="                        }                },                . . .        }]

Om gebruikers te zoeken die aan bepaalde criteria voldoen, kunt u een object doorgeven dat een filter definieert sleutel die de overeenkomende voorwaarde definieert.

Om bijvoorbeeld informatie te krijgen over alle gebruikers in de huidige database die de root . hebben rol, zou je kunnen typen:

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

Om een ​​specifieke gebruiker te krijgen, kunt u de db.getUser() . gebruiken methode in plaats daarvan. Dit werkt als de db.getUsers() methode, maar retourneert een enkele gebruiker. In plaats van een object door te geven aan de methode, geef je een string door met de gebruikersnaam die je wilt ophalen:

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

U kunt optioneel een extra args . toevoegen object waarmee u aanvullende informatie kunt opgeven die u wilt door de volgende sleutels in te stellen op true :

  • showCredentials :toont inloggegevens naast de reguliere uitvoer
  • showPrivileges :toont privilege-informatie naast de reguliere uitvoer
  • showAuthenticationRestrictions :toont authenticatiebeperkingen op het account naast de reguliere uitvoer

U kunt MongoDB bijvoorbeeld vertellen om u alle bovenstaande informatie te verstrekken door te typen:

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


Hoe verander je het wachtwoord voor een MongoDB-gebruiker?

Om het wachtwoord van een gebruiker te wijzigen, kunt u de db.changeUserPassword() gebruiken methode. Nogmaals, u moet overschakelen naar de authenticatiedatabase van de gebruiker voordat u de opdracht uitvoert.

Het db.changeUserPassword() methode heeft twee argumenten nodig:de gebruikersnaam van het account dat u wilt wijzigen en het nieuwe wachtwoord voor het account.

Om bijvoorbeeld het wachtwoord voor de gebruiker tom te wijzigen geverifieerd met de admin database naar secretpassword , je zou kunnen typen:

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

Net als bij de db.createUser() methode, kunt u de passwordPrompt() methode voor het tweede argument in plaats van een wachtwoord inline op te geven. MongoDB zal u vragen om een ​​wachtwoord in te voeren wanneer de opdracht wordt uitgevoerd:

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


Hoe wijzig je andere gebruikersaccountgegevens?

Om andere informatie die aan een gebruikersaccount is gekoppeld te wijzigen, kunt u de db.updateUser() gebruiken methode. Zorg ervoor dat u overschakelt naar de authenticatiedatabase van de gebruiker voordat u de gegevens bijwerkt.

De db.updateUser() methode vereist dat u de gebruikersnaam opgeeft en vervolgens een object opgeeft met de gegevens die u wilt bijwerken. Elk veld dat u wilt bijwerken, wordt volledig vervangen door de nieuwe informatie, dus zorg ervoor dat u zowel de originele gegevens als de nieuwe gegevens in uw object opneemt als u alleen nieuwe informatie wilt toevoegen.

Het object dat u in de opdracht met de wijzigingsinformatie opneemt, kan veel verschillende velden bevatten. Laten we ze eens doornemen:

  • customData :Alle willekeurige gegevens die aan het gebruikersaccount moeten worden gekoppeld.
  • roles :De rollen die aan de gebruiker worden toegekend. Het is vaak beter om de db.grantRolesToUser() . te gebruiken en db.revokeRolesFromUser() methoden om het lidmaatschap van rollen te beheren in plaats van te updaten met deze sleutel, aangezien u rollen afzonderlijk kunt toevoegen en verwijderen.
  • pwd :Het wachtwoord van de gebruiker. De db.ChangeUserPassword() . gebruiken methode is meestal gemakkelijker als dat het enige veld is dat moet worden bijgewerkt.
  • authenticationRestrictions :Specificeert beperkingen voor het account die de IP-adressen kunnen beperken waarvan gebruikers verbinding kunnen maken of waarmee ze verbinding kunnen maken. De waarde van deze sleutel is een object of array die clientSource definieert en of serverAddress , die arrays bevatten die de geldige IP-adressen of -bereiken specificeren. Lees meer in de MongoDB-documenten over authenticatiebeperkingen.
  • mechanisms :De specifieke authenticatiemechanismen die moeten worden gebruikt voor referenties. Kan worden ingesteld op een of beide van SCRAM-SHA-1 of SCRAM-SHA-256 , maar kan alleen worden gewijzigd in een subset van de huidige mechanismen als er momenteel geen nieuw wachtwoord wordt opgegeven.
  • passwordDigestor :Specificeert welk onderdeel het wachtwoord van de gebruiker verwerkt. Kan een van beide server . zijn (de standaardinstelling) of client .

Als voorbeeld kunnen we de tom . updaten account dat authenticeert tegen de admin database om alleen in te kunnen loggen vanaf dezelfde computer die de server zelf host door de authenticationRestrictions te wijzigen veld:

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

Als u MongoDB nu vraagt ​​om u de relevante informatie over de gebruiker te tonen, worden er aanvullende beperkingen voor het account weergegeven:

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

Om die beperkingen in te trekken, kunnen we de opdracht opnieuw uitvoeren met een lege array:

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


Hoe verwijder je MongoDB-gebruikers?

Om MongoDB-gebruikersaccounts te verwijderen, kunt u de db.dropUser() . gebruiken methode. Zorg ervoor dat u verbinding maakt met de authenticatiedatabase van de gebruiker voordat u deze verwijdert.

Om de db.dropUser() uit te voeren methode, moet u de naam opgeven van de gebruiker die u wilt verwijderen:

db.dropUser("tom")

Na succesvolle verwijdering zal MongoDB true retourneren :

true

Als het account niet bestond in de huidige database, wordt in plaats daarvan false geretourneerd .



Conclusie

Met de gebruikersbeheer- en authenticatieconfiguratie van MongoDB kunt u bepalen wie verbinding kan maken met uw servers en wat hun gebruikerseigenschappen zijn. In een volgend artikel bespreken we hoe u het toegangsniveau van gebruikers kunt beperken door het autorisatiegedeelte van gebruikersbeheer aan te pakken.




  1. Spark-on-HBase:op DataFrame gebaseerde HBase-connector

  2. Aan de slag met Redis Client API's

  3. De nieuwe manier om open source databases te beheren

  4. Wat is Hadoop OutputFormat in MapReduce?