MongoDB
Security-Tipps gegen Hacker
Gregor Biswanger | Freier Dozent, Berater, Trainer und Autor
about.me/gregor.biswanger
Über mich
 Freier Dozent, Berater und Trainer
 Schwerpunkte Softwarearchitektur, XAML, Web
und Cross-Plattform Entwicklung
 Technologieberater für die Intel Developer Zone
 Sprecher auf Konferenzen und User Groups
 Freier Autor für heise.de, dotnetpro,
WindowsDeveloper und viele weitere
Fachmagazine
 Video-Trainer bei video2brain und MicrosoftGregor Biswanger
Microsoft MVP, Intel Black Belt &
Intel Software Innovator
cross-platform-blog.de
about.me/gregor.biswanger
Legal Disclaimer
The information provided in this session is to be used for educational
purposes only. The speaker is in no way responsible for any misuse of
the information provided. All of the information in this session is
meant to help the attendees develop a hacker defense attitude in
order to prevent the attacks discussed. In no way should you use the
information to cause any kind of damage directly or indirectly. The
word „Hack“ or „Hacking“ in this session should be regarded as
„Ethical Hack“ or „Ethical hacking“ respectvely.
Unser Reiseplan
 Aktuelles Problem
 Security von MongoDB
 Basis Authentifizierung
 Zugriff mit Authentifizierung
 Robomongo
 Setup-Script zur Authentifizierung
 Weitere Top Security Tipps
Aktuelles
Problem
So „einfach“ wird MongoDB
gehackt
MongoDB Apocalypse 2017
 Bei MongoDB ist per
Standard keine Security aktiv
 Anfang 2017 wurden
mehrere tausend
MongoDB-Server gehackt
 Die Daten wurden geklaut
und anschließend durch
eine Lösegeld Aufforderung
ersetzt
Das kann EUCH auch passieren!
Suchmaschinen von Servern mit „offenen“ Ports
 https://www.shodan.io
 https://censys.io
 https://www.zoomeye.org
Quelle: zoomeye
Shodan.io
Gefundene MongoDB Server ohne Security
Eigenes Netzwerk schon gescannt?
 Kostenloser Security Port Scanner: NMAP
 https://nmap.org
 Läuft unter Windows, Mac und Linux
 Nmap ist sowohl bei Angreifern als auch bei Administratoren sehr
beliebt, da es sehr effizient und zuverlässig arbeitet.
 In einigen Filmen kommt Nmap vor: In Matrix Reloaded hackt sich der
Charakter Trinity mithilfe des 2001 entdeckten SSH1-CRC32-Exploit in
ein Kraftwerk ein, nachdem sie den Rechner mit Nmap gescannt hat.
 In dem Film Battle Royale wird der Quelltext von Nmap gezeigt. Des
Weiteren wird in Das Bourne Ultimatum die damalige Beta-Version 4.01
mit der grafischen Oberfläche Zenmap benutzt.
Security von
MongoDB
Die Basis von allem
Gefährdende Schnittstellen
Network Storage Access
MongoDB V3
Basic
Authentication
Robust
Authentication
SSL
Server-Server
Authentication
LDAP / Kerberos Encryption At Rest
Kein öffentlichen Zugriff auf die MongoDB!
Application
Mongo
Public / Other
Firewall Regeln
 Zugriff nur auf den Application-Server beschränken
 Zugriff nur auf den Mongo-Port beschränken
 Am besten keinen Standard Mongo-Port verwenden
Mongo Server IP Konfiguration
 In der Mongo Konfigurationsdatei
ebenfalls nur erlaubte IP-Adressen
hinterlegen
 Verwende dazu die bindIp Option
 Oder auch als Start-Parameter
„mongod --bind_ip 255.255.255.255“
 Lokale IP-Adressen werden immer
erlaubt
systemLog:
destination: file
path: "/var/log/mongodb/mongod.log"
logAppend: true
storage:
journal:
enabled: true
processManagement:
fork: true
net:
bindIp: 127.0.0.1
port: 27017
setParameter:
enableLocalhostAuthBypass: false
...
Basis
Authentifizierung
Der Standard von Mongo
Authentifizierung und Autorisierung
„Wer bist du?“
„Was möchtest du machen?“
„OK!“
„Bob“
„Eine Collection lesen“
Es gibt eine Vielzahl an Aktionen
„Was möchtest du
machen?“
„Eine Collection lesen“
 Read Collection
 Write Document
 List Collection
 Create User
 Create Database
 Backup
 Restore
 Administer Shards
 Kill Cursor
 …
Autorisierung mit Rollen
„Was möchtest du
machen?“
„Eine Collection lesen“
 readWrite
 Read Collection
 Write Document
 List Collection
 …
 userAdmin
 Create User
 Grant User Permissions
 …
 dbAdmin
 dbStats
 repairDatabase
 …
Die Rolle: Root
 Darf ALLES!
 Sollte so gut wie gar nicht benutzt zum Einsatz kommen!
 Darf niemand weitergegeben werden!
Die Rolle: userAdminAnyDatabase
 Darf sehr viel!
 Sollte nur zum Verwalten von Benutzer zum Einsatz kommen
 Kann Benutzer anlegen
 Kann Rechte von Benutzer verwalten
 Kann sich selbst höhere Rechte geben
Die Rolle: read
 Lesen von Collections
 Nur auf speziell hinterlegte Datenbank
Die Rolle: readWrite
 Lesen und schreiben von Collections
 Nur auf speziell hinterlegte Datenbank
Die ersten Schritte zum Einrichten der internen
Authentifizierung
1. Starte Mongo ohne Authentifizierung (Automatisch Root-Rechte)
2. Lege einen Benutzer an mit der Rolle userAdminAnyDatabase für
die interne admin Datenbank
3. Starte Mongo erneut mit Authentifizierung
4. Einloggen mit der Mongo-Shell und dem neuen Admin-Benutzer
Account
5. Wechsle zum Kontext der gewünschten Datenbank und erzeuge
von dort aus einen Benutzer mit passenden Rollen
6. Ggf. eigene Rollen erzeugen oder Benutzer explizit einzelne
Aktionen zuweisen
1. Starte Mongo ohne Authentifizierung (Automatisch Root-Rechte)
2. Lege einen Benutzer an mit der Rolle userAdminAnyDatabase für
die interne admin Datenbank
3. Starte Mongo erneut mit Authentifizierung
4. Einloggen mit der Mongo-Shell und dem neuen Admin-Benutzer
Account
5. Wechsle zum Kontext der gewünschten Datenbank und erzeuge von
dort aus einen Benutzer mit passenden Rollen
Neuen Benutzer testen
Zugriff mit
Authentifizierung
Von einer Node.js-Applikation
Authentifizierung via Connection-String
const MongoClient = require('mongodb').MongoClient;
// Connection URL
var url = 'mongodb://appUser:123456@localhost:27017/myproject';
// Use connect method to connect to the server
MongoClient.connect(url, function (error, db) {
console.log("Connected successfully to server");
db.close();
});
Authentifizierung via Code (Besser)
const MongoClient = require('mongodb').MongoClient;
// Connection URL
var url = 'mongodb://localhost:27017/myproject';
// Use connect method to connect to the server
MongoClient.connect(url, function (error, db) {
console.log('Connected successfully to server');
db.authenticate('appUser', '123456', () => {
console.log('Logged in as appUser');
db.close();
});
});
Zugriff mit
Robomongo
Tooling
Robomongo
 Kostenloses MongoDB
Management Tool
 Läuft unter Windows, Mac
und Linux
 https://robomongo.org
Setup-Script der
Authentifizierung
Zur Automatisierung
Scripting für die Mongo Shell
 Ermöglicht das automatische Erstellen der Datenbank oder das
verarbeiten von Administrationsaufgaben
 Wird in JavaScript geschrieben
 Nicht alle gewohnten JavaScript-Funktionen können genutzt
werden
 Wird nicht innerhalb einer Node.js-Instanz ausgeführt
 Möglichkeiten und Dokumentation unter:
 https://docs.mongodb.com/manual/tutorial/write-scripts-for-the-mongo-
shell/#differences-between-interactive-and-scripted-mongo
Setup-Script zur Authentifizierung
var db = connect('localhost:27017/admin');
print('Create siteUserAdmin...');
var siteUserAdmin = {
user: 'siteUserAdmin',
pwd: '123456',
roles: [
{
role: 'userAdminAnyDatabase',
db: 'admin'
}
]
};
db.createUser(siteUserAdmin);
print('Switch to myproject db...');
db = db.getSiblingDB('myproject');
print('Create appUser...');
var appUser = {
user: 'appUser',
pwd: '123456',
roles: [
{
role: 'readWrite',
db: 'myproject'
}
]
};
db.createUser(appUser);
print('Finish! Your Database is ready...');
Script ausführen
Security-Tipps Gewappnet sein
Verschlüsselte Kommunikation
 TLS/SSL für eingehende und ausgehende Kommunikation einsetzen
 Schutz gegen Man-in-the-Middle-Angriff
 Dokumentation:
 https://docs.mongodb.com/manual/tutorial/configure-ssl/
 mongod --sslMode requireSSL --sslPEMKeyFile /etc/ssl/mongodb.pem
Datenbank Dateien verschlüsseln
 Ab Version 3.2 gibt es Encrypted Storage Engine
 MongoDB Enterprise only
 Nur verfügbar für die WiredTiger Storage Engine (Normal Standard)
 Dokumentation:
 https://docs.mongodb.com/manual/core/security-encryption-at-rest
 https://docs.mongodb.com/manual/tutorial/configure-encryption
Backup System hinterlegen
 Das Tool MongoDB OPS Manager ermöglicht das automatisierte
Erzeugen von Backups
 MongoDB Enterprise only
 Dokumentation:
 https://docs.opsmanager.mongodb.com/current/tutorial/nav/backup-use
Mongo Shell Script JavaScript Support deaktivieren
 Auf dem Production-System den Script JavaScript Support
deaktivieren
 Es werden nur Mongo spezifische Scripts erlaubt (wire protocol)
 MongoDB mit folgenden Parameter ausführen:
 mongod --dbpath=c:temp --auth --noscripting
Monitoring aktivieren
 Das Tool MongoDB OPS Manager ermöglicht das automatisierte
Benachrichtigen (Alerts) bei sicherheitsrelevanten Aktionen
 MongoDB Enterprise only
 Dokumentation:
 https://docs.opsmanager.mongodb.com/current/tutorial/manage-alert-
configurations/
Regelmäßig Updaten
 MongoDB regelmäßig Updaten um
sich vor neuen Exploits zu schützen
 Hacker haben dafür eine Datenbank
und greifen bei einer Attacke darauf
zu:
 https://www.exploit-db.com
Mongoaudit einsetzen
 Open-Source Tool zum Testen der
MongoDB Security Einstellungen
 https://mongoaud.it
Letzter Tipp: Keine Security-Tipps ignorieren
http://about.me/Gregor.Biswanger
Ich freue mich auf Feedback!
Vielen Dank!

MongoDB: Security-Tipps gegen Hacker

  • 1.
    MongoDB Security-Tipps gegen Hacker GregorBiswanger | Freier Dozent, Berater, Trainer und Autor about.me/gregor.biswanger
  • 2.
    Über mich  FreierDozent, Berater und Trainer  Schwerpunkte Softwarearchitektur, XAML, Web und Cross-Plattform Entwicklung  Technologieberater für die Intel Developer Zone  Sprecher auf Konferenzen und User Groups  Freier Autor für heise.de, dotnetpro, WindowsDeveloper und viele weitere Fachmagazine  Video-Trainer bei video2brain und MicrosoftGregor Biswanger Microsoft MVP, Intel Black Belt & Intel Software Innovator cross-platform-blog.de about.me/gregor.biswanger
  • 3.
    Legal Disclaimer The informationprovided in this session is to be used for educational purposes only. The speaker is in no way responsible for any misuse of the information provided. All of the information in this session is meant to help the attendees develop a hacker defense attitude in order to prevent the attacks discussed. In no way should you use the information to cause any kind of damage directly or indirectly. The word „Hack“ or „Hacking“ in this session should be regarded as „Ethical Hack“ or „Ethical hacking“ respectvely.
  • 4.
    Unser Reiseplan  AktuellesProblem  Security von MongoDB  Basis Authentifizierung  Zugriff mit Authentifizierung  Robomongo  Setup-Script zur Authentifizierung  Weitere Top Security Tipps
  • 5.
  • 6.
    MongoDB Apocalypse 2017 Bei MongoDB ist per Standard keine Security aktiv  Anfang 2017 wurden mehrere tausend MongoDB-Server gehackt  Die Daten wurden geklaut und anschließend durch eine Lösegeld Aufforderung ersetzt
  • 7.
    Das kann EUCHauch passieren!
  • 8.
    Suchmaschinen von Servernmit „offenen“ Ports  https://www.shodan.io  https://censys.io  https://www.zoomeye.org Quelle: zoomeye
  • 9.
  • 10.
    Eigenes Netzwerk schongescannt?  Kostenloser Security Port Scanner: NMAP  https://nmap.org  Läuft unter Windows, Mac und Linux  Nmap ist sowohl bei Angreifern als auch bei Administratoren sehr beliebt, da es sehr effizient und zuverlässig arbeitet.  In einigen Filmen kommt Nmap vor: In Matrix Reloaded hackt sich der Charakter Trinity mithilfe des 2001 entdeckten SSH1-CRC32-Exploit in ein Kraftwerk ein, nachdem sie den Rechner mit Nmap gescannt hat.  In dem Film Battle Royale wird der Quelltext von Nmap gezeigt. Des Weiteren wird in Das Bourne Ultimatum die damalige Beta-Version 4.01 mit der grafischen Oberfläche Zenmap benutzt.
  • 11.
  • 12.
  • 13.
  • 14.
    Kein öffentlichen Zugriffauf die MongoDB! Application Mongo Public / Other
  • 15.
    Firewall Regeln  Zugriffnur auf den Application-Server beschränken  Zugriff nur auf den Mongo-Port beschränken  Am besten keinen Standard Mongo-Port verwenden
  • 16.
    Mongo Server IPKonfiguration  In der Mongo Konfigurationsdatei ebenfalls nur erlaubte IP-Adressen hinterlegen  Verwende dazu die bindIp Option  Oder auch als Start-Parameter „mongod --bind_ip 255.255.255.255“  Lokale IP-Adressen werden immer erlaubt systemLog: destination: file path: "/var/log/mongodb/mongod.log" logAppend: true storage: journal: enabled: true processManagement: fork: true net: bindIp: 127.0.0.1 port: 27017 setParameter: enableLocalhostAuthBypass: false ...
  • 17.
  • 18.
    Authentifizierung und Autorisierung „Werbist du?“ „Was möchtest du machen?“ „OK!“ „Bob“ „Eine Collection lesen“
  • 19.
    Es gibt eineVielzahl an Aktionen „Was möchtest du machen?“ „Eine Collection lesen“  Read Collection  Write Document  List Collection  Create User  Create Database  Backup  Restore  Administer Shards  Kill Cursor  …
  • 20.
    Autorisierung mit Rollen „Wasmöchtest du machen?“ „Eine Collection lesen“  readWrite  Read Collection  Write Document  List Collection  …  userAdmin  Create User  Grant User Permissions  …  dbAdmin  dbStats  repairDatabase  …
  • 21.
    Die Rolle: Root Darf ALLES!  Sollte so gut wie gar nicht benutzt zum Einsatz kommen!  Darf niemand weitergegeben werden!
  • 22.
    Die Rolle: userAdminAnyDatabase Darf sehr viel!  Sollte nur zum Verwalten von Benutzer zum Einsatz kommen  Kann Benutzer anlegen  Kann Rechte von Benutzer verwalten  Kann sich selbst höhere Rechte geben
  • 23.
    Die Rolle: read Lesen von Collections  Nur auf speziell hinterlegte Datenbank
  • 24.
    Die Rolle: readWrite Lesen und schreiben von Collections  Nur auf speziell hinterlegte Datenbank
  • 25.
    Die ersten Schrittezum Einrichten der internen Authentifizierung 1. Starte Mongo ohne Authentifizierung (Automatisch Root-Rechte) 2. Lege einen Benutzer an mit der Rolle userAdminAnyDatabase für die interne admin Datenbank 3. Starte Mongo erneut mit Authentifizierung 4. Einloggen mit der Mongo-Shell und dem neuen Admin-Benutzer Account 5. Wechsle zum Kontext der gewünschten Datenbank und erzeuge von dort aus einen Benutzer mit passenden Rollen 6. Ggf. eigene Rollen erzeugen oder Benutzer explizit einzelne Aktionen zuweisen
  • 26.
    1. Starte Mongoohne Authentifizierung (Automatisch Root-Rechte)
  • 27.
    2. Lege einenBenutzer an mit der Rolle userAdminAnyDatabase für die interne admin Datenbank
  • 28.
    3. Starte Mongoerneut mit Authentifizierung
  • 29.
    4. Einloggen mitder Mongo-Shell und dem neuen Admin-Benutzer Account
  • 30.
    5. Wechsle zumKontext der gewünschten Datenbank und erzeuge von dort aus einen Benutzer mit passenden Rollen
  • 31.
  • 32.
  • 33.
    Authentifizierung via Connection-String constMongoClient = require('mongodb').MongoClient; // Connection URL var url = 'mongodb://appUser:123456@localhost:27017/myproject'; // Use connect method to connect to the server MongoClient.connect(url, function (error, db) { console.log("Connected successfully to server"); db.close(); });
  • 34.
    Authentifizierung via Code(Besser) const MongoClient = require('mongodb').MongoClient; // Connection URL var url = 'mongodb://localhost:27017/myproject'; // Use connect method to connect to the server MongoClient.connect(url, function (error, db) { console.log('Connected successfully to server'); db.authenticate('appUser', '123456', () => { console.log('Logged in as appUser'); db.close(); }); });
  • 35.
  • 36.
    Robomongo  Kostenloses MongoDB ManagementTool  Läuft unter Windows, Mac und Linux  https://robomongo.org
  • 37.
  • 38.
    Scripting für dieMongo Shell  Ermöglicht das automatische Erstellen der Datenbank oder das verarbeiten von Administrationsaufgaben  Wird in JavaScript geschrieben  Nicht alle gewohnten JavaScript-Funktionen können genutzt werden  Wird nicht innerhalb einer Node.js-Instanz ausgeführt  Möglichkeiten und Dokumentation unter:  https://docs.mongodb.com/manual/tutorial/write-scripts-for-the-mongo- shell/#differences-between-interactive-and-scripted-mongo
  • 39.
    Setup-Script zur Authentifizierung vardb = connect('localhost:27017/admin'); print('Create siteUserAdmin...'); var siteUserAdmin = { user: 'siteUserAdmin', pwd: '123456', roles: [ { role: 'userAdminAnyDatabase', db: 'admin' } ] }; db.createUser(siteUserAdmin); print('Switch to myproject db...'); db = db.getSiblingDB('myproject'); print('Create appUser...'); var appUser = { user: 'appUser', pwd: '123456', roles: [ { role: 'readWrite', db: 'myproject' } ] }; db.createUser(appUser); print('Finish! Your Database is ready...');
  • 40.
  • 41.
  • 42.
    Verschlüsselte Kommunikation  TLS/SSLfür eingehende und ausgehende Kommunikation einsetzen  Schutz gegen Man-in-the-Middle-Angriff  Dokumentation:  https://docs.mongodb.com/manual/tutorial/configure-ssl/  mongod --sslMode requireSSL --sslPEMKeyFile /etc/ssl/mongodb.pem
  • 43.
    Datenbank Dateien verschlüsseln Ab Version 3.2 gibt es Encrypted Storage Engine  MongoDB Enterprise only  Nur verfügbar für die WiredTiger Storage Engine (Normal Standard)  Dokumentation:  https://docs.mongodb.com/manual/core/security-encryption-at-rest  https://docs.mongodb.com/manual/tutorial/configure-encryption
  • 44.
    Backup System hinterlegen Das Tool MongoDB OPS Manager ermöglicht das automatisierte Erzeugen von Backups  MongoDB Enterprise only  Dokumentation:  https://docs.opsmanager.mongodb.com/current/tutorial/nav/backup-use
  • 45.
    Mongo Shell ScriptJavaScript Support deaktivieren  Auf dem Production-System den Script JavaScript Support deaktivieren  Es werden nur Mongo spezifische Scripts erlaubt (wire protocol)  MongoDB mit folgenden Parameter ausführen:  mongod --dbpath=c:temp --auth --noscripting
  • 46.
    Monitoring aktivieren  DasTool MongoDB OPS Manager ermöglicht das automatisierte Benachrichtigen (Alerts) bei sicherheitsrelevanten Aktionen  MongoDB Enterprise only  Dokumentation:  https://docs.opsmanager.mongodb.com/current/tutorial/manage-alert- configurations/
  • 47.
    Regelmäßig Updaten  MongoDBregelmäßig Updaten um sich vor neuen Exploits zu schützen  Hacker haben dafür eine Datenbank und greifen bei einer Attacke darauf zu:  https://www.exploit-db.com
  • 48.
    Mongoaudit einsetzen  Open-SourceTool zum Testen der MongoDB Security Einstellungen  https://mongoaud.it
  • 49.
    Letzter Tipp: KeineSecurity-Tipps ignorieren
  • 50.