Einführung
Die Verwaltung von Benutzern und die Authentifizierung gehören zu den wichtigsten Verwaltungsaufgaben bei der Verwaltung von MongoDB-Servern. Sie müssen sicherstellen, dass der Server so konfiguriert ist, dass er Ihre Benutzer und Anwendungen richtig identifizieren und Verbindungen oder Vorgänge ablehnen kann, die nicht korrekt authentifiziert werden können.
Um diese Anforderungen zu verwalten, müssen Sie entscheiden können, welche Benutzer Ihr Server benötigt, und diese Konten erstellen. Als Teil dieses Prozesses können Sie die Authentifizierungsdetails so einstellen, dass externer Zugriff unter Verwendung der neuen Identität zugelassen wird.
In diesem Handbuch erklären wir Ihnen, wie Sie Benutzerkonten erstellen, anzeigen und entfernen. Wir gehen darauf ein, wie Sie die Authentifizierung für Ihre Konten einrichten und die Anmeldeinformationen aktualisieren, wenn Sie Ihre Benutzerkennwörter ändern müssen.
Voraussetzungen
Um dieser Anleitung zu folgen, benötigen Sie ein Konto auf einem MongoDB-Server mit den entsprechenden Berechtigungen.
Befehle und Methoden, die wir verwenden werden
Um Benutzer in MongoDB zu erstellen, zu ändern und zu löschen und die Authentifizierung zu konfigurieren, benötigen Sie folgende Kernmethoden:
db.createUser
:Erstellen Sie ein neues MongoDB-Benutzerkontodb.updateUser
:Aktualisieren Sie die Details eines Benutzerkontosdb.changeUserPassword
:das von einem Benutzerkonto verwendete Passwort änderndb.dropUser
:ein MongoDB-Benutzerkonto löschen
Außerdem ist der folgende Datenbankbefehl nützlich, um Informationen über Benutzer auf dem System zu finden:
db.runCommand('usersInfo')
:Informationen zu einem oder mehreren MongoDB-Benutzerkonten anzeigen
Erforderliche Berechtigungen
Um die obigen Befehle auszuführen, müssen Sie sich bei MongoDB mit einem Konto mit einer Reihe verschiedener Berechtigungsaktionen anmelden. Die spezifischen Berechtigungen, die Sie benötigen, hängen von den Befehlen ab, die Sie verwenden müssen.
Um Informationen über andere Benutzer zu erhalten, muss Ihr aktueller Benutzer die folgende Berechtigungsaktion aktiviert haben:
viewUser
Berechtigungsaktion
Um neue Benutzer zu erstellen, müssen für Ihren aktuellen Benutzer die folgenden Berechtigungsaktionen aktiviert sein:
createUser
BerechtigungsaktiongrantRole
Berechtigungsaktion
Um das Kennwort oder die Kontodetails eines Benutzers zu ändern, benötigen Sie möglicherweise die folgenden Berechtigungen:
changeOwnPassword
Berechtigungsaktion, um Ihr eigenes Kontopasswort zu ändernchangeOwnCustomData
Berechtigungsaktion zum Ändern der benutzerdefinierten Daten Ihres eigenen KontoschangePassword
Berechtigungsaktion zum Ändern der Passwörter anderer BenutzerchangeCustomData
Berechtigungsaktion zum Ändern der benutzerdefinierten Daten anderer Benutzer
Wir werden die Rollenverwaltung in diesem Leitfaden nicht behandeln, also die grantRole
und revokeRole
Berechtigungsaktionen sind nicht erforderlich.
Um ein Benutzerkonto zu löschen, muss Ihr aktueller Benutzer die folgende Berechtigungsaktion aktiviert haben:
dropUser
Berechtigungsaktion
Verstehen, wie MongoDB Benutzer und Authentifizierung implementiert
Bevor wir mit dem Erstellen und Verwalten von Konten beginnen, sollten Sie sich etwas Zeit nehmen, um sich damit vertraut zu machen, wie MongoDB diese Informationen definiert und speichert.
In MongoDB sind Benutzerkonten eine Kombination aus dem Benutzernamen des Kontos und einer bestimmten Authentifizierungsdatenbank. Die Authentifizierungsdatenbank ist einfach die Datenbank, in der der Benutzer definiert ist, und impliziert keine Einschränkung des Umfangs oder der Rechte. Authentifizierungsdatenbanken sind reguläre Datenbanken, die zur Verwaltung anderer Daten verwendet werden, und keine speziellen, dedizierten Datenbanken.
Ein Benutzerkontoname muss in seiner Authentifizierungsdatenbank eindeutig sein. Derselbe Benutzername kann jedoch mit einer anderen Authentifizierungsdatenbank wiederverwendet werden, um ein neues, eigenständiges Benutzerkonto zu erstellen.
Aufgrund dieses Designs kann ein Konto nur durch Einbeziehen des Benutzernamens und der Authentifizierungsdatenbank genau identifiziert werden. Um sich bei einem Konto zu authentifizieren, muss man auch in der Lage sein, die mit einem Konto verknüpften Anmeldeinformationen bereitzustellen. Dies ist normalerweise ein Passwort, kann aber auch ein Zertifikat sein.
Wie erstellen Sie Benutzer?
Nachdem wir uns nun angesehen haben, wie MongoDB Benutzerkonten konzipiert, können wir erörtern, wie neue Benutzer erstellt werden. Denken Sie daran, sich bei Ihrem MongoDB-Server mit einem Benutzer anzumelden, der über die entsprechenden Berechtigungen verfügt, um Ihnen zu folgen.
Um einen neuen Benutzer zu erstellen, müssen Sie zuerst zu der Datenbank wechseln, die Sie als Authentifizierungsdatenbank des neuen Benutzers verwenden möchten.
Zunächst können Sie eine Liste der Datenbanken abrufen, die bereits auf Ihrem System konfiguriert sind, indem Sie Folgendes eingeben:
show dbs
admin 0.000GBconfig 0.000GBlocal 0.000GB
Wechseln Sie mit use
zu der Datenbank, mit der der Benutzer verknüpft wird Befehl:
use admin
switched to db admin
Um einen neuen Benutzer zu erstellen, können Sie entweder db.createUser()
verwenden Methode oder Sie können die createUser
verwenden Datenbankbefehl. In beiden Fällen müssen Sie den Benutzernamen übergeben (die user
Feld), Passwort (das pwd
Feld) und ein Array von Rollen, zu denen der Benutzer hinzugefügt werden soll (die roles
key) innerhalb eines user
Objekt.
Um einen neuen Benutzer namens tom
zu erstellen mit einem auf hellothere
gesetzten Passwort mit einem leeren Rollen-Array mithilfe von db.createUser()
-Methode können Sie Folgendes eingeben:
db.createUser({ user: "tom", pwd: "hellothere", roles: []})
Successfully added user: { "user" : "tom", "roles" : [ ] }
Dieselbe Operation mit createUser
Datenbankbefehl würde so aussehen:
db.runCommand({ createUser: "tom", pwd: "hellothere", roles: []})
Successfully added user: { "user" : "tom", "roles" : [ ] }
Die beiden verschiedenen Optionen sind sehr ähnlich, daher zeigen wir im Folgenden nur die Datenbankmethoden, wo zutreffend. Wenn Sie jedoch die Datenbankbefehlssyntax bevorzugen, finden Sie alle zugehörigen Befehle in der MongoDB-Befehlsreferenzdokumentation.
In den obigen Befehlen haben wir das Passwort explizit inline innerhalb des user
definiert Objekt. Um zu verhindern, dass das Passwort protokolliert und abgerufen werden kann, können Sie alternativ den passwordPrompt()
verwenden Methode innerhalb des user
Dokument, damit MongoDB Sie interaktiv zur Eingabe eines Kennworts auffordert, wenn der Befehl ausgeführt wird. Das Passwort ist nicht sichtbar, sodass Ihr Befehlsverlauf sauber ist:
db.createUser({ user: "tom", pwd: passwordPrompt(), roles: []})
Enter password:Successfully added user: { "user" : "tom", "roles" : [ ] }
Denken Sie daran, dass das Passwort weiterhin im Klartext an den Server gesendet wird, wenn Sie TLS/SSL nicht aktiviert haben.
Wie zeigen Sie vorhandene Benutzer an?
Sehen wir uns als Nächstes an, wie Sie Informationen zu vorhandenen Benutzern finden.
Um mehrere Benutzer zurückzugeben, können Sie db.getUsers()
verwenden Methode ein, um alle Benutzer in der aktuellen Datenbank anzuzeigen. Wechseln Sie zunächst zu der Datenbank, die Sie abfragen möchten:
use admin
Verwenden Sie als Nächstes db.getUsers()
Methode, um alle Benutzer zurückzugeben, die der aktuellen Datenbank zugeordnet sind:
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" ] }]
Um zusätzlich die Anmeldeinformationen jedes Benutzers anzuzeigen, übergeben Sie ein Objekt mit showCredentials
an die Methode Schlüssel auf 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=" } }, . . . }]
Um Benutzer abzufragen, die bestimmten Kriterien entsprechen, können Sie ein Objekt übergeben, das einen filter
definiert Schlüssel, der die Übereinstimmungsbedingung definiert.
Zum Beispiel, um Informationen über alle Benutzer in der aktuellen Datenbank zu erhalten, die den root
haben Rolle könnten Sie Folgendes eingeben:
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" ] }]
Um einen bestimmten Benutzer zu erhalten, können Sie db.getUser()
verwenden Methode statt. Dies funktioniert wie db.getUsers()
-Methode, gibt jedoch einen einzelnen Benutzer zurück. Anstatt ein Objekt an die Methode zu übergeben, übergeben Sie einen String mit dem Benutzernamen, den Sie abrufen möchten:
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" ]}
Sie können optional ein zusätzliches args
einfügen -Objekt, mit dem Sie zusätzliche Informationen angeben können, die Sie möchten, indem Sie die folgenden Schlüssel auf true
setzen :
showCredentials
:zeigt Anmeldeinformationen zusätzlich zur regulären AusgabeshowPrivileges
:zeigt zusätzlich zur regulären Ausgabe Berechtigungsinformationen anshowAuthenticationRestrictions
:zeigt zusätzlich zur regulären Ausgabe Authentifizierungseinschränkungen für das Konto an
Beispielsweise können Sie MongoDB anweisen, Ihnen alle oben genannten Informationen bereitzustellen, indem Sie Folgendes eingeben:
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" : [ ]}
Wie ändert man das Passwort für einen MongoDB-Benutzer?
Um das Passwort eines Benutzers zu ändern, können Sie db.changeUserPassword()
verwenden Methode. Auch hier müssen Sie zur Authentifizierungsdatenbank des Benutzers wechseln, bevor Sie den Befehl ausführen.
Das db.changeUserPassword()
-Methode nimmt zwei Argumente entgegen:den Benutzernamen des Kontos, das Sie ändern möchten, und das neue Kennwort für das Konto.
Zum Beispiel, um das Passwort für den Benutzer tom
zu ändern mit dem admin
authentifiziert Datenbank zu secretpassword
, könnten Sie Folgendes eingeben:
use admindb.changeUserPassword("tom", "secretpassword")
Genau wie bei db.createUser()
Methode können Sie die passwordPrompt()
verwenden -Methode für das zweite Argument, anstatt ein Kennwort inline bereitzustellen. MongoDB fordert Sie auf, ein Passwort einzugeben, wenn der Befehl ausgeführt wird:
use admindb.changeUserPassword("tom", passwordPrompt())
Enter password:
Wie ändern Sie andere Benutzerkontodetails?
Um andere mit einem Benutzerkonto verknüpfte Informationen zu ändern, können Sie db.updateUser()
verwenden Methode. Stellen Sie sicher, dass Sie zur Authentifizierungsdatenbank des Benutzers wechseln, bevor Sie seine Details aktualisieren.
Der db.updateUser()
-Methode erfordert, dass Sie den Benutzernamen angeben und dann ein Objekt bereitstellen, das die Daten enthält, die Sie aktualisieren möchten. Jedes Feld, das Sie aktualisieren möchten, wird vollständig durch die neuen Informationen ersetzt. Stellen Sie also sicher, dass Sie sowohl die Originaldaten als auch die neuen Daten in Ihr Objekt aufnehmen, wenn Sie nur neue Informationen anhängen möchten.
Das Objekt, das Sie in den Befehl mit den Änderungsinformationen aufnehmen, kann viele verschiedene Felder enthalten. Gehen wir sie durch:
customData
:Beliebige Daten, die dem Benutzerkonto zugeordnet werden sollen.roles
:Die Rollen, die dem Benutzer gewährt werden. Es ist oft besser,db.grantRolesToUser()
zu verwenden unddb.revokeRolesFromUser()
Methoden zum Steuern der Rollenmitgliedschaft, anstatt mit diesem Schlüssel zu aktualisieren, da Sie Rollen einzeln hinzufügen und entfernen können.pwd
:Das Passwort des Benutzers. Verwenden vondb.ChangeUserPassword()
Methode ist normalerweise einfacher, wenn dies das einzige Feld ist, das aktualisiert werden muss.authenticationRestrictions
:Gibt Einschränkungen für das Konto an, die die IP-Adressen einschränken können, von denen oder zu denen Benutzer eine Verbindung herstellen können. Der Wert dieses Schlüssels ist ein Objekt oder Array, dasclientSource
definiert und oderserverAddress
, die Arrays enthalten, die die gültigen IP-Adressen oder Bereiche angeben. Weitere Informationen zu Authentifizierungseinschränkungen finden Sie in den MongoDB-Dokumenten.mechanisms
:Die spezifischen Authentifizierungsmechanismen, die für Anmeldeinformationen verwendet werden sollen. Kann auf eines oder beide vonSCRAM-SHA-1
eingestellt werden oderSCRAM-SHA-256
, kann aber nur auf eine Teilmenge der aktuellen Mechanismen geändert werden, wenn derzeit kein neues Passwort bereitgestellt wird.passwordDigestor
:Gibt an, welche Komponente das Kennwort des Benutzers verarbeitet. Kann entwederserver
sein (Standard) oderclient
.
Als Beispiel können wir den tom
aktualisieren Konto, das sich gegenüber dem admin
authentifiziert Datenbank so, dass Sie sich nur von demselben Computer aus anmelden können, der den Server selbst hostet, indem Sie die authenticationRestrictions
ändern Feld:
use admindb.updateUser("tom", { authenticationRestrictions: [ { clientSource: ["127.0.0.1", "::1"], serverAddress: ["127.0.0.1", "::1"] } ]})
Wenn Sie nun MongoDB bitten, Ihnen die relevanten Informationen über den Benutzer anzuzeigen, werden zusätzliche Einschränkungen für das Konto angezeigt:
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" : [ ]}
Um diese Einschränkungen aufzuheben, können wir den Befehl erneut mit einem leeren Array ausführen:
use admindb.changeUser("tom", { authenticationRestrictions: []})
Wie löscht man MongoDB-Benutzer?
Um MongoDB-Benutzerkonten zu entfernen, können Sie db.dropUser()
verwenden Methode. Stellen Sie sicher, dass Sie sich mit der Authentifizierungsdatenbank des Benutzers verbinden, bevor Sie ihn entfernen.
Zum Ausführen von db.dropUser()
-Methode müssen Sie den Namen des Benutzers angeben, den Sie entfernen möchten:
db.dropUser("tom")
Nach erfolgreichem Löschen gibt MongoDB true
zurück :
true
Wenn das Konto in der aktuellen Datenbank nicht vorhanden war, wird stattdessen false
zurückgegeben .
Fazit
Mit der Benutzerverwaltungs- und Authentifizierungskonfiguration von MongoDB können Sie steuern, wer sich mit Ihren Servern verbinden kann und welche Benutzereigenschaften sie haben. In einem folgenden Artikel behandeln wir, wie Sie die Zugriffsebene von Benutzern einschränken können, indem Sie den Autorisierungsteil der Benutzerverwaltung angehen.