sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur man hanterar användare och autentisering i MongoDB


Introduktion

Hantera användare och autentisering är några av de viktigaste administrationsuppgifterna för att hantera MongoDB-servrar. Du måste se till att servern är konfigurerad för att korrekt kunna identifiera dina användare och applikationer och neka anslutningar eller operationer som inte kan autentiseras korrekt.

För att hantera dessa krav måste du kunna bestämma vilka användare som din server kräver och skapa dessa konton. Som en del av denna process kan du ställa in autentiseringsdetaljerna för att tillåta extern åtkomst med den nya identiteten.

I den här guiden går vi igenom hur du skapar, visar och tar bort användarkonton. Vi kommer att gå igenom hur du ställer in autentisering för dina konton och hur du uppdaterar autentiseringsuppgifterna när du behöver ändra dina användarlösenord.



Förutsättningar

För att följa den här guiden behöver du ett konto på en MongoDB-server med lämpliga rättigheter.


Kommandon och metoder vi kommer att använda

För att skapa, ändra och ta bort användare inom MongoDB och konfigurera autentisering, är kärnmetoderna du behöver:

  • db.createUser :skapa ett nytt MongoDB-användarkonto
  • db.updateUser :uppdatera informationen för ett användarkonto
  • db.changeUserPassword :ändra lösenordet som används av ett användarkonto
  • db.dropUser :radera ett MongoDB-användarkonto

Dessutom är följande databaskommando användbart för att hitta information om användare på systemet:

  • db.runCommand('usersInfo') :visa information om ett eller flera MongoDB-användarkonton


Obligatoriska rättigheter

För att utföra kommandona ovan måste du logga in på MongoDB med ett konto med ett antal olika behörighetsåtgärder. Vilka specifika privilegier du behöver beror på de kommandon du behöver använda.

För att få information om andra användare måste din nuvarande användare ha följande behörighetsåtgärd aktiverad:

  • viewUser behörighetsåtgärd

För att skapa nya användare måste din nuvarande användare ha följande behörighetsåtgärder aktiverade:

  • createUser behörighetsåtgärd
  • grantRole behörighetsåtgärd

För att ändra en användares lösenord eller kontoinformation kan du behöva följande behörigheter:

  • changeOwnPassword behörighetsåtgärd för att ändra ditt eget kontolösenord
  • changeOwnCustomData behörighetsåtgärd för att ändra ditt eget kontos anpassade data
  • changePassword behörighetsåtgärd för att ändra andra användares lösenord
  • changeCustomData behörighetsåtgärd för att ändra andra användares anpassade data

Vi kommer inte att behandla rollhantering i den här guiden, så grantRole och revokeRole behörighetsåtgärder krävs inte.

För att radera ett användarkonto måste din nuvarande användare ha följande behörighetsåtgärd aktiverad:

  • dropUser behörighetsåtgärd



Förstå hur MongoDB implementerar användare och autentisering

Innan vi börjar skapa och hantera konton är det bra att ta lite tid att bekanta oss med hur MongoDB definierar och lagrar denna information.

I MongoDB är användarkonton en kombination av kontots användarnamn tillsammans med en specifik autentiseringsdatabas. Autentiseringsdatabasen är helt enkelt den databas där användaren är definierad och innebär ingen begränsning av omfattning eller rättigheter. Autentiseringsdatabaser är vanliga databaser som används för att hantera andra data och är inte speciella, dedikerade databaser.

Ett användarkontonamn måste vara unikt i dess autentiseringsdatabasen. Men samma användarnamn kan återanvändas med en annan autentiseringsdatabas för att skapa ett nytt, distinkt användarkonto.

Som ett resultat av denna design kan ett konto endast identifieras korrekt genom att inkludera användarnamnet och autentiseringsdatabasen. För att autentisera till ett konto måste man också kunna tillhandahålla de referenser som är kopplade till ett konto. Detta är vanligtvis ett lösenord, men kan också vara ett certifikat.



