So führen Sie einen sicheren MongoDB-Server mit OpenVPN und Docker unter Ubuntu 16.04 aus

http://mongodb.org [MongoDB] ist eine Open-Source-NoSQL-Datenbank. Einem herkömmlichen MongoDB-Setup fehlen einige Sicherheitsfunktionen, die Sie benötigen, wenn Sie sich um die Datensicherheit sorgen.

Es gibt verschiedene Methoden, um den Server zu sichern, auf dem die Datenbank ausgeführt wird. Zunächst können Sie ein VPN einrichten und den Zugriff nur auf die mit dem VPN verbundenen Clients beschränken. Anschließend können Sie die Transportschicht zwischen Client und Server mit Zertifikaten verschlüsseln. In diesem Lernprogramm machen Sie beides. Darüber hinaus verwenden Sie Docker zum Ausführen Ihrer MongoDB-Instanz, um die Wiederverwendbarkeit Ihrer MongoDB-Konfiguration und -Zertifikate auf mehreren Servern sicherzustellen.

Voraussetzungen

Um dieses Tutorial abzuschließen, benötigen Sie:

  • Ein OpenVPN-Server, den Sie einrichten können, indem Sie dem Tutorial How folgen So richten Sie einen OpenVPN-Server unter Ubuntu 16.04 ein. Stellen Sie sicher, dass Sie beim Erstellen des Servers das Kontrollkästchen * Privates Netzwerk * ​​aktivieren.

  • Ein Ubuntu 16.04-Rechner mit installiertem Docker. Hier erstellen Sie Ihr MongoDB Docker-Image und führen MongoDB in einem Container aus. Klicken Sie zum Erstellen in der DigitalOcean-Verwaltungskonsole auf * Droplet erstellen *, wählen Sie * Apps mit einem Klick * und anschließend * Docker 1.x am 16.04 *. Aktivieren Sie auch das private Netzwerk auf diesem Server.

  • Ein Benutzer ohne Rootberechtigung mit sudo-Berechtigungen auf beiden Servern. Das Initial Setup Guide for Ubuntu 16.04 erklärt, wie es eingerichtet wird.

  • MongoDB auf Ihrem lokalen Computer installiert. Damit testen Sie Ihre Verbindung zu Ihrem MongoDB-Server.

Schritt 1 - Konfigurieren des VPN für die Weiterleitung an private IP-Adressen

Wenn Sie den vorausgesetzten OpenVPN-Artikel befolgt haben, haben Sie Ihren Server höchstwahrscheinlich so konfiguriert, dass Anforderungen an die öffentliche Netzwerkschnittstelle weitergeleitet werden, nicht jedoch an die private. In diesem Tutorial konfigurieren wir den MongoDB-Server so, dass er nur über seine private Schnittstelle zugänglich ist, auf die wir nur über unsere VPN-Verbindung zugreifen können. Wir müssen die IP-Weiterleitungsregeln auf dem VPN-Server ändern, damit der Datenverkehr von VPN-Clients auch an das private Netzwerk weitergeleitet wird.

Stellen Sie eine Verbindung zu Ihrem OpenVPN-Server her.

ssh @

Gehen Sie dann zum DigitalOcean-Dashboard, wählen Sie Ihr VPN-Droplet aus und suchen Sie seine private IP-Adresse.

Sobald Sie die private IP-Adresse haben, führen Sie diesen Befehl in Ihrem VPN-Droplet aus, um die Netzwerkschnittstelle zu identifizieren, die diese IP-Adresse verwendet:

sudo nano /etc/ufw/before.rules
ip route | grep

Sie sollten eine Ausgabe ähnlich der folgenden sehen:

Output10.132.0.0/16 dev   proto kernel  scope link  src

Beachten Sie die Netzwerkschnittstelle in Ihrer Ausgabe. In diesem Beispiel ist die Schnittstelle "+ eth1 +", aber Ihre kann anders sein.

Nachdem Sie die private Netzwerkschnittstelle identifiziert haben, bearbeiten Sie die Datei "+ / etc / ufw / before.rules":

sudo nano /etc/ufw/before.rules

Suchen Sie den Abschnitt, den Sie im vorausgesetzten Lernprogramm definiert haben. Dieser sieht folgendermaßen aus:

/etc/ufw/before.rules

# START OPENVPN RULES
# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]
# Allow traffic from OpenVPN client to eth0
-A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE
COMMIT
# END OPENVPN RULES

Fügen Sie eine neue Regel für die private Netzwerkschnittstelle hinzu:

/etc/ufw/before.rules

# START OPENVPN RULES
# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]
# Allow traffic from OpenVPN client to eth0
-A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE

