MongoDB mit TLS / SSL ausstatten  [GELÖST]

Diskussionen zur Bedienung von KeyHelp.
Post Reply
pasib
Posts: 20
Joined: Sat 15. Aug 2020, 07:11

MongoDB mit TLS / SSL ausstatten

Post by pasib »

Hallo zusammen!

Ich habe schon ein paar erfolglose Versuche hinter mir eine MongoDB mit TLS / SSL auszustatten.
Es geht darum um eine Self-Hosted MongoDB v7.0 auf Ubuntu 22.04 mit KeyHelp.


Ich habe zwei Server:

1. mein Main-Server mit KeyHelp 24.0 (Build 3220)
2. mein Datenbank-Server mit Keyhelp 24.0 (Build 3220)

Main Server:
Dient als Nameserver und verwaltet auch die IP-Adresse für den Datenbank-Server
Ich habe dort zwei DNS Records angelegt für `A` und `SRV`.

Der A-Record dient dazu, den Hostname vom Datenbankserver

Code: Select all

datenbankserver.example.com
auf dessen IP-Adresse aufzulösen. Das klappt auch wunderbar. Ich erreiche den Datenbankserver via Domain und lande auf meinem mit SSL verschlüsselten KeyHelp Control-Panel.

Zusätzlich habe ich auf dem Main-Server noch einen `SRV` Record am laufen, da ich den Port der MongoDB geändert habe. Das klappt auch ohne Probleme. Ich kann über die Domain auf meine MongoDB zugreifen, ohne den Port zu definieren:

Code: Select all

mongodb+srv://datenbankserver.example.com
Das Problem ist jetzt aber: Ich bekomme es einfach nicht hin, meine MonogDB Verbindung mit TLS zu verschlüsseln.


Am wünschenswertesten wäre es, wenn ich direkt das Zertifikat von dem KeyHelp Control-Panel verwenden kann. Da eben die selbe Domain verwendet wird sollte dies auch kein Problem sein dachte ich. Also habe ich versucht diese Zertifikate zu verwenden.

Wenn ich MongoDB mit dem folgenden Befehl starte:

Code: Select all

mongod --setParameter tlsUseSystemCA=true --config /etc/mongod.conf
genaugenommen geht es um den Parameter:

Code: Select all

tlsUseSystemCA=true
erhalte ich leider einen Fehler beim Versuch mich mit einem Client zu verbinden:

Code: Select all

Bei der Verbindung mit der Datenbank ist ein Fehler aufgetreten: MongooseServerSelectionError: unable to verify the first certificate
Dazu sei gesagt: Meine Serverdienste des Datenbankservers sichere ich mit Let'sEncrypt Zertifikaten aus, die auch auf diese Domain zeigen. Also es gibt rein für die Datenbank keine extra-Domain.

Als Zertifikate habe ich mich nach Dokumentation auf diesen Pfad beschränkt:

Code: Select all

/etc/ssl/keyhelp/letsencrypt/keyhelp/datenbankserver.example.com
Dort liegen diese Dateien:

Code: Select all

cert.pem  chain.pem  complete.pem  fullchain.pem  last.csr  private.pem  public.pem
Wenn ich in meiner MongoDB Konfiguration versuche das Zertifikat zu verwenden

Code: Select all

cert.pem
startet MongoDB gar nicht. Erst wenn ich die Dateien private.pem und cert.pem verbinde:

Code: Select all

cat privkey.pem >> cert.pem


dann frisst MongoDB die Konfiguration und startet. Aber eben wie gesagt mit diesem Fehler am Client:

Code: Select all

Bei der Verbindung mit der Datenbank ist ein Fehler aufgetreten: MongooseServerSelectionError: unable to verify the first certificate
Ich habe das auch schon so mit einem selbst signierten Zertifikat gemacht, also die Dateien zusammenführen, da sie MongoDB sonst nicht frisst. Da erhalte ich aber dann folgenden Fehler:

Code: Select all

Bei der Verbindung mit der Datenbank ist ein Fehler aufgetreten: MongooseServerSelectionError: self-signed certificate
Erstellt habe ich diese wie folgt:

Code: Select all

