MongoDB nativ installieren und absichern: Ubuntu/Debian ohne Docker (Community Edition 8.0)
MongoDB Community Edition 8.0 direkt auf Ubuntu oder Debian installieren – über das offizielle APT-Repository, als systemd-Dienst betrieben, mit SCRAM-Authentifizierung, IP-Bindung und TLS gehärtet. Kein Docker, kein Volume-Mapping.

Wer MongoDB produktiv auf einem Linux-Server betreiben möchte, greift häufig automatisch zu Docker – dabei bringt die native Installation handfeste Vorteile: direkter systemd-Lifecycle, klassisches Log-Management via journalctl, einfacherer Zertifikatszugriff ohne Volume-Mapping und eine schlankere Angriffsfläche. Diese Anleitung zeigt, wie du MongoDB Community Edition 8.0 über das offizielle mongodb-org-APT-Repository auf Ubuntu (20.04, 22.04, 24.04) oder Debian 12 einrichtest, als systemd-Dienst betreibst und mit drei aufeinander aufbauenden Maßnahmen härtest: SCRAM-Authentifizierung, IP-Bindung und TLS. Gedacht ist sie für KMU-Admins, Selfhoster und Entwickler, die eine saubere, wartbare Datenbankinstanz ohne Container-Overhead benötigen.
Voraussetzungen
- Ubuntu 20.04 LTS (Focal), 22.04 LTS (Jammy) oder 24.04 LTS (Noble) – alternativ Debian 12 (Bookworm), jeweils 64-bit (amd64 oder arm64)
- Root- oder sudo-Zugang zum Server
- Internetverbindung zu
repo.mongodb.orgundpgp.mongodb.com(für APT-Repo und GPG-Schlüssel) - Pakete
gnupg,curlundopensslverfügbar (werden ggf. nachinstalliert) - Für TLS in Produktion: PEM-Zertifikat von einer vertrauenswürdigen CA (z. B. Let's Encrypt oder interne PKI); für Test/Entwicklung reicht ein selbstsigniertes Zertifikat
- ca. 30 Minuten Zeit
Schritt 1: Voraussetzungen und Paketquellen vorbereiten
Zuerst stellst du sicher, dass gnupg und curl installiert sind – beide werden für den GPG-Schlüssel-Import benötigt:
sudo apt-get install -y gnupg curlAnschließend importierst du den offiziellen MongoDB-GPG-Schlüssel. Dieser wird in /usr/share/keyrings/ abgelegt und später in der Sources-Datei explizit referenziert – der moderne, sichere Weg statt des veralteten apt-key-Kommandos:
curl -fsSL https://pgp.mongodb.com/server-8.0.asc | \
sudo gpg -o /usr/share/keyrings/mongodb-server-8.0.gpg \
--dearmorWichtig: Verwende ausschließlich das offizielle Paket mongodb-org aus dem mongodb.com-Repository – nicht das Paket mongodb aus den Standard-Ubuntu/Debian-Quellen. Letzteres ist eine veraltete, inoffizielle Variante und wird hier nicht verwendet.
Schritt 2: APT-Repository hinzufügen
Jetzt trägst du das Repository passend zu deiner Distribution ein. Wähle den zutreffenden Befehl:
Ubuntu 24.04 (Noble):
echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-8.0.gpg ] https://repo.mongodb.org/apt/ubuntu noble/mongodb-org/8.0 multiverse" | \
sudo tee /etc/apt/sources.list.d/mongodb-org-8.0.listUbuntu 22.04 (Jammy):
echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-8.0.gpg ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/8.0 multiverse" | \
sudo tee /etc/apt/sources.list.d/mongodb-org-8.0.listUbuntu 20.04 (Focal):
echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-8.0.gpg ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/8.0 multiverse" | \
sudo tee /etc/apt/sources.list.d/mongodb-org-8.0.listDebian 12 (Bookworm):
echo "deb [ signed-by=/usr/share/keyrings/mongodb-server-8.0.gpg ] https://repo.mongodb.org/apt/debian bookworm/mongodb-org/8.0 main" | \
sudo tee /etc/apt/sources.list.d/mongodb-org-8.0.list| Distribution | Version | Codename | Architekturen |
|---|---|---|---|
| Ubuntu | 24.04 LTS | Noble | amd64, arm64 |
| Ubuntu | 22.04 LTS | Jammy | amd64, arm64 |
| Ubuntu | 20.04 LTS | Focal | amd64, arm64 |
| Debian | 12 | Bookworm | amd64 |
Schritt 3: MongoDB installieren und Version pinnen
Paketliste aktualisieren und das Metapaket mongodb-org installieren. Es zieht automatisch alle Komponenten nach: mongod, mongos, mongosh sowie die Datenbanktools (mongodump, mongorestore, mongoexport, mongostat usw.):
sudo apt-get update
sudo apt-get install -y mongodb-orgDirekt nach der Installation pinnst du die Version. Ohne diesen Schritt kann ein späteres apt upgrade MongoDB auf eine inkompatible Version heben – mit potenziell gravierenden Folgen für laufende Datenbankinstanzen:
echo "mongodb-org hold" | sudo dpkg --set-selections
echo "mongodb-org-database hold" | sudo dpkg --set-selections
echo "mongodb-org-server hold" | sudo dpkg --set-selections
echo "mongodb-mongosh hold" | sudo dpkg --set-selections
echo "mongodb-org-mongos hold" | sudo dpkg --set-selections
echo "mongodb-org-tools hold" | sudo dpkg --set-selectionsVerifizieren: dpkg -l mongodb-org sollte die installierte Version anzeigen. Um die Pins zu prüfen: dpkg --get-selections | grep hold – alle sechs Pakete sollten hold zeigen.
Schritt 4: systemd-Dienst starten und aktivieren
Nach einer frischen Installation registrierst du den Dienst bei systemd, startest ihn und aktivierst den Autostart beim Booten:
sudo systemctl daemon-reload
sudo systemctl start mongod
sudo systemctl enable mongod
sudo systemctl status mongodVerifizieren: systemctl status mongod zeigt active (running). Logs findest du unter /var/log/mongodb/mongod.log oder per sudo journalctl -u mongod -n 50 --no-pager. Der Dienst lauscht standardmäßig auf Port 27017, ausschließlich auf dem Loopback-Interface (127.0.0.1) – das ist der sichere Default seit MongoDB 3.6.
Schritt 5: Ersten Admin-User anlegen (localhost exception)
Bevor du Authentifizierung aktivierst, muss mindestens ein Admin-User existieren. MongoDB ermöglicht das über die sogenannte „localhost exception": Solange noch kein User angelegt ist, erlaubt MongoDB einen passwortfreien Loopback-Zugriff. Diese Exception erlischt automatisch nach dem ersten angelegten User.
Öffne die MongoDB-Shell:
mongosh --port 27017Lege in der Shell den Admin-User an. passwordPrompt() fragt das Passwort interaktiv ab – sicherer als es im Klartext in den Befehlsverlauf zu schreiben:
use admin
db.createUser({
user: "adminUser",
pwd: passwordPrompt(),
roles: [
{ role: "userAdminAnyDatabase", db: "admin" },
{ role: "readWriteAnyDatabase", db: "admin" }
]
})Beende die Shell mit exit.
Schritt 6: TLS-Zertifikat vorbereiten
MongoDB erwartet eine einzelne PEM-Datei, die Private Key und Zertifikatskette kombiniert enthält. Das ist eine häufige Fehlerquelle: Nur das Zertifikat oder nur den Key bereitzustellen führt zu einem Startfehler ohne klare Fehlermeldung.
Für Test und Entwicklung – selbstsigniertes Zertifikat:
sudo mkdir -p /etc/ssl/mongodb
# CA-Schlüssel und -Zertifikat erzeugen
sudo openssl req -x509 -newkey rsa:4096 -keyout /etc/ssl/mongodb/ca.key \
-out /etc/ssl/mongodb/ca.pem -days 3650 -nodes \
-subj "/CN=MongoDB-CA"
# Server-Schlüssel und CSR erzeugen
sudo openssl req -newkey rsa:4096 -keyout /etc/ssl/mongodb/server.key \
-out /etc/ssl/mongodb/server.csr -nodes \
-subj "/CN=localhost"
# Server-Zertifikat durch CA signieren
sudo openssl x509 -req -in /etc/ssl/mongodb/server.csr \
-CA /etc/ssl/mongodb/ca.pem -CAkey /etc/ssl/mongodb/ca.key \
-CAcreateserial -out /etc/ssl/mongodb/server.crt -days 365
# PEM-Datei erstellen (Key + Cert kombiniert – MongoDB-Anforderung!)
sudo cat /etc/ssl/mongodb/server.key /etc/ssl/mongodb/server.crt > /etc/ssl/mongodb/mongod.pemFür Produktion mit Let's Encrypt oder eigener PKI:
cat /etc/letsencrypt/live/deine-domain.de/privkey.pem \
/etc/letsencrypt/live/deine-domain.de/fullchain.pem \
> /etc/ssl/mongodb/mongod.pemAnschließend Berechtigungen setzen – die Dateien müssen für den Prozess-User mongodb lesbar sein:
sudo chown mongodb:mongodb /etc/ssl/mongodb/mongod.pem /etc/ssl/mongodb/ca.pem
sudo chmod 600 /etc/ssl/mongodb/mongod.pem
sudo chmod 644 /etc/ssl/mongodb/ca.pemSchritt 7: mongod.conf – Authentifizierung, bindIp und TLS aktivieren
Alle drei Härtungsmaßnahmen werden in der zentralen Konfigurationsdatei /etc/mongod.conf im YAML-Format konfiguriert. Öffne die Datei mit einem Editor deiner Wahl und ersetze den Inhalt durch diese gehärtete Konfiguration:
systemLog:
destination: file
path: /var/log/mongodb/mongod.log
logAppend: true
logRotate: reopen
storage:
dbPath: /var/lib/mongodb
journal:
enabled: true
processManagement:
timeZoneInfo: /usr/share/zoneinfo
net:
port: 27017
bindIp: 127.0.0.1 # Nur Loopback; für Fernzugriff ergänzen: 127.0.0.1,192.168.1.10
tls:
mode: requireTLS
certificateKeyFile: /etc/ssl/mongodb/mongod.pem
CAFile: /etc/ssl/mongodb/ca.pem
disabledProtocols: TLS1_0,TLS1_1
security:
authorization: enabledWas die einzelnen Blöcke bewirken: security.authorization: enabled aktiviert SCRAM-SHA-256 als Standard-Authentifizierungsmechanismus. net.bindIp: 127.0.0.1 schränkt den Lauschbereich auf das Loopback-Interface ein – für Fernzugriff von einem App-Server trägst du dessen interne IP zusätzlich ein, niemals pauschal 0.0.0.0 ohne flankierende Firewallregeln. net.tls.mode: requireTLS erzwingt verschlüsselte Verbindungen; ältere TLS-Versionen 1.0 und 1.1 werden explizit via disabledProtocols ausgeschlossen.
| TLS-Modus | Verhalten | Empfehlung |
|---|---|---|
| disabled | TLS komplett deaktiviert | Nur intern/Dev ohne Netzverkehr |
| allowTLS | TLS optional, Klartext akzeptiert | Nicht empfohlen |
| preferTLS | TLS bevorzugt, Klartext als Fallback | Nur Migrationszeitraum |
| requireTLS | Ausschließlich TLS-Verbindungen | Produktion |
Dienst neu starten, damit die Konfiguration greift:
sudo systemctl restart mongodVerifizieren: sudo systemctl status mongod muss active (running) zeigen. Schlägt der Start fehl, sieh sofort in den Logs nach: sudo journalctl -u mongod -n 100 --no-pager. Häufigste Ursachen sind fehlende oder falsch gesetzte Berechtigungen auf der PEM-Datei sowie eine fehlende CAFile-Angabe.
Schritt 8: Verbindung mit Authentifizierung und TLS testen
Jetzt testest du, ob die gehärtete Instanz korrekt antwortet. Der mongosh-Aufruf muss TLS und die CA-Datei angeben:
mongosh --port 27017 \
--tls \
--tlsCAFile /etc/ssl/mongodb/ca.pem \
--authenticationDatabase admin \
-u adminUser -pNach der Passworteingabe sollte der Prompt admin> erscheinen. Eine kurze Funktionsprüfung in der Shell:
db.runCommand({ connectionStatus: 1 })Verifizieren: Das Ergebnis enthält "ok": 1 sowie unter authInfo.authenticatedUsers deinen adminUser. Eine Verbindung ohne --tls oder ohne gültige Credentials sollte fehlschlagen.
Schritt 9: Firewall mit UFW konfigurieren
Als letzten Härtungsschritt sicherst du den Port auf Netzwerkebene ab. Standardfall – MongoDB ist nur lokal erreichbar und Port 27017 bleibt nach außen geschlossen:
sudo ufw deny 27017Wenn ein App-Server aus dem internen Netz auf MongoDB zugreifen muss:
sudo ufw allow from 192.168.1.100 to any port 27017
sudo ufw reloadErsetze 192.168.1.100 durch die tatsächliche IP des App-Servers. Für Produktionsumgebungen: Port 27017 niemals ohne Quell-IP-Einschränkung ins Internet freigeben.
Troubleshooting / Typische Fehler
mongod startet nicht nach Aktivierung der Authentifizierung
Wenn du security.authorization: enabled gesetzt hast, ohne vorher einen Admin-User anzulegen, ist kein Login mehr möglich. Lösung: Authentifizierung in mongod.conf vorübergehend auf disabled zurücksetzen, Dienst starten, User anlegen, dann wieder aktivieren.
TLS-Startfehler: „certificate file could not be loaded"
Die häufigste Ursache ist eine PEM-Datei, die nur das Zertifikat enthält, aber nicht den Private Key – oder umgekehrt. MongoDB benötigt zwingend beide kombiniert in einer Datei: cat server.key server.crt > mongod.pem. Zusätzlich müssen Besitzer und Berechtigungen stimmen: sudo chown mongodb:mongodb mongod.pem && sudo chmod 600 mongod.pem.
TLS-Startfehler: „CAFile not set"
Bei aktiviertem TLS ist net.tls.CAFile zwingend erforderlich. Alternativ kannst du net.tls.tlsUseSystemCA: true setzen, wenn du einem System-CA-Store vertraust. Fehlt beides, verweigert mongod den Start.
Verbindung schlägt fehl, obwohl mongod läuft
Prüfe zuerst, auf welchen Interfaces mongod tatsächlich lauscht: ss -tlnp | grep 27017. Wenn dort nur 127.0.0.1:27017 steht, aber du von einer anderen IP verbindest, musst du net.bindIp in mongod.conf um die Ziel-IP erweitern und den Dienst neu starten.
Version-Pin vergessen – apt upgrade hat MongoDB aktualisiert
Überprüfe mit dpkg --get-selections | grep mongodb, ob die Pakete noch auf hold stehen. Wenn nicht, setze die Pins erneut wie in Schritt 3 beschrieben. Für ein kontrolliertes Upgrade: Pins kurz auf install setzen, upgraden, sofort wieder auf hold zurücksetzen.
LDAP-Authentifizierung nicht mehr nutzen
LDAP ist in MongoDB 8.0 als deprecated markiert und wird in einem zukünftigen Major Release entfernt. Für neue Deployments immer SCRAM (Standard) oder X.509-Zertifikatsauthentifizierung verwenden.
Häufige Fragen
Kann ich MongoDB 8.0 auch auf Ubuntu 18.04 oder Debian 11 installieren?
Nein. MongoDB 8.0 Community Edition unterstützt offiziell nur Ubuntu 20.04/22.04/24.04 und Debian 12 (Bookworm). Für ältere Systeme wäre ein OS-Upgrade oder die Verwendung einer älteren MongoDB-Version (z. B. 7.0 auf Debian 11) nötig.
Muss ich TLS konfigurieren, wenn MongoDB nur lokal erreichbar ist?
Für rein lokale Verbindungen (App und Datenbank auf demselben Host, bindIp: 127.0.0.1) ist TLS optional, da der Traffic das Netzwerk nicht verlässt. Sobald MongoDB über das Netzwerk erreichbar ist – auch nur innerhalb eines internen VLANs – ist TLS in Produktionsumgebungen dringend empfohlen. Der Konfigurationsaufwand ist überschaubar.
Was ist der Unterschied zwischen net.tls und net.ssl in mongod.conf?
net.ssl ist der ältere Namespace und aus Rückwärtskompatibilität erhalten. net.tls ist der aktuelle, bevorzugte Namespace. Beide konfigurieren dieselbe Funktionalität. Für neue Deployments immer net.tls verwenden.
Wie rotiere ich TLS-Zertifikate ohne Downtime?
Ab MongoDB 5.0 ist Online-Zertifikatsrotation ohne Neustart möglich. Neue Zertifikatsdateien unter demselben Pfad ablegen, dann in mongosh als Admin ausführen: db.rotateCertificates(). Bestehende Verbindungen behalten das alte Zertifikat bis zu ihrem natürlichen Ende.
Wie verhindere ich dauerhaft unbeabsichtigte apt-Upgrades?
Die Pins aus Schritt 3 bleiben persistent. Zum Freigeben für ein gezieltes Upgrade: echo "mongodb-org install" | sudo dpkg --set-selections – für jedes Unterpaket wiederholen. Nach dem Upgrade sofort wieder auf hold setzen.
Fazit
Eine nativ installierte MongoDB-Instanz ist kein Hexenwerk – der entscheidende Unterschied zu einer unsicheren Standardinstallation liegt in der Reihenfolge: erst den Admin-User anlegen, dann Authentifizierung aktivieren. Mit SCRAM-Authentifizierung, einer auf interne IPs beschränkten bindIp-Konfiguration und TLS mit requireTLS bist du gegen die häufigsten Angriffsvektoren gewappnet. Version-Pinning schützt vor unbeabsichtigten Upgrades, UFW liefert eine zusätzliche Netzwerkschicht. Wer Wert auf direkten systemd-Lifecycle, klassisches Log-Management und unkomplizierten Zertifikatszugriff legt, ist mit der nativen Installation oft besser bedient als mit Docker-Volumes und Container-Netzwerken.
Weiterführende Anleitungen und Quellen
- PostgreSQL nativ installieren und absichern (Ubuntu/Debian, ohne Docker)
- MariaDB / MySQL installieren und absichern
- VPS absichern und härten: Anleitung mit UFW, SSH-Keys und Fail2Ban
- Let's Encrypt mit certbot – TLS-Zertifikate ohne Reverse-Proxy
- MongoDB Docs: Install MongoDB Community Edition on Ubuntu (v8.0)
- MongoDB Docs: Configure mongod for TLS/SSL (v8.0)
- MongoDB Docs: Enable SCRAM Client Authentication (v8.0)