sql >> Database teknologi >  >> NoSQL >> MongoDB

Sådan administreres brugere og godkendelse i MongoDB


Introduktion

Administration af brugere og godkendelse er nogle af de vigtigste administrationsopgaver ved styring af MongoDB-servere. Du skal sikre dig, at serveren er konfigureret til at være i stand til korrekt at identificere dine brugere og applikationer og afvise forbindelser eller operationer, der ikke er i stand til at godkende korrekt.

For at administrere disse krav skal du være i stand til at bestemme, hvilke brugere din server kræver, og oprette disse konti. Som en del af denne proces kan du indstille godkendelsesdetaljerne til at tillade ekstern adgang ved hjælp af den nye identitet.

I denne vejledning vil vi gennemgå, hvordan du opretter, får vist og fjerner brugerkonti. Vi vil gennemgå, hvordan du opsætter godkendelse for dine konti, og hvordan du opdaterer legitimationsoplysningerne, når du skal ændre dine brugeradgangskoder.



Forudsætninger

For at følge denne vejledning skal du have en konto på en MongoDB-server med de relevante privilegier.


Kommandoer og metoder, vi vil bruge

For at oprette, ændre og slette brugere i MongoDB og konfigurere godkendelse er de kernemetoder, du har brug for:

  • db.createUser :opret en ny MongoDB-brugerkonto
  • db.updateUser :Opdater detaljerne for en brugerkonto
  • db.changeUserPassword :ændre adgangskoden, der bruges af en brugerkonto
  • db.dropUser :slet en MongoDB-brugerkonto

Derudover er følgende databasekommando nyttig til at finde information om brugere på systemet:

  • db.runCommand('usersInfo') :vis information om en eller flere MongoDB-brugerkonti


Påkrævede rettigheder

For at udføre kommandoerne ovenfor skal du logge ind på MongoDB med en konto med en række forskellige privilegiehandlinger. De specifikke privilegier, du har brug for, afhænger af de kommandoer, du skal bruge.

For at få information om andre brugere skal din nuværende bruger have følgende privilegiehandling aktiveret:

  • viewUser privilegiehandling

For at oprette nye brugere skal din nuværende bruger have følgende privilegiehandlinger aktiveret:

  • createUser privilegiehandling
  • grantRole privilegiehandling

For at ændre en brugers adgangskode eller kontooplysninger skal du muligvis have følgende privilegier:

  • changeOwnPassword privilegiehandling for at ændre din egen kontoadgangskode
  • changeOwnCustomData privilegiehandling for at ændre din egen kontos tilpassede data
  • changePassword privilegiehandling for at ændre andre brugeres adgangskoder
  • changeCustomData privilegiehandling for at ændre andre brugeres tilpassede data

Vi vil ikke dække rollestyring i denne vejledning, så grantRole og revokeRole privilegiehandlinger er ikke påkrævet.

For at slette en brugerkonto skal din nuværende bruger have følgende privilegiehandling aktiveret:

  • dropUser privilegiehandling



Forstå hvordan MongoDB implementerer brugere og godkendelse

Før vi begynder at oprette og administrere konti, er det nyttigt at bruge lidt tid på at blive fortrolig med, hvordan MongoDB definerer og gemmer disse oplysninger.

I MongoDB er brugerkonti en kombination af kontobrugernavnet sammen med en specifik godkendelsesdatabase. Autentificeringsdatabasen er simpelthen den database, hvor brugeren er defineret og indebærer ikke en begrænsning af omfang eller rettigheder. Godkendelsesdatabaser er almindelige databaser, der bruges til at administrere andre data og er ikke specielle, dedikerede databaser.

Et brugerkontonavn skal være unikt i dets godkendelsesdatabase. Det samme brugernavn kan dog genbruges med en anden godkendelsesdatabase for at oprette en ny, særskilt brugerkonto.

Som et resultat af dette design kan en konto kun identificeres nøjagtigt ved at inkludere brugernavnet og godkendelsesdatabasen. For at autentificere til en konto skal man også være i stand til at give de legitimationsoplysninger, der er knyttet til en konto. Dette er normalt en adgangskode, men kan også være et certifikat.



