So installieren und sichern Sie MongoDB unter Ubuntu 16.04

Einführung

MongoDB ist eine dokumentenorientierte Datenbank, die kostenlos und Open Source ist. Es wird als NoSQL-Datenbank klassifiziert, da es nicht auf einer traditionellen tabellenbasierten relationalen Datenbankstruktur basiert. Stattdessen werden JSON-ähnliche Dokumente mit dynamischen Schemata verwendet. Im Gegensatz zu relationalen Datenbanken benötigt MongoDB kein vordefiniertes Schema, bevor Sie Daten zu einer Datenbank hinzufügen. Sie können das Schema jederzeit und so oft wie nötig ändern, ohne eine neue Datenbank mit einem aktualisierten Schema einrichten zu müssen.

In Teil 1 dieses Tutorials verwenden wir das MongoDB-Repository, um die neueste Version von MongoDB zu installieren. In Teil 2 aktivieren wir die Authentifizierung, um sie auf dem lokalen System zu sichern. Schließlich zeigen wir in Teil 3, wie Sie Remoteverbindungen bei Bedarf sicherer zulassen können.

Voraussetzungen

Um diesem Tutorial zu folgen, benötigen Sie:

Wenn dies geschehen ist, können Sie mitmachen.

Erster Teil: Einrichten des Servers

[[Schritt-1 - Hinzufügen des Mongodb-Repositorys]] == Schritt 1 - Hinzufügen des MongoDB-Repositorys

MongoDB ist bereits in Ubuntu-Paket-Repositories enthalten, aber das offizielle MongoDB-Repository bietet die aktuellste Version und ist die empfohlene Methode zur Installation der Software. In diesem Schritt fügen wir dieses offizielle Repository unserem Server hinzu.

Ubuntu stellt die Authentizität von Software-Paketen sicher, indem überprüft wird, ob sie mit GPG-Schlüsseln signiert sind. Daher müssen wir zuerst den Schlüssel für das offizielle MongoDB-Repository importieren.

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6

Die folgende Ausgabe bestätigt, dass der Schlüssel erfolgreich importiert wurde:

Ausgabe

Executing: /tmp/tmp.IdwenTia0s/gpg.1.sh --keyserver
hkp://keyserver.ubuntu.com:80
--recv
0C49F3730359A14518585931BC711F9BA15703C6
gpg: requesting key A15703C6 from hkp server keyserver.ubuntu.com
gpg: key A15703C6: public key "MongoDB 3.4 Release Signing Key " imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)

Als Nächstes fügen wir Details zum MongoDB-Repository hinzu, damitaptwissen, wo die Pakete heruntergeladen werden müssen. Geben Sie den folgenden Befehl ein, um eine Listendatei für MongoDB zu erstellen.

echo "deb [ arch=amd64,arm64 ] http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list

Zuletzt aktualisieren wir die Paketliste.

sudo apt-get update

Jetzt können wir MongoDB installieren.

[[Schritt-2 - Installation von Mongodb]] == Schritt 2 - Installation von MongoDB

Wir werden das Metapaket "Mongodb-org" installieren, das den Daemon, die Konfigurations- und Init-Skripte, die Shell und die Verwaltungstools auf dem Server enthält.

sudo apt-get install mongodb-org

Drücken Sie die Eingabetaste oder geben SieY ein, um fortzufahren, wenn Sie dazu aufgefordert werden. Sobald die Installation abgeschlossen ist, starten wir den Mongo-Daemon:

sudo systemctl start mongod

Dasystemctl keine Ausgabe liefert, überprüfen wir den Status, um sicherzustellen, dass der Dienst ordnungsgemäß gestartet wurde.

sudo systemctl status mongod

Ausgabe

● mongod.service - High-performance, schema-free document-oriented database
   Loaded: loaded (/lib/systemd/system/mongod.service; disabled; vendor preset: enabled)
   Active: active (running) since Fri 2017-02-17 18:57:26 UTC; 17min ago
     Docs: https://docs.mongodb.org/manual
 Main PID: 2811 (mongod)
    Tasks: 17
   Memory: 56.8M
      CPU: 7.294s
   CGroup: /system.slice/mongod.service
           └─2811 /usr/bin/mongod --quiet --config /etc/mongod.conf

Drücken Sieq, um den Vorgang zu beenden. Nachdem wir den Daemon manuell gestartet und überprüft haben, dass er ausgeführt wird, stellen wir sicher, dass er beim Start automatisch neu gestartet wird:

sudo systemctl enable mongod

Die folgende Ausgabe bestätigt, dass der Befehl erfolgreich war:

OutputCreated symlink from /etc/systemd/system/multi-user.target.wants/mongod.service
to /lib/systemd/system/mongod.service.

Als nächstes werden wir wesentliche Schritte unternehmen, um unsere Datenbanken zu sichern.

Zweiter Teil: Sicherung von MongoDB

Frühere Versionen von MongoDB waren anfällig für automatisierte Exploits, da für die Interaktion mit der Datenbank standardmäßig keine Authentifizierung erforderlich war. Jeder Benutzer kann Datenbanken erstellen und zerstören sowie standardmäßig von ihren Inhalten lesen und darauf schreiben. Dies wurde noch verschärft, da in früheren Versionen der MongoDB-Dämon standardmäßig so konfiguriert war, dass er alle Schnittstellen überwacht. Dies bedeutete, dass automatisierte Skripts MongoDB-Instanzen erkennen konnten, die nicht durch eine Firewall geschützt waren, und vollständigen Zugriff erhielten, wenn die Authentifizierung nicht aktiviert war zu MongoDB.

Die Situation wurde in der Version 3.x sowie in früheren Versionen, die von einigen Paketmanagern bereitgestellt wurden, gemildert, da der Dämon jetzt an 127.0.0.1 gebunden ist und nur Verbindungen über den Unix-Socket akzeptiert. Es ist nicht automatisch für das Internet geöffnet.

Die Authentifizierung ist jedoch weiterhin standardmäßig deaktiviert, sodass alle Benutzer auf dem lokalen System vollständigen Zugriff auf die Datenbanken haben. Um dies zu gewährleisten, erstellen wir einen Administrator, aktivieren die Authentifizierung und testen.

[[Schritt-1 - Hinzufügen eines Verwaltungsbenutzers]] == Schritt 1 - Hinzufügen eines Verwaltungsbenutzers

Um Ihren Benutzer hinzuzufügen, wird eine Verbindung zur Mongo-Shell hergestellt:

mongo

Die Ausgabe, wenn wir die Mongo-Shell verwenden, warnt uns, dass die Zugriffssteuerung für die Datenbank nicht aktiviert ist und dass der Lese- / Schreibzugriff auf Daten und die Konfiguration uneingeschränkt ist.

OutputMongoDB shell version v3.4.2
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.2
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
        http://docs.mongodb.org/
Questions? Try the support group
        http://groups.google.com/group/mongodb-user
Server has startup warnings:
2017-02-21T19:10:42.446+0000 I STORAGE  [initandlisten]
2017-02-21T19:10:42.446+0000 I STORAGE  [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2017-02-21T19:10:42.446+0000 I STORAGE  [initandlisten] **          See http://dochub.mongodb.org/core/prodnotes-filesystem
2017-02-21T19:10:42.534+0000 I CONTROL  [initandlisten]
2017-02-21T19:10:42.534+0000 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2017-02-21T19:10:42.534+0000 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2017-02-21T19:10:42.534+0000 I CONTROL  [initandlisten]
>

Es steht uns frei, den Namen für den Administrator zu wählen, da die Berechtigungsstufe aus der Zuweisung der RolleuserAdminAnyDatabase stammt. Die Datenbankadmin gibt an, wo die Anmeldeinformationen gespeichert sind. Weitere Informationen zur Authentifizierung finden Sie im Abschnitt MongoDB SecurityAuthentication.

Stellen Sie den Benutzernamen Ihrer Wahl ein und achten Sie darauf, Ihr eigenes sicheres Passwort zu wählen und diese im folgenden Befehl zu ersetzen:

use admin
db.createUser(
  {
    user: "AdminSammy",
    pwd: "AdminSammy'sSecurePassword",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  }
)

Wenn wir den Befehldb.createUser ausgeben, stellt die Shell vor jeder Zeile drei Punkte voran, bis der Befehl abgeschlossen ist. Danach sollten wir ein Feedback wie das folgende erhalten, wenn der Benutzer hinzugefügt wurde.

Output> use admin
switched to db admin
> db.createUser(
...   {
...     user: "AdminSammy",
...     pwd: "AdminSammy'sSecurePassword",
...     roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
...   }
... )
Successfully added user: {
        "user" : "AdminSammy",
        "roles" : [
                {
                        "role" : "userAdminAnyDatabase",
                        "db" : "admin"
                }
        ]
}

Geben Sie "exit" ein und drücken SieENTER oder verwenden SieCTRL+C, um den Client zu verlassen.

Zu diesem Zeitpunkt kann unser Benutzer Anmeldeinformationen eingeben, dies ist jedoch nichtrequired, bis wir die Authentifizierung aktivieren und den MongoDB-Dämon neu starten.

[[Schritt-2 - Aktivieren der Authentifizierung]] == Schritt 2 - Aktivieren der Authentifizierung

Die Authentifizierung ist in der Dateimongod.conf aktiviert. Sobald wir es aktiviert undmongod neu gestartet haben, können Benutzer weiterhin eine Verbindung zu Mongo herstellen, ohne sich zu authentifizieren. Sie müssen jedoch einen Benutzernamen und ein Kennwort angeben, bevor sie interagieren können.

Öffnen wir die Konfigurationsdatei:

sudo nano /etc/mongod.conf

Im Abschnitt#security entfernen wir den Hash vorsecurity, um die Zeilengruppe zu aktivieren. Dann fügen wir die Autorisierungseinstellung hinzu. Wenn wir fertig sind, sollten die Zeilen wie im folgenden Auszug aussehen:

mongodb.conf

 . . .
security:
  authorization: "enabled"
 . . .

Beachten Sie, dass die Zeile "Sicherheit" am Anfang keine Leerzeichen enthält und die Zeile "Autorisierung" mit zwei Leerzeichen eingerückt werden muss

Sobald wir die Datei gespeichert und beendet haben, starten wir den Daemon neu:

sudo systemctl restart mongod

Wenn in der Konfiguration ein Fehler aufgetreten ist, wird die Dame nicht gestartet. Dasystemctl keine Ausgabe liefert, verwenden wir die Optionstatus, um sicherzustellen, dass dies der Fall ist:

sudo systemctl status mongod

Wenn wirActive: active (running) in der Ausgabe sehen und es mit etwas wie dem folgenden Text endet, können wir sicher sein, dass der Befehlrestart erfolgreich war:

OutputJan 23 19:15:42 MongoHost systemd[1]: Started High-performance, schema-free document-oriented database.

Nachdem Sie überprüft haben, ob der Dämon aktiv ist, testen Sie die Authentifizierung.

[[Schritt 3 - Überprüfen, ob nicht authentifizierte Benutzer eingeschränkt sind]] == Schritt 3 - Überprüfen, ob nicht authentifizierte Benutzer eingeschränkt sind

Stellen Sie zunächst eine Verbindung ohne Anmeldeinformationen her, um sicherzustellen, dass unsere Aktionen eingeschränkt sind:

mongo

Nachdem wir die Authentifizierung aktiviert haben, werden alle früheren Warnungen behoben.

OutputMongoDB shell version v3.4.2
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.2

Wir sind mit dertest-Datenbank verbunden. Wir werden testen, ob unser Zugriff mit dem Befehlshow dbseingeschränkt ist:

show dbs
Output2017-02-21T19:20:42.919+0000 E QUERY    [thread1] Error: listDatabases failed:{
        "ok" : 0,
        "errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }",
        "code" : 13,
        "codeName" : "Unauthorized"
 . . .

Ohne Authentifizierung können keine Benutzer oder ähnlich privilegierte Aufgaben erstellt werden.

Verlassen wir die Shell, um fortzufahren:

exit

Als Nächstes stellen wir sicher, dass unsere administrativen BenutzerdoesZugriff haben.

[[Schritt 4 - Überprüfen des Administratorbenutzers 39-s-Zugriff]] == Schritt 4 - Überprüfen des Zugriffs des Verwaltungsbenutzers

Wir verbinden uns als unser Administrator mit der Option-u, einen Benutzernamen anzugeben, und-p, um zur Eingabe eines Kennworts aufgefordert zu werden. Wir müssen auch die Datenbank, in der wir die Authentifizierungsdaten des Benutzers gespeichert haben, mit der Option--authenticationDatabaseangeben.

mongo -u AdminSammy -p --authenticationDatabase admin

Wir werden aufgefordert, das Kennwort einzugeben. Geben Sie es daher ein. Sobald wir das richtige Passwort eingegeben haben, werden wir in die Shell eingefügt, wo wir den Befehlshow dbs ausgeben können:

OutputMongoDB shell version v3.4.2
Enter password:
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.2

>

Anstatt den Zugriff zu verweigern, sollten wir die verfügbaren Datenbanken sehen:

show dbs
Outputadmin  0.000GB
local  0.000GB

Geben Sieexit ein oder drücken SieCTRL+C, um den Vorgang zu beenden.

Weitere Informationen zuAuthentication,Role-Based Access Control undUsers and Roles finden Sie in der MongoDB-Dokumentation.

Dritter Teil: Konfigurieren des Remotezugriffs (optional)

Bevor wir mit einer Installation arbeiten, die Remoteverbindungen ermöglicht, müssen wir MongoDB idealerweise hinter einer externen Firewall installieren, die durch ein virtuelles privates Netzwerk (VPN) geschützt oder durch einen Bastion-Host eingeschränkt ist. Während wir darauf hinarbeiten, können wir jedoch den etwas einfacheren Schritt ausführen, eine Firewall auf dem Datenbankserver zu aktivieren und den Zugriff auf den oder die Hosts zu beschränken, die sie benötigen.

[[Schritt-1 -—-Aktivieren-ufw]] == Schritt 1 - Aktivieren von UFW

In der Voraussetzung vonInitial Server Setup with Ubuntu 16.04haben wir UFW aktiviert und nur SSH-Verbindungen zugelassen. Bevor wir einen Port für unseren Client-Computer öffnen, überprüfen wir den UFW-Status:

sudo ufw status

[.Hinweis]##

Note: Wenn die Ausgabe anzeigt, dass die Firewallinactive ist, aktivieren Sie sie mit:

sudo ufw enable

Sobald es aktiviert ist und der Statusbefehl erneut ausgeführt wird, zeigtsudo ufw status die Regeln an. Stellen Sie bei Bedarf sicher, dass SSH zugelassen ist.

sudo ufw allow OpenSSH

Sofern wir keine Änderungen an den Voraussetzungen vorgenommen haben, sollte die Ausgabe zeigen, dass nur OpenSSH zulässig ist:

OutputStatus: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

Als Nächstes gewähren wir den Zugriff auf den Standard-MongoDB-Port 27017, beschränken diesen Zugriff jedoch auf einen bestimmten Host. Wenn Sie den Standardport geändert haben, müssen Sie ihn im folgenden Befehl aktualisieren.

sudo ufw allow from client_ip_address to any port 27017

Führen Sie diesen Befehl unter Verwendung der IP-Adresse für jeden zusätzlichen Client, der Zugriff benötigt, erneut aus. Um die Regel noch einmal zu überprüfen, führen wirufw status erneut aus:

sudo ufw status
OutputTo                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
27017                       ALLOW      client_ip_address
OpenSSH (v6)               ALLOW       Anywhere (v6)

[.note] #Note: Wenn Sie UFW noch nicht kennen, erfahren Sie mehr in der AnleitungUFW Essentials: Common Firewall Rules and Commands.
#

Mit dieser Firewall-Regel können wir MongoDB so konfigurieren, dass es die öffentliche Schnittstelle überwacht.

[[Schritt-2 - Konfigurieren einer öffentlichen Bindung]] == Schritt 2 - Konfigurieren einer öffentlichen Bindung

Um Remoteverbindungen zu ermöglichen, fügen wir die öffentlich routbare IP-Adresse unseres Hosts zur Dateimongod.confhinzu.

sudo nano /etc/mongod.conf

Fügen Sie in der Zeilengruppenetdie IP-Adresse vonMongoHostzur ZeilebindIphinzu:

Auszug aus /etc/mongod.conf

 . . .
net:
  port: 27017
  bindIp: 127.0.0.1,IP_of_MongoHost
 . . .

Wir speichern und beenden die Datei und starten den Daemon neu:

sudo systemctl restart mongod

Wie zuvor bestätigen wir, dass der Neustart erfolgreich war:

sudo systemctl status mongod

Die Ausgabe sollteActive: active (running) enthalten, und wir können mit unserem endgültigen Test fortfahren. Mongo lauscht jetzt an seinem Standardport.

[[Schritt-3 - Testen der Remote-Verbindung]] == Schritt 3 - Testen der Remote-Verbindung

Wir werden testen, ob Mongo seine öffentliche Schnittstelle überwacht, indem wir das Flag--host mit der IP-Adresse aus der Dateimongodb.confhinzufügen.

mongo -u AdminSammy -p --authenticationDatabase admin --host IP_address_of_MongoHost
MongoDB shell version v3.4.2
Enter password:
connecting to: mongodb://107.170.233.82:27017/
MongoDB server version: 3.4.2

Durch das Erreichen der Eingabeaufforderung wird bestätigt, dass der Dämon seine öffentliche IP-Adresse überwacht. Zu diesem Zeitpunkt ist jede Transaktion zwischen einer Remoteverbindung und dem MongoDB-Host unverschlüsselt. Daher sollte der nächste Schritt vor dem Testen der Firewall darin bestehen, diese Transaktionen zu sichern. Hilfe dazu finden Sie in der Sicherheitsdokumentation von MongoDB zuTransport Encryption.

Fazit

In diesem Tutorial haben wir das MongoDB-Repository zu unserer Paketliste hinzugefügt, um die neueste verfügbare Version von MongoDB zu installieren, einen Administrator hinzuzufügen und die Authentifizierung zu aktivieren.

Wir haben auch gezeigt, wie Sie MongoDB so konfigurieren, dass Remoteverbindungen akzeptiert werden, die MongoDB-Installation jedoch nicht angekündigt wird, indem Sie die Firewall des Servers so konfigurieren, dass nur Verbindungen von Hosts zugelassen werden, die Zugriff benötigen.

Nächste Schritte: