MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

So verwalten Sie Benutzer und Authentifizierung in MongoDB


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-Benutzerkonto
  • db.updateUser :Aktualisieren Sie die Details eines Benutzerkontos
  • db.changeUserPassword :das von einem Benutzerkonto verwendete Passwort ändern
  • db.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 Berechtigungsaktion
  • grantRole 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 ändern
  • changeOwnCustomData Berechtigungsaktion zum Ändern der benutzerdefinierten Daten Ihres eigenen Kontos
  • changePassword Berechtigungsaktion zum Ändern der Passwörter anderer Benutzer
  • changeCustomData 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 Ausgabe
  • showPrivileges :zeigt zusätzlich zur regulären Ausgabe Berechtigungsinformationen an
  • showAuthenticationRestrictions :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 und db.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 von db.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, das clientSource definiert und oder serverAddress , 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 von SCRAM-SHA-1 eingestellt werden oder SCRAM-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 entweder server sein (Standard) oder client .

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.