Manager, Developer Education
Eine frühere Version dieser Anleitung wurde von Melissa Anderson verfasst.
MongoDB , auch als Mongo bekannt, ist eine Open-Source-Dokumentendatenbank, die in vielen modernen Webanwendungen verwendet wird. Sie ist als NoSQL-Datenbank klassifiziert, weil sie sich nicht auf eine traditionelle tabellenbasierte relationale Datenbankstruktur stützt. Stattdessen verwendet sie JSON-ähnliche Dokumente mit dynamischen Schemas.
Bei MongoDB ist Authentifizierung nicht standardmäßig aktiviert. Das bedeutet, dass jeder Benutzer mit Zugriff auf den Server, auf dem die Datenbank installiert ist, ohne Einschränkungen Daten hinzufügen und löschen kann. Zur Beseitigung dieser Schwachstelle leitet Sie dieses Tutorial durch das Erstellen eines administrativen Benutzers und das Aktivieren der Authentifizierung. Dann werden Sie testen, ob nur dieser administrative Benutzer Zugriff auf die Datenbank hat.
Um dieses Tutorial zu absolvieren, benötigen Sie Folgendes:
Seit der Veröffentlichung von Version 3.0 ist das MongoDB-Daemon so konfiguriert, dass es Verbindungen nur aus dem lokalen Unix-Socket akzeptiert und nicht automatisch für das breitere Internet geöffnet ist. Authentifizierung ist dennoch standardmäßig deaktiviert. Das bedeutet, dass alle Benutzer, die Zugriff auf den Server haben, auf dem MongoDB installiert ist, auch über vollständigen Zugriff auf die Datenbanken verfügen.
Als ersten Schritt zum Beseitigen dieser Schwachstelle erstellen Sie einen administrativen Benutzer. Später aktivieren Sie Authentifizierung und stellen als der administrative Benutzer eine Verbindung her, um auf die Datenbank zuzugreifen.
Zum Hinzufügen eines administrativen Benutzers müssen Sie zunächst eine Verbindung mit der Mongo-Shell herstellen. Da Authentifizierung deaktiviert ist, können Sie dies mit dem Befehl mongo
ohne jegliche anderen Optionen tun:
- mongo
Es gibt eine Ausgabe über der Mongo-Shell-Eingabeaufforderung. Da Sie Authentifizierung noch nicht aktiviert haben, umfasst dies eine Warnung darüber, dass Zugriffskontrolle für die Datenbank nicht aktiviert ist und der Zugriff zum Lesen und Schreiben auf Daten und die Konfiguration der Datenbank uneingeschränkt ist:
OutputMongoDB shell version v4.4.0
. . .
2020-06-09T13:26:51.391+0000 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
2020-06-09T13:26:51.391+0000 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.
. . .
>
Diese Warnungen verschwinden, wenn Sie Authentifizierung aktivieren. Vorerst bedeuten sie aber, dass jeder, der auf Ihren Ubuntu-Server zugreifen kann, auch die Kontrolle über Ihre Datenbank übernehmen kann.
Führen Sie zur Veranschaulichung den Befehl show dbs
aus:
- show dbs
Dieser Befehl gibt eine Liste aller Datenbanken auf dem Server zurück. Wenn Authentifizierung aktiviert ist, ändert sich die Liste jedoch je nach Rolle des Mongo-Benutzers oder Zugriffsstufe auf bestimmte Datenbanken. Da Authentifizierung aber deaktiviert ist, wird jede Datenbank zurückgegeben, die sich derzeit im System befindet (ohne Einschränkungen):
Outputadmin 0.000GB
config 0.000GB
local 0.000GB
In dieser Beispielausgabe erscheinen nur die Standarddatenbanken. Wenn Sie in Ihrem System jedoch über Datenbanken verfügen, die vertrauliche Daten enthalten, können beliebige Benutzer sie mit diesem Befehl finden.
Zur Beseitigung dieser Schwachstelle geht es in diesem Schritt um das Hinzufügen eines administrativen Benutzers. Dazu müssen Sie zunächst eine Verbindung mit der admin
-Datenbank herstellen. Hier werden Informationen über Benutzer wie deren Benutzernamen, Passwörter und Rollen gespeichert:
- use admin
Outputswitched to db admin
MongoDB wird zusammen mit einer Reihe von JavaScript-basierten Shell-Methoden installiert, die Sie zur Verwaltung Ihrer Datenbank verwenden können. Eine von ihnen, die Methode db.createUser
, dient zur Erstellung neuer Benutzer in der Datenbank, in der die Methode ausgeführt wird.
Initiieren Sie die Methode db.createUser
:
- db.createUser(
Diese Methode erfordert die Angabe eines Benutzernamens und eines Passworts für den Benutzer sowie der Rollen, die der Benutzer haben soll. Erinnern Sie sich daran, dass MongoDB Daten in JSON-ähnlichen Dokumenten speichert. Wenn Sie einen neuen Benutzer erstellen, erstellen Sie also lediglich ein Dokument, in dem die entsprechenden Benutzerdaten als einzelne Felder gespeichert werden.
Wie bei Objekten in JSON beginnen und enden Dokumente in MongoDB mit geschweiften Klammern ({
und }
). Um einen Benutzer hinzuzufügen, geben Sie eine öffnende geschweifte Klammer ein:
Anmerkung: Mongo registriert die Methode db.createUser
erst als abgeschlossen, wenn Sie eine schließende Klammer eingeben. Bis dahin ändert sich die Eingabeaufforderung von einem Größer-als-Zeichen (>
) in ein Auslassungszeichen (...
).
- {
Geben Sie als Nächstes ein user:
-Feld mit dem gewünschten Benutzernamen als Wert in doppelten Anführungszeichen gefolgt von einem Komma ein. Das folgende Beispiel gibt den Benutzernamen AdminSammy an, Sie können aber einen beliebigen Benutzernamen eingeben:
- user: "AdminSammy",
Geben Sie als Nächstes ein pwd
-Feld mit der Methode passwordPrompt()
als Wert ein. Wenn Sie die Methode db.createUser
ausführen, stellt die Methode passwordPrompt()
eine Eingabeaufforderung bereit, in die Sie Ihr Passwort eingeben müssen. Dies ist sicherer als die Alternative, bei der Sie das Passwort in Klartext ausschreiben, wie Sie es bei Ihrem Benutzernamen getan haben.
Anmerkung: Die Methode passwordPrompt()
ist nur mit MongoDB-Versionen 4.2 und höher kompatibel. Wenn Sie eine ältere Version von Mongo verwenden, müssen Sie Ihr Passwort in Klartext ausschreiben, ähnlich wie bei Ihrem Benutzernamen:
- pwd: "password",
Lassen Sie auf dieses Feld ein Komma folgen:
- pwd: passwordPrompt(),
Geben Sie dann die Rollen ein, die der administrative Benutzer haben soll. Da Sie einen administrativen Benutzer erstellen, sollten Sie ihm mindestens die Rolle userAdminAnyDatabase
für die admin
-Datenbank gewähren. Damit kann der administrative Benutzer neue Benutzer und Rollen erstellen sowie modifizieren. Da der administrative Benutzer diese Rolle in der admin
-Datenbank hat, erhält er auch Superuser-Zugriff auf das gesamte Cluster.
Außerdem wird dem administrativen Benutzer im folgenden Beispiel die Rolle readWriteAnyDatabase
gewährt. Dadurch erhält der administrative Benutzer die Möglichkeit, Daten in jeder beliebigen Datenbank im Cluster zu lesen und zu ändern. Ausgenommen davon sind die Datenbanken config
und local
, die meist der internen Verwendung dienen:
- roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
Geben Sie danach eine schließende geschweifte Klammer ein, um das Ende des Dokuments zu markieren:
- }
Geben Sie dann eine schließende Klammer ein, um die Methode db.createUser
zu schließen und auszuführen:
- )
Insgesamt sollte Ihre Methode db.createUser
so aussehen:
> db.createUser(
... {
... user: "AdminSammy",
... pwd: passwordPrompt(),
... roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
... }
... )
Wenn die gesamte Zeilensyntax korrekt ist, wird die Methode ordnungsgemäß ausgeführt und Sie werden dazu aufgefordert, ein Passwort einzugeben:
OutputEnter password:
Geben Sie ein starkes Passwort Ihrer Wahl ein. Dann erhalten Sie eine Bestätigung, dass der Benutzer hinzugefügt wurde:
OutputSuccessfully added user: {
"user" : "AdminSammy",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
},
"readWriteAnyDatabase"
]
}
Nun können Sie den MongoDB-Client beenden:
- exit
An dieser Stelle kann Ihr Benutzer Anmeldedaten eingeben. Das wird jedoch erst obligatorisch, wenn Sie Authentifizierung aktivieren und das MongoDB-Daemon neu starten.
Um Authentifizierung zu aktivieren, müssen Sie mongod.conf
, die Konfigurationsdatei von MongoDB, bearbeiten. Wenn Sie den Mongo-Dienst aktivieren und neu starten, können Benutzer weiterhin eine Verbindung zur Datenbank herstellen, ohne sich zu authentifizieren. Sie können Daten jedoch erst dann lesen oder ändern, nachdem sie einen richtigen Benutzernamen und ein richtiges Passwort eingegeben haben.
Öffnen Sie die Konfigurationsdatei mit Ihrem bevorzugten Texteditor. Wir verwenden hier nano
:
- sudo nano /etc/mongod.conf
Scrollen Sie nach unten, um den auskommentierten Abschnitt security
zu finden:
. . .
#security:
#operationProfiling:
. . .
Heben Sie die Kommentierung dieser Zeile auf, indem Sie das Doppelkreuzzeichen (#
) entfernen:
. . .
security:
#operationProfiling:
. . .
Fügen Sie dann den Parameter authorization
hinzu und setzen Sie ihn auf "enabled"
. Wenn Sie damit fertig sind, sollten die Zeilen wie folgt aussehen:
. . .
security:
authorization: "enabled"
. . .
Beachten Sie, dass die Zeile security:
am Anfang keine Leerzeichen aufweist, während die Zeile authorization:
um zwei Leerzeichen eingerückt ist.
Nach dem Hinzufügen dieser Zeilen speichern und schließen Sie die Datei. Wenn Sie zum Bearbeiten der Datei nano
verwendet haben, drücken Sie dazu Strg + X
, Y
und dann ENTER
.
Starten Sie dann das Daemon neu, um die neuen Änderungen anzuwenden:
- sudo systemctl restart mongod
Als Nächstes überprüfen Sie den Status des Diensts, um sicherzustellen, dass er richtig neu gestartet wurde:
- sudo systemctl status mongod
Wenn der Befehl restart
erfolgreich war, erhalten Sie eine Ausgabe, die angibt, dass der Dienst mongod
aktiv ist und vor kurzem gestartet wurde:
Output● mongod.service - MongoDB Database Server
Loaded: loaded (/lib/systemd/system/mongod.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2020-06-09 22:06:20 UTC; 7s ago
Docs: https://docs.mongodb.org/manual
Main PID: 15370 (mongod)
Memory: 170.1M
CGroup: /system.slice/mongod.service
└─15370 /usr/bin/mongod --config /etc/mongod.conf
Jun 09 22:06:20 your_host systemd[1]: Started MongoDB Database Server.
Nachdem Sie sich vergewissert haben, dass das Daemon ordnungsgemäß ausgeführt wird, können Sie nun testen, ob die von Ihnen hinzugefügte Authentifzierungseinstellung wie erwartet funktioniert.
Um zu testen, ob die im vorherigen Schritt hinzugefügten Authentifizierungsanforderungen richtig funktionieren, stellen Sie eine Verbindung her, ohne Anmeldedaten anzugeben. So können Sie prüfen, ob Ihre Möglichkeiten tatsächlich eingeschränkt sind:
- mongo
Nachdem Sie Authentifizierung aktiviert haben, erscheint nun keine der zuvor angezeigten Warnungen mehr:
OutputMongoDB shell version v4.4.0
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("5d50ed96-f7e1-493a-b4da-076067b2d898") }
MongoDB server version: 4.4.0
>
Vergewissern Sie sich, dass Ihr Zugriff eingeschränkt ist, indem Sie erneut den Befehl show dbs
ausführen:
- show dbs
Rufen Sie sich aus Schritt 1 in Erinnerung, dass es mindestens einige Standarddatenbanken auf Ihrem Server gibt. In diesem Fall erzeugt der Befehl jedoch keine Ausgabe, da Sie sich nicht als privilegierter Benutzer authentifiziert haben.
Da der Befehl keine Informationen zurückgibt, kann man ruhig sagen, dass die Authentifizierungseinstellung wie erwartet funktioniert. Sie werden auch keine Benutzer erstellen oder andere privilegierte Aufgaben ausführen können, ohne sich zunächst zu authentifizieren.
Fahren Sie fort und schließen Sie die MongoDB-Shell:
Anmerkung: Anstatt den folgenden exit
-Befehl auszuführen, wie Sie es zuvor in Schritt 1 getan haben, ist eine alternative Methode zum Schließen der Shell das simple Drücken auf Strg+C
.
- exit
Als Nächstes stellen Sie sicher, dass sich Ihr administrativer Benutzer richtig authentifizieren kann, indem Sie als dieser Benutzer folgenden mongo
-Befehl zum Herstellen einer Verbindung ausführen. Der Befehl enthält das Flag -u
, das dem Namen des Benutzers, als der Sie eine Verbindung herstellen möchten, vorausgeht. Sorgen Sie dafür, dass Sie AdminSammy durch den Benutzernamen Ihres eigenen administrativen Benutzers ersetzen. Außerdem enthält der Befehl das Flag -p
, das Sie zur Eingabe des Passworts des Benutzers auffordert, und gibt admin
als Authentifizierungsdatenbank an, in der der angegebene Benutzername erstellt wurde:
- mongo -u AdminSammy -p --authenticationDatabase admin
Geben Sie das Passwort des Benutzers ein, wenn Sie dazu aufgefordert werden, um zur Shell zu gelangen. Versuchen Sie es hier erneut mit dem Befehl show dbs
:
- show dbs
Da Sie richtig authentifiziert haben, gibt der Befehl diesmal eine Liste aller Datenbanken zurück, die sich derzeit auf dem Server befinden:
Outputadmin 0.000GB
config 0.000GB
local 0.000GB
Das bestätigt, dass Authentifizierung erfolgreich aktiviert wurde.
Durch Ausführung der Schritte in diesem Leitfaden haben Sie einen administrativen MongoDB-Benutzer eingerichtet, den Sie zum Erstellen und Ändern von neuen Benutzern und Rollen verwenden sowie zum sonstigen Verwalten Ihrer MongoDB-Instanz verwenden können. Außerdem haben Sie Ihre MongoDB-Instanz so konfiguriert, dass sich Benutzer mit einem gültigen Benutzernamen und einem Passwort authentifizieren müssen, bevor sie mit Daten interagieren können.
Weitere Informationen zum Verwalten von MongoDB-Benutzern finden Sie in der offiziellen Dokumentation zu diesem Thema. Vielleicht wollen Sie auch mehr über die Funktionsweise von Authentifizierung in MongoDB erfahren.
Wenn Sie mit Ihrer MongoDB-Instanz auch Remoteinteraktionen planen, können Sie unserem Leitfaden zum Konfigurieren von Remotezugriff für MongoDB unter Ubuntu 20.04 folgen.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!