sudo openssl req -new -x509 -days 365 -nodes -out /etc/ssl/mongodb/cert.pem -keyout /etc/ssl/mongodb/private.key
Die selbst signierten Zertifikate waren jedoch nur ein Test wie es sich verhält und um potenzielle Fehler einzugrenzen.

Ich würde aber gerne die MongoDB direkt auch mit den Lets Encrypt Zertifikaten ausstatten, die auch vom Server / KeyHelp verwendet werden. Da diese valide signiert sind und sich auch weiterhin automatisch erneuern. Wenndoch ich bei der Verbindung der beiden Daten evlt einen Cronjob bearbeiten müsste, damit diese auch von der MongoDb gefressen werden. Vielleicht startet die MongoDB auch nur weil etwas nur augenscheinlich passt.


Wo finde ich denn eine alternative CA-File zu den vom System; macht das überhaupt einen Unterschied? Denn das System ist ja eben mit diesen Zertifikaten valide verschlüsselt. Oder ist das nochmal ein Unterschied?

Es würde mir wirklich sehr weiterhelfen, wenn jemand Tipps oder Anregungen für mich hat. MongoDB in Verbindung mit KeyHelp wäre ein absoluter Obverkill! :geek:

Nützliche Links:
https://www.mongodb.com/docs/manual/tut ... igure-ssl/
https://jira.mongodb.org/browse/SERVER-72839


PS: Bei dem Versuch die Zertifikate manuell mit Certbot zu erstellen hatte ich auch nicht so wirklich einen Erfolg.

Code: Select all

 This directory contains your keys and certificates.

`privkey.pem`  : the private key for your certificate.
`fullchain.pem`: the certificate file used in most server software.
`chain.pem`    : used for OCSP stapling in Nginx >=1.3.7.
`cert.pem`     : will break many server configurations, and should not be used
                 without reading further documentation (see link below).

WARNING: DO NOT MOVE OR RENAME THESE FILES!
         Certbot expects these files to remain in this location in order
         to function properly!

We recommend not moving these files. For more information, see the Certbot
User Guide at https://certbot.eff.org/docs/using.html#where-are-my-certificates.
Dieser hat MongoDB auch erst gefressen, wenn ich die privatekey.pem und das `cert.pem` gemerged habe.


Ich hoffe ihr könnt mir weiterhelfen. Langsam wird es ein Kampf! :lol: Vielleicht gibt es ja unter KeyHelp sogar einen total einfachen Weg den ich bisher einfach nicht kenne. :oops: Wo finde ich denn unter KeyHelp eine CA-File die ich alternativ verwenden könnte?


Liebe Grüße!
Last edited by pasib on Sat 16. Mar 2024, 20:37, edited 1 time in total.
Creator - Programmer - Author - Dreamer
User avatar
Jolinar
Community Moderator
Posts: 3610
Joined: Sat 30. Jan 2016, 07:11
Location: Weimar (Thüringen)
Contact:

Re: MongoDB mit TLS / SSL ausstatten

Post by Jolinar »

Ich kann jetzt nichts zu deinem eigentlichen Ansinnen beitragen, da ich mit MongoDB schon seit vielen Jahren nix mehr zu tun hatte.
Aber da du sagtest, daß du 2 Server im Einsatz hast...wir hatten mal ein ähnliches Szenario und haben den Zugriff auf die DB auf dem zweiten Server über ein VPN umgesetzt.
Wäre das eventuell ein alternativer Ansatz für dich?
Wenn jemand inkompetent ist, dann kann er nicht wissen, daß er inkompetent ist. (David Dunning)

Data Collector für Community Support
___
Ich verwende zwei verschiedene Schriftfarben in meinen Beiträgen /
I use two different font colors in my posts:
  • In dieser Farbe schreibe ich als Moderator und gebe moderative Hinweise oder begründe moderative Eingriffe /
    In this color, I write as a moderator and provide moderative guidance or justify moderative interventions
  • In dieser Farbe schreibe ich als Community Mitglied und teile meine private Meinung und persönlichen Ansichten mit /
    In this color, I write as a community member and share my personal opinions and views
pasib
Posts: 20
Joined: Sat 15. Aug 2020, 07:11

Re: MongoDB mit TLS / SSL ausstatten  [GELÖST]

Post by pasib »