Hvordan opretter du brugere?

Nu hvor vi har taget et kig på, hvordan MongoDB konceptualiserer brugerkonti, kan vi diskutere, hvordan man opretter nye brugere. Husk at logge ind på din MongoDB-server med en bruger, der har de nødvendige rettigheder til at følge med.

For at oprette en ny bruger skal du først skifte til den database, du vil bruge som den nye brugers godkendelsesdatabase.

Først kan du få en liste over de databaser, der allerede er konfigureret på dit system ved at skrive:

show dbs
admin   0.000GBconfig  0.000GBlocal   0.000GB

Skift til databasen, som brugeren vil blive knyttet til ved hjælp af use kommando:

use admin
switched to db admin

For at oprette en ny bruger kan du bruge enten db.createUser() metode, eller du kan bruge createUser database kommando. Uanset hvad, skal du videregive brugernavnet (user felt), adgangskode (pwd felt), og en række roller, som brugeren skal føjes til (roles nøgle) inden for en user objekt.

For at oprette en ny bruger kaldet tom med en adgangskode sat til hellothere med et tomt roller-array ved hjælp af db.createUser() metode, kan du skrive:

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

Den samme handling ved hjælp af createUser databasekommando ville se sådan ud:

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

De to forskellige muligheder er meget ens, så vi vil kun vise databasemetoderne, hvor det er relevant fremover. Men hvis du foretrækker databasekommandosyntaksen, kan du finde hver af de tilknyttede kommandoer i MongoDB kommandoreferencedokumentationen.

I ovenstående kommandoer definerede vi eksplicit adgangskoden inline i user objekt. For at forhindre adgangskoden i at blive logget og genfindes, kan du alternativt bruge passwordPrompt() metode i user dokument for at få MongoDB interaktivt til at bede dig om en adgangskode, når kommandoen køres. Adgangskoden vil ikke være synlig, så din kommandohistorik vil være ren:

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

Husk, at adgangskoden stadig vil blive sendt til serveren i almindelig tekst, hvis du ikke har TLS/SSL aktiveret.



Hvordan viser du eksisterende brugere?

Lad os derefter tage et kig på, hvordan man finder information om de eksisterende brugere.

For at returnere flere brugere kan du bruge db.getUsers() metode til at vise alle brugere i den aktuelle database. Skift først til den database, du er interesseret i at forespørge på:

use admin

Brug derefter db.getUsers() metode til at returnere alle de brugere, der er knyttet til den aktuelle database:

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

For yderligere at vise hver brugers legitimationsoplysninger skal du videregive et objekt til metoden med showCredentials nøglen til 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="                        }                },                . . .        }]

For at forespørge efter brugere, der matcher bestemte kriterier, kan du sende et objekt, der definerer et filter nøgle, der definerer matchende betingelse.

For eksempel for at få information om alle brugere i den aktuelle database, der har root rolle, kan du skrive:

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

For at få en bestemt bruger kan du bruge db.getUser() metode i stedet for. Dette fungerer som db.getUsers() metode, men returnerer en enkelt bruger. I stedet for at sende et objekt til metoden, sender du en streng, der indeholder det brugernavn, du ønsker at hente:

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

Du kan eventuelt inkludere en ekstra args objekt, der giver dig mulighed for at angive yderligere oplysninger, du ønsker, ved at indstille følgende taster til true :

  • showCredentials :viser legitimationsoplysninger ud over det almindelige output
  • showPrivileges :viser privilegieoplysninger ud over det almindelige output
  • showAuthenticationRestrictions :viser godkendelsesbegrænsninger på kontoen ud over det almindelige output

For eksempel kan du bede MongoDB om at give dig alle ovenstående oplysninger ved at skrive:

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


Hvordan ændrer du adgangskoden for en MongoDB-bruger?

For at ændre en brugers adgangskode kan du bruge db.changeUserPassword() metode. Igen skal du skifte til brugerens godkendelsesdatabase, før du udfører kommandoen.

db.changeUserPassword() metoden tager to argumenter:brugernavnet på den konto, du ønsker at ændre, og den nye adgangskode til kontoen.

