Tutorial

Sichern von MongoDB unter Ubuntu 20.04

MongoDBUbuntuSecurityNoSQLDatabasesUbuntu 20.04

Eine frühere Version dieser Anleitung wurde von Melissa Anderson verfasst.

Einführung

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.

Voraussetzungen

Um dieses Tutorial zu absolvieren, benötigen Sie Folgendes:

  • Einen Server, auf dem Ubuntu 20.04 ausgeführt wird. Dieser Server sollte über einen administrativen non-root user und eine mit UFW konfigurierte Firewall verfügen. Sie können dies einrichten, indem Sie unserem Leitfaden zur Ersteinrichtung des Servers mit Ubuntu 20.04 folgen.
  • MongoDB, das auf Ihrem Server installiert ist. Dieses Tutorial wurde mit MongoDB-Version 4.4 validiert, wobei es im Allgemeinen auch mit älteren Versionen von MongoDB funktionieren sollte. Um MongoDB auf Ihrem Server zu installieren, folgen Sie unserem Tutorial Installieren von MongoDB unter Ubuntu 20.04.

Schritt 1 — Hinzufügen eines administrativen Benutzers

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:

Output
MongoDB 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):

Output
admin 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
Output
switched 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:

Output
Enter password:

Geben Sie ein starkes Passwort Ihrer Wahl ein. Dann erhalten Sie eine Bestätigung, dass der Benutzer hinzugefügt wurde:

Output
Successfully 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.

Schritt 2 — Aktivieren von Authentifizierung

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:

/etc/mongod.conf
. . .
#security:

#operationProfiling:

. . .

Heben Sie die Kommentierung dieser Zeile auf, indem Sie das Doppelkreuzzeichen (#) entfernen:

/etc/mongod.conf
. . .
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:

/etc/mongod.conf
. . .
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.

Schritt 3 — Testen von Authentifizierungseinstellungen

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:

Output
MongoDB 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:

Output
admin 0.000GB config 0.000GB local 0.000GB

Das bestätigt, dass Authentifizierung erfolgreich aktiviert wurde.

Zusammenfassung

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.

Creative Commons License