COMMIT
# END OPENVPN RULES

Stellen Sie sicher, dass Sie "+ eth1 +" durch die Schnittstelle für Ihr privates Netzwerk ersetzen. Speichern Sie dann die Datei und beenden Sie den Editor.

Deaktivieren und aktivieren Sie die Firewall erneut:

sudo ufw disable
sudo ufw enable

Melden Sie sich dann von Ihrem VPN-Server ab.

exit

Stellen Sie nun eine VPN-Verbindung von Ihrem lokalen Computer zu Ihrem VPN-Server her. Behalten Sie diese Verbindung in diesem Lernprogramm bei.

Stellen Sie nun über die private IP-Adresse eine Verbindung zum MongoDB-Server her und konfigurieren Sie die Firewall.

Schritt 2 - Einrichten der Firewall des MongoDB-Servers

Wir werden uns mit der privaten IP-Adresse des MongoDB-Servers verbinden. Wenn Sie es nicht haben, kehren Sie zum DigitalOcean-Dashboard zurück und suchen Sie die private IP-Adresse für das MongoDB Docker Droplet. Sie werden es hier verwenden, um eine Verbindung zum Server herzustellen, und Sie werden es anschließend verwenden, um eine direkte Verbindung zu MongoDB herzustellen, da der Zugriff auf den Datenbankserver auf VPN-Clients beschränkt wird. Auf diese Weise vermeiden Sie, dass die Datenbank öffentlich zugänglich gemacht wird. Dies ist eine unerlässliche Sicherheitsmaßnahme.

Stellen Sie sicher, dass Sie mit Ihrem VPN und mit SSH mit dem MongoDB-Server über dessen private IP verbunden sind:

ssh @

Sobald Sie angemeldet sind, löschen Sie alle vorhandenen Firewall-Regeln, um den Zugriff von außen zu verhindern:

sudo ufw delete limit ssh
sudo ufw delete allow 2375/tcp
sudo ufw delete allow 2376/tcp

Fügen Sie dann zwei neue Regeln hinzu, die den SSH- und MongoDB-Zugriff nur von Computern aus ermöglichen, die mit Ihrem VPN verbunden sind. Verwenden Sie dazu die private IP-Adresse Ihres VPN-Servers für die Ursprungs-IP:

sudo ufw allow from  to any port 22 proto tcp
sudo ufw allow from  to any port 28018 proto tcp

Stellen Sie sicher, dass nur diese beiden Regeln konfiguriert sind:

sudo ufw status

Sie sollten die folgende Ausgabe sehen:

OutputTo                         Action      From
--                         ------      ----
22/tcp                     ALLOW
28018/tcp                  ALLOW

Aktivieren Sie die Firewall und melden Sie sich vom Server ab:

sudo ufw enable
exit

Melden Sie sich dann erneut beim MongoDB-Server an, um sicherzustellen, dass Sie nach dem Aktivieren des IP-Filters weiterhin Zugriff auf den Server haben.

ssh @

Wenn Sie keine SSH-Verbindung herstellen können, stellen Sie sicher, dass Sie mit dem VPN verbunden sind und dass Sie den VPN-Server so eingerichtet haben, dass der Datenverkehr im privaten Netzwerk weitergeleitet wird. Wenn dies nicht funktioniert, melden Sie sich über die https://www.digitalocean.com/community/tutorials/ an und überprüfen Sie, ob die Digitalocean-Konsole für den Zugriff auf Ihr Droplet[DigitalOcean Console] geeignet ist die Firewall-Regeln. Stellen Sie sicher, dass Sie die private IP Ihres VPN-Servers in den Regeln angegeben haben und nicht die private IP Ihres MongoDB-Servers.

Weitere Informationen zu UFW finden Sie unter dieses DigitalOcean UFW-Tutorial. .

Nachdem Sie die grundlegenden Sicherheitsmaßnahmen konfiguriert haben, fahren Sie mit der Konfiguration von MongoDB fort.

Schritt 3 - Erstellen der MongoDB-Konfigurationsdatei

In diesem Schritt erstellen wir eine benutzerdefinierte MongoDB-Konfiguration, mit der MongoDB für die Verwendung von SSL-Zertifikaten konfiguriert wird.

Erstellen wir eine Verzeichnisstruktur für die Konfiguration und die zugehörigen Dateien. Wir erstellen ein Verzeichnis mit dem Namen "+ mongoconf " und erstellen dann ein " config " - Verzeichnis für unsere Konfigurationsdateien. Im Verzeichnis " config " erstellen wir ein Verzeichnis mit dem Namen " ssl +", in dem wir die Zertifikate speichern.