For eksempel for at ændre adgangskoden for brugeren tom godkendt med admin database til secretpassword , kan du skrive:

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

Ligesom med db.createUser() metode, kan du bruge passwordPrompt() metode til det andet argument i stedet for at angive en adgangskode inline. MongoDB vil bede dig om at indtaste en adgangskode, når kommandoen udføres:

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


Hvordan ændrer du andre brugerkontooplysninger?

For at ændre andre oplysninger knyttet til en brugerkonto kan du bruge db.updateUser() metode. Sørg for at skifte til brugerens godkendelsesdatabase, før du opdaterer deres detaljer.

db.updateUser() metode kræver, at du angiver brugernavnet og derefter angiver et objekt, der indeholder de data, du ønsker at opdatere. Ethvert felt, du vælger at opdatere, vil blive fuldstændig erstattet med de nye oplysninger, så sørg for at inkludere de originale data såvel som de nye data i dit objekt, hvis du kun håber at tilføje nye oplysninger.

Objektet, som du inkluderer i kommandoen med ændringsoplysningerne, kan indeholde mange forskellige felter. Lad os gennemgå dem:

  • customData :Eventuelle vilkårlige data, der skal knyttes til brugerkontoen.
  • roles :De roller, som brugeren er tildelt. Det er ofte bedre at bruge db.grantRolesToUser() og db.revokeRolesFromUser() metoder til at kontrollere rollemedlemskab i stedet for at opdatere med denne nøgle, da du kan tilføje og fjerne roller individuelt.
  • pwd :Brugerens adgangskode. Brug af db.ChangeUserPassword() metoden er normalt nemmere, hvis det er det eneste felt, der skal opdateres.
  • authenticationRestrictions :Specificerer begrænsninger for kontoen, der kan begrænse de IP-adresser, brugere kan oprette forbindelse fra eller til. Værdien af ​​denne nøgle er et objekt eller et array, der definerer clientSource og eller serverAddress , som indeholder arrays, der angiver de gyldige IP-adresser eller intervaller. Få mere at vide i MongoDB-dokumenterne om godkendelsesbegrænsninger.
  • mechanisms :De specifikke godkendelsesmekanismer, der skal bruges til legitimationsoplysninger. Kan indstilles til enten den ene eller begge SCRAM-SHA-1 eller SCRAM-SHA-256 , men kan kun ændres til en undergruppe af de nuværende mekanismer, hvis der ikke leveres en ny adgangskode i øjeblikket.
  • passwordDigestor :Specificerer, hvilken komponent der behandler brugerens adgangskode. Kan være enten server (standard) eller client .

Som et eksempel kan vi opdatere tom konto, der godkendes mod admin databasen for kun at kunne logge på fra den samme computer, der er vært for selve serveren ved at ændre authenticationRestrictions felt:

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

Hvis du nu beder MongoDB om at vise dig de relevante oplysninger om brugeren, vil den vise yderligere begrænsninger for kontoen:

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

For at tilbagekalde disse begrænsninger kan vi køre kommandoen igen med et tomt array:

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


Hvordan sletter du MongoDB-brugere?

For at fjerne MongoDB-brugerkonti kan du bruge db.dropUser() metode. Sørg for at oprette forbindelse til brugerens godkendelsesdatabase, før du fjerner dem.

For at udføre db.dropUser() metode, skal du angive navnet på den bruger, du ønsker at fjerne:

db.dropUser("tom")

Efter vellykket sletning vil MongoDB returnere true :

true

Hvis kontoen ikke fandtes i den aktuelle database, vil den i stedet returnere false .



Konklusion

MongoDBs brugerstyrings- og godkendelseskonfiguration giver dig mulighed for at kontrollere, hvem der kan oprette forbindelse til dine servere, og hvad deres brugeregenskaber er. I en følgende artikel vil vi dække, hvordan man begrænser det adgangsniveau, som brugere har, ved at håndtere autorisationsdelen af ​​brugeradministration.




  1. Hvordan defineres TTL for redis-streams?

  2. MongoDb lukker ned med kode 100

  3. MongoDB / Pymongo-forespørgsel med Datetime

  4. NoSQL Trends – MongoDB, Cassandra, CouchDB &Riak