Hur skapar du användare?

Nu när vi har tagit en titt på hur MongoDB konceptualiserar användarkonton, kan vi diskutera hur man skapar nya användare. Kom ihåg att logga in på din MongoDB-server med en användare som har rätt behörighet att följa med.

För att skapa en ny användare måste du först byta till den databas du vill använda som den nya användarens autentiseringsdatabas.

Först kan du få en lista över de databaser som redan är konfigurerade på ditt system genom att skriva:

show dbs
admin   0.000GBconfig  0.000GBlocal   0.000GB

Byt till databasen som användaren kommer att associeras med med hjälp av use kommando:

use admin
switched to db admin

För att skapa en ny användare kan du använda antingen db.createUser() metoden eller så kan du använda createUser databaskommando. I vilket fall som helst måste du skicka användarnamnet (user). fält), lösenord (den pwd fältet) och en uppsättning roller som användaren ska läggas till (roles nyckel) inom en user objekt.

För att skapa en ny användare som heter tom med ett lösenord inställt på hellothere med en tom roller array med db.createUser() metod kan du skriva:

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

Samma operation med createUser databaskommandot skulle se ut så här:

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

De två olika alternativen är väldigt lika, så vi kommer bara att visa databasmetoderna där det är tillämpligt framöver. Men om du föredrar syntaxen för databaskommandot kan du hitta vart och ett av de associerade kommandona i referensdokumentationen för MongoDB-kommandot.

I ovanstående kommandon definierade vi uttryckligen lösenordet inline inom user objekt. För att förhindra att lösenordet loggas och kan hämtas kan du alternativt använda passwordPrompt() metod inom user dokument för att få MongoDB interaktivt att fråga dig om ett lösenord när kommandot körs. Lösenordet kommer inte att vara synligt, så din kommandohistorik kommer att vara ren:

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

Tänk på att lösenordet fortfarande kommer att skickas till servern i vanlig text om du inte har TLS/SSL aktiverat.



Hur visar du befintliga användare?

Låt oss sedan ta en titt på hur man hittar information om befintliga användare.

För att returnera flera användare kan du använda db.getUsers() metod på för att visa alla användare i den aktuella databasen. Byt först till databasen du är intresserad av att fråga:

use admin

Använd sedan db.getUsers() metod för att returnera alla användare som är associerade med den aktuella databasen:

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

För att ytterligare visa varje användares autentiseringsinformation, skicka ett objekt till metoden med showCredentials nyckeln till 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="                        }                },                . . .        }]

För att fråga efter användare som matchar vissa kriterier kan du skicka ett objekt som definierar ett filter nyckel som definierar matchningsvillkor.

Till exempel för att få information om alla användare i den aktuella databasen som har root roll kan du skriva:

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

För att få en specifik användare kan du använda db.getUser() metod istället. Detta fungerar som db.getUsers() metod, men returnerar en enskild användare. Istället för att skicka ett objekt till metoden skickar du en sträng som innehåller användarnamnet du vill hämta:

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 valfritt inkludera en extra args objekt som låter dig specificera ytterligare information du vill ha genom att ställa in följande nycklar till true :

  • showCredentials :visar autentiseringsinformation utöver den vanliga utdata
  • showPrivileges :visar behörighetsinformation utöver den vanliga utdata
  • showAuthenticationRestrictions :visar autentiseringsbegränsningar för kontot utöver den vanliga utdata

Du kan till exempel säga till MongoDB att ge dig all ovanstående information genom att skriva:

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


Hur ändrar du lösenordet för en MongoDB-användare?

För att ändra en användares lösenord kan du använda db.changeUserPassword() metod. Återigen måste du byta till användarens autentiseringsdatabas innan du kör kommandot.

db.changeUserPassword() Metoden tar två argument:användarnamnet på kontot du vill ändra och det nya lösenordet för kontot.

Till exempel för att ändra lösenordet för användaren tom autentiserad med admin databas till secretpassword , kan du skriva:

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