Erstellen Sie die Struktur mit dem folgenden Befehl:

mkdir -p ~/mongoconf/config/ssl

Wechseln Sie dann in den Ordner "+ ~ / mongod conf / config":

cd ~/mongoconf/config

Öffne eine neue Datei mit dem Namen "+ mongod.conf +" mit deinem Texteditor:

nano mongod.conf

Stellen Sie zunächst die Datenbank so ein, dass sie an jede Netzwerkschnittstelle an Port "+ 28018 " gebunden wird. Das Binden an " 0.0.0.0 +" ist in diesem Fall kein Sicherheitsproblem, da die Firewall ohnehin keine Verbindungen von außerhalb zulässt. Wir müssen jedoch die Verbindung von Clients innerhalb des VPN zulassen. Fügen Sie der Datei Folgendes hinzu:

mongodb.conf

net:
 bindIp: 0.0.0.0
 port: 28018

Legen Sie auch im Abschnitt "+ net +" die Pfade zu den SSL-Zertifikaten fest und geben Sie die Passphrase für das Zertifikat an. Wir werden in Kürze die eigentlichen Zertifizierungsdateien und Passphrasen erstellen.

mongodb.conf

net:
. . .
 ssl:
   CAFile: /etc/mongo/ssl/client.pem
   PEMKeyFile: /etc/mongo/ssl/server.pem
   PEMKeyPassword: test
   mode: requireSSL

Legen Sie schließlich das Standardspeicherverzeichnis fest und aktivieren Sie die Journalfunktion.

mongodb.conf

. . .
storage:
 dbPath: /mongo/db
 journal:
   enabled: true

Informationen zu allen verfügbaren Konfigurationsoptionen finden Sie unter read MongoDB’s documentation.

Speichern Sie vorerst die Datei und beenden Sie den Editor. Es ist Zeit, die von uns verwendeten SSL-Zertifikate zu generieren.

Schritt 4 - Generieren von SSL-Zertifikaten

Um den Datentransport zu sichern, müssen Sie zwei SSL-Zertifikate für MongoDB generieren - eines für den Server und eines für den Client, der auf die Datenbank zugreift.

Wechseln Sie zunächst in das Verzeichnis "+ ~ / mongoconf / config / ssl " und generieren Sie das Server-Zertifikat-Schlüssel-Paar. Füllen Sie die Eingabeaufforderungen mit Informationen Ihrer Wahl aus. Achten Sie auf die Felder " Common Name" und "+ PEM Pass Phrase".

cd ~/mongoconf/config/ssl
openssl req -new -x509 -days 365 -out server.crt -keyout server.key

Sie sehen die folgende Ausgabe und werden aufgefordert, auf dem Weg einige Details anzugeben:

Server certificate-key generation. . .
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
. . .
Common Name (e.g. server FQDN or YOUR name) []:
. . .

Wenn Sie nach der PEM-Passphrase gefragt werden, stellen Sie sicher, dass Sie denselben Wert verwenden, den Sie im vorherigen Schritt in Ihrer MongoDB-Konfigurationsdatei verwendet haben.

MongoDB akzeptiert keine separaten Schlüssel- und Zertifikatsdateien. Kombinieren Sie diese zu einer einzigen + .pem + Datei:

cat server.crt server.key >>

Generieren Sie als Nächstes das Zertifikat-Schlüssel-Paar für den Client:

openssl req -new -x509 -days 365 -out client.crt -keyout

Sie folgen demselben Vorgang wie zuvor, verwenden jedoch dieses Mal die private IP-Adresse des VPN-Servers. Die PEM-Passphrase kann für diesen Schritt beliebig sein.

Client certificate-key generation. . .
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
. . .
Common Name (e.g. server FQDN or YOUR name) []:
. . .

Verketten Sie die soeben erzeugten Dateien zu einer einzigen + .pem + Datei:

cat client.crt client.key >> client.pem

Kopieren Sie anschließend beide Zertifikatsdateien auf Ihren lokalen Computer, damit Sie eine Remoteverbindung zum MongoDB-Server herstellen können. Sie können dies mit dem Befehl "+ scp +" auf Ihrem lokalen Computer tun:

scp @:/home//mongoconf/config/ssl/\{client.pem,server.pem\} .

Alternativ können Sie dem Tutorial https://www.digitalocean.com/community/tutorials/ folgen Sicheres Übertragen von Dateien mit einem Remote-Server], um die Dateien "+ client.pem " und " server.pem +" auf Ihren lokalen Computer zu übertragen.

Jetzt erstellen wir das Docker-Image und führen das Datenbankmodul in einem Container aus, damit diese Konfiguration portabler ist.

