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ändarkontodb.updateUser
:uppdatera informationen för ett användarkontodb.changeUserPassword
:ändra lösenordet som används av ett användarkontodb.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ärdgrantRole
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ösenordchangeOwnCustomData
behörighetsåtgärd för att ändra ditt eget kontos anpassade datachangePassword
behörighetsåtgärd för att ändra andra användares lösenordchangeCustomData
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 utdatashowPrivileges
:visar behörighetsinformation utöver den vanliga utdatashowAuthenticationRestrictions
: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ändadb.grantRolesToUser()
ochdb.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ändadb.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 definierarclientSource
och ellerserverAddress
, 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 avSCRAM-SHA-1
ellerSCRAM-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 antingenserver
(standard) ellerclient
.
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.