Precis som med db.createUser() metoden kan du använda passwordPrompt() metod för det andra argumentet istället för att tillhandahålla ett lösenord inline. MongoDB kommer att uppmana dig att ange ett lösenord när kommandot körs:

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


Hur ändrar du andra användarkontodetaljer?

För att ändra annan information som är kopplad till ett användarkonto kan du använda db.updateUser() metod. Se till att du byter till användarens autentiseringsdatabas innan du uppdaterar deras uppgifter.

db.updateUser() metoden kräver att du anger användarnamnet och sedan tillhandahåller ett objekt som innehåller de data du vill uppdatera. Alla fält du väljer att uppdatera kommer att ersättas helt med den nya informationen, så se till att inkludera den ursprungliga informationen såväl som den nya informationen i ditt objekt om du bara hoppas på att lägga till ny information.

Objektet som du inkluderar i kommandot med ändringsinformationen kan innehålla många olika fält. Låt oss gå igenom dem:

  • customData :Alla godtyckliga data som ska kopplas till användarkontot.
  • roles :Rollerna som användaren tilldelas. Det är ofta bättre att använda db.grantRolesToUser() och db.revokeRolesFromUser() metoder för att kontrollera rollmedlemskap snarare än att uppdatera med den här nyckeln eftersom du kan lägga till och ta bort roller individuellt.
  • pwd :Användarens lösenord. Använda db.ChangeUserPassword() Metoden är vanligtvis enklare om det är det enda fältet som behöver uppdateras.
  • authenticationRestrictions :Anger begränsningar för kontot som kan begränsa IP-adresserna som användare kan ansluta från eller till. Värdet på denna nyckel är ett objekt eller en array som definierar clientSource och eller serverAddress , som innehåller matriser som anger giltiga IP-adresser eller intervall. Ta reda på mer i MongoDB-dokumenten om autentiseringsbegränsningar.
  • mechanisms :De specifika autentiseringsmekanismerna som ska användas för autentiseringsuppgifter. Kan ställas in på antingen en eller båda av SCRAM-SHA-1 eller SCRAM-SHA-256 , men kan bara ändras till en delmängd av de nuvarande mekanismerna om ett nytt lösenord för närvarande inte tillhandahålls.
  • passwordDigestor :Anger vilken komponent som behandlar användarens lösenord. Kan vara antingen server (standard) eller client .

Som ett exempel kan vi uppdatera tom konto som autentiserar mot admin databas för att bara kunna logga in från samma dator som är värd för själva servern genom att ändra authenticationRestrictions fält:

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

Om du nu ber MongoDB att visa dig relevant information om användaren, kommer det att visa ytterligare begränsningar för kontot:

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

För att återkalla dessa begränsningar kan vi köra kommandot igen med en tom array:

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


Hur tar du bort MongoDB-användare?

För att ta bort MongoDB-användarkonton kan du använda db.dropUser() metod. Se till att ansluta till användarens autentiseringsdatabas innan du tar bort dem.

För att köra db.dropUser() metod måste du ange namnet på användaren du vill ta bort:

db.dropUser("tom")

Efter lyckad radering kommer MongoDB att returnera true :

true

Om kontot inte fanns i den aktuella databasen kommer det istället att returnera false .



Slutsats

MongoDB:s användarhanterings- och autentiseringskonfiguration låter dig kontrollera vem som kan ansluta till dina servrar och vad deras användaregenskaper är. I en följande artikel kommer vi att ta upp hur man begränsar åtkomstnivån som användare har genom att ta itu med behörighetsdelen av användarhantering.




  1. Skapa ett ISO-datumobjekt i javascript

  2. Vad är det rekommenderade tillvägagångssättet för databaser med flera hyresgäster i MongoDB?

  3. Manuell tillförsel av argument till en MongoDB-fråga för att stödja sorteringsfunktionen (för skiftlägesokänsligt index)

  4. Mongoose drar ObjectId från arrayen