Jolinar wrote: Sat 16. Mar 2024, 20:29 Wir hatten mal ein ähnliches Szenario und haben den Zugriff auf die DB auf dem zweiten Server über ein VPN umgesetzt.
Wäre das eventuell ein alternativer Ansatz für dich?
Wäre grundsätzlich schon eine Option gewesen aber ich bin froh, dass ich es jetzt doch hinbekommen habe. Leider nicht mit der onBoard Let's Encrypt Variante, die ich ursprünglich wollte, aber bin froh allgemein mal eine verschlüsselte Verbindung zu haben.


Für alle die auf ein ähnliches Problem stoßen hier mal eine Kurzanleitung:

Komplett eigene CA für MongoDB einrichten, da wir alle folgenden die Zertifikate selbst erstellen sowie selbst signieren werrden.
Insgesamt werden 10 Dateien erstellt, effektiv genutzt werden am Ende drei Stück:

- Root-CA
- MongoDB-Server
- Client

PS: -days 3650 bedeutet, dass die Zertifikate 10 Jahre gültig sind. Das könnt ihr je nach Anwendung und belieben anpassen.


Abschnitt 1: Root-Zertifikat

Schritt 1 - Privaten Stammschlüssel erstellen
Dieser Schlüssel darf niemals an die Öffentlichkeit gelangen!

Code: Select all

openssl genrsa -out rootCA.key 2048
Schritt 2 - Root-Zertifikat selbst signieren

Code: Select all

openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 3650 -out rootCA.pem


Abschnitt 2: MongoDB Server-Zertifikat

Schritt 1 - Privaten Schlüssel erstellen

Code: Select all

openssl genrsa -out mongodb.key 2048
Schritt 2 - Certificate Signing Request (CSR) Datei für den MongoDB-Server

Code: Select all

openssl req -new -key mongodb.key -out mongodb.csr
Schritt 3 - CSR mit CA-Zertifikat (rootCA.pem) und dem CA privaten Schlüssel (rootCA.key) signieren

Code: Select all

openssl x509 -req -in mongodb.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out mongodb.crt -days 3650 -sha256
Schritt 4 - ( Optional ) PEM-Datei erstellen
MongoDB erfordert üblicherweise, dass der private Schlüssel und das Server-Zertifikat in einer einzigen Datei (mongodb.pem) zusammengefasst werden.

Code: Select all

cat mongodb.key mongodb.crt > mongodb.pem


Abschnitt 3: MongoDB TSL-Fähig machen


Dazu die mongd.conf bearbeiten:

Code: Select all

net:
  port: 27017
  bindIp: 0.0.0.0
  tls:
    mode: requireTLS
    certificateKeyFile: /etc/ssl/mongodb/mongodb.pem
    CAFile: /etc/ssl/mongodb/rootCA.pem


Abschnitt 4: Zertifikat für den / die Clients erstellen

Code: Select all

openssl genrsa -out client.key 2048
openssl req -new -key client.key -out client.csr
openssl x509 -req -in client.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out client.crt -days 3650 -sha256
Dateien für MongoDB wieder zusammenfügen:

Code: Select all

cat client.key client.crt > client.pem

Abschnitt 5: MongoDB-Client für TSL vorbereiten

Die Dateien rootCA.pem und client.pem

müssen auf dem Client gespeichert werden. Der Pfad zu den Dateien muss dann bei der Client-Verbindung angegeben werden:

Code: Select all

const options = {
  tlsCAFile: 			'path/to/rootCA.pem',
  tlsCertificateKeyFile: 	'path/to/client.pem',
};

mongoose.connect('mongodb+srv://datasrv.mysrv.de/testdatabase', options);

Wenn man das so liest fragt man sich echt, warum man so kämpfen musste. Viel Spaß damit. 8-)
Creator - Programmer - Author - Dreamer
User avatar
Ralph
Posts: 845
Joined: Mon 30. Mar 2020, 16:14

Re: MongoDB mit TLS / SSL ausstatten

Post by Ralph »

dann behalte das mal gut im Auge auch wenn es ausreichend abgesichert wurde gibt es durchgehend schwere Sicherheitsprobleme:
https://www.mongodb.com/alerts
Attachments
Screenshot_20240317_160436.png
Post Reply