Schritt 5 - Erstellen des MongoDB Docker-Image und Ausführen des Containers

Sie haben eine sichere MongoDB-Konfiguration erstellt und Zertifikate generiert. Machen wir es jetzt mit Docker portabel. Wir erstellen ein benutzerdefiniertes Image für MongoDB, übergeben jedoch unsere Konfigurationsdatei und Zertifikate, wenn wir den Container ausführen.

Um ein Image aufzubauen, benötigen Sie ein Dockerfile.

Wechseln Sie in das Stammverzeichnis des Projekts und öffnen Sie eine leere Docker-Datei in Ihrem Editor:

cd ~/mongoconf
nano Dockerfile

Fügen Sie der neuen Datei Folgendes hinzu:

Dockerfile

FROM ubuntu:xenial

RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6
RUN echo "deb http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.4 multiverse" | tee /etc/apt/sources.list.d/mongodb-org-3.4.list
RUN apt-get update && apt-get install -y mongodb-org
RUN mkdir -p /mongo/db /etc/mongo

EXPOSE 28018
ENTRYPOINT ["mongod", "--config", "/etc/mongo/mongod.conf"]

Diese Datei weist Docker an, ein auf Ubuntu 16.04 Xenial basierendes Image zu erstellen, die neuesten MongoDB-Binärdateien herunterzuladen und einige Verzeichnisse zu erstellen, in denen Konfigurationsdateien und die Datenbank gespeichert werden. Es stellt dem Host den Port "+ 28018 +" des Containers zur Verfügung und führt Mongo jedes Mal aus, wenn der Benutzer den Container neu startet.

Speichern Sie die Datei und beenden Sie Ihren Editor. Dann erstellen Sie das Image:

docker build -t mongo .

Führen Sie nach dem Erstellen des Abbilds einen Container basierend auf dem Abbild aus. Wir mounten das Verzeichnis "+ config +" als Volume im Container, damit unsere benutzerdefinierte Konfiguration und unsere benutzerdefinierten Schlüssel für die MongoDB-Instanz im Container sichtbar sind:

docker run \
--detach \
--publish 28018:28018 \
--volume $PWD/config:/etc/mongo \
--name mongodb \
mongo

Nachdem Sie eine MongoDB-Instanz ausgeführt haben, können Sie von Ihrem lokalen Computer aus darauf zugreifen.

Schritt 6 - Zugriff auf MongoDB

Stellen Sie in einem neuen Terminal auf Ihrem lokalen Computer mit der privaten IP-Adresse des MongoDB-Servers eine Verbindung zur Datenbank her. Sie geben die Dateien client.pem und server.pem an, die Sie auf Ihren lokalen Computer heruntergeladen haben, sowie die Passphrase, die Sie beim Erstellen des Client-Zertifikats verwendet haben. Führen Sie diesen Befehl aus:

mongo \
--ssl \
--sslCAFile  \
--sslPEMKeyFile  \
--sslPEMKeyPassword  \
--host  \
--port 28018

Wenn alles in Ordnung ist, sollten Sie die MongoDB-Eingabeaufforderung sehen.

Wenn ein Fehler auftritt, überprüfen Sie, ob Sie eine Verbindung zur privaten IP-Adresse des MongoDB-Servers und nicht zur IP-Adresse des VPN-Servers herstellen. Stellen Sie außerdem sicher, dass der Schlüsselspeicherort und die Passphrase korrekt sind und dass Ihre Verbindung zum VPN noch besteht.

Fazit

Jetzt haben Sie eine benutzerdefinierte MongoDB, die in einem Docker-Container ausgeführt wird. Seine Sicherheit wird durch SSL-Client-Server-Authentifizierung und Transportverschlüsselung gewährleistet. Sie haben zusätzliche Sicherheit geschaffen, indem Sie die Firewall so konfiguriert haben, dass Datenbankverbindungen auf Clients beschränkt werden, die mit einem VPN-Server verbunden sind.

Obwohl dieses Setup für Tests optimal ist, sollten Sie in einer Produktionsumgebung eine vertrauenswürdige Zertifizierungsstelle und signierte Zertifikate verwenden. Darüber hinaus müssen Sie Ihre Sicherheitsanforderungen analysieren und entsprechend handeln. Beispielsweise möchten Sie möglicherweise Benutzer, Kennwörter und Rollen in der Datenbank einrichten. Das Tutorial Installieren und Sichern von MongoDB unter Ubuntu 16.04 enthält weitere Informationen zu Benutzer erstellen und ist ein großartiger nächster Schritt in Richtung eines produktionsfertigen Setups.