Der wesentliche Leitfaden für die Sicherheit von MongoDB

David Murphy fungiert als Praxismanager für MongoDB bei Percona, einem Anbieter von MySQL- und MongoDB-Lösungen und -Diensten der Enterprise-Klasse.

Die Sicherheit von MongoDB ist wieder in den Nachrichten. Eine kürzlich erschienene Flut von Geschichten zeigt, wie Hacker MongoDB-Datenbanken beschlagnahmt und die Daten für Bitcoins freigegeben haben. Laut Rapid7 wurden Zehntausende von MongoDB-Installationen kompromittiert.

Wir alle sorgen uns um die Sicherheit. Wenn Sie Anwendungen, Netzwerke oder Datenbanken ausführen, ist Sicherheit immer ein zentrales Thema. Da immer mehr Unternehmen Open-Source-Software wie MongoDB verwenden, um wichtige Unternehmensdaten zu speichern, wird die Sicherheit zu einer noch größeren Frage. Abhängig von Ihrem Unternehmen verfügen Sie möglicherweise auch über mehrere behördliche (z. B. das Gesetz zur Portabilität und Rechenschaftspflicht von Krankenversicherungen oder HIPAA) oder geschäftliche (PCI DSS) Standards für die Netzwerksicherheit, die Sie einhalten müssen.

Ist die MongoDB-Datenbanksoftware sicher? Entspricht es diesen Standards? Die kurze Antwort: Ja, und ja! Es geht einfach darum zu wissen, wie Sie Ihre spezielle Installation einrichten, konfigurieren und damit arbeiten.

In diesem Artikel werde ich mich mit der MongoDB-Sicherheit befassen. MongoDB ist sicher zu bedienen - wenn Sie wissen, wonach Sie suchen und wie Sie es konfigurieren müssen.

Wie gehen die Leute mit der MongoDB-Sicherheit vor? Es gibt mehrere Schlüsselbereiche, die Benutzer in Bezug auf die MongoDB-Sicherheit stören:

  • Verwenden der Standardports
  • Authentifizierung nicht sofort aktivieren (das größte Problem!)
  • Bei Verwendung der Authentifizierung erhalten alle einen breiten Zugriff
  • Verwenden Sie LDAP nicht, um Kennwortrotationen zu erzwingen
  • Keine SSL-Nutzung für die Datenbank erzwingen
  • Keine Einschränkung des Datenbankzugriffs auf bekannte Netzwerkgeräte (Anwendungshosts, Load Balancer usw.)
  • Keine Einschränkung, welches Netzwerk empfangsbereit ist (dies betrifft jedoch keine unterstützten Versionen mehr)

MongoDB verfügt über fünf zentrale Sicherheitsbereiche:

  • Authentifizierung. Die LDAP-Authentifizierung zentralisiert Elemente in Ihrem Unternehmensverzeichnis.
  • Genehmigung. Die Autorisierung definiert, welche rollenbasierten Zugriffssteuerungen die Datenbank bereitstellt.
  • Verschlüsselung. Die Verschlüsselung kann in Ruhezustand und Transit unterteilt werden. Die Verschlüsselung ist für die Sicherung von MongoDB von entscheidender Bedeutung.
  • Prüfung. Auditing bezieht sich auf die Fähigkeit zu sehen, wer was in der Datenbank getan hat.
  • Führung. Governance bezieht sich auf die Validierung von Dokumenten und die Überprüfung auf sensible Daten (wie Kontonummer, Passwort, Sozialversicherungsnummer oder Geburtsdatum). Dies bezieht sich sowohl auf das Wissen, wo vertrauliche Daten gespeichert sind, als auch auf das Verhindern, dass vertrauliche Daten in das System eingeführt werden.

LDAP-Authentifizierung

MongoDB verfügt über integrierte Benutzerrollen und deaktiviert diese standardmäßig. Es fehlen jedoch Elemente wie die Komplexität des Kennworts, die altersbasierte Rotation sowie die Zentralisierung und Identifizierung von Benutzerrollen im Vergleich zu Servicefunktionen. Diese sind wichtig, um Vorschriften wie die PCI-DSS-Konformität zu verabschieden. Beispielsweise verbietet PCI DSS die Verwendung alter Kennwörter und leicht zu brechender Kennwörter und erfordert Änderungen des Benutzerzugriffs, wenn sich der Status ändert (z. B. wenn der Benutzer eine Abteilung oder das Unternehmen verlässt).

Glücklicherweise kann LDAP verwendet werden, um viele dieser Lücken zu schließen. Viele Connectors ermöglichen die Verwendung von Windows Active Directory (AD) -Systemen für die Kommunikation mit LDAP.

Hinweis: Die LDAP-Unterstützung ist nur in MongoDB Enterprise verfügbar. Es ist nicht in der Community-Version. Es ist in anderen Open Source-Versionen von MongoDB verfügbar, z. B. Percona Server for MongoDB. 

MongoDB 3.2 speichert Benutzer in LDAP, jedoch keine Rollen (diese werden derzeit auf den einzelnen Computern gespeichert). MongoDB 3.4 Enterprise sollte die Möglichkeit einführen, Rollen in LDAP für den zentralen Zugriff zu speichern. (Wir werden die Rollen später besprechen.)

Percona

Mithilfe von LDAP und AD können Sie Benutzer mit Ihrem Unternehmensverzeichnis verknüpfen. Wenn sie die Rollen wechseln oder das Unternehmen verlassen, können sie von der Personalabteilung aus Ihrer Datenbankgruppe entfernt werden. Somit verfügen Sie über ein automatisiertes System, das sicherstellt, dass nur diejenigen, die manuell auf die Daten zugreifen möchten, dies tun können, ohne versehentlich etwas zu verpassen.

LDAP in Mongo ist eigentlich einfach. MongoDB verfügt über einen speziellen Befehl, mit dem die externe LDAP-Datenbank überprüft werden soll : $external.

Einige andere Einschränkungen für die Verwendung von LDAP:

  • Erstellen Sie einen Benutzer mit, .createUserwie Sie es normalerweise tun würden, aber achten Sie darauf, dass Sie die Ressourcen-Tags db / collection verwenden.
  • Darüber hinaus erfordert die LDAP-Authentifizierung zwei weitere Felder:
    • Mechanismus: "PLAIN"
    • DigestPassword: false

Benutzerdefinierte Rollen

Die rollenbasierte Zugriffskontrolle (RBAC) ist der Kern von MongoDB. In MongoDB sind seit Version 2.6 integrierte Rollen verfügbar. Sie können sogar Ihre eigenen erstellen, bis hin zu den spezifischen Aktionen, die ein bestimmter Benutzer möglicherweise ausführen darf. Auf diese Weise können Sie definieren, was ein bestimmter Benutzer mit Rasiermessergenauigkeit tun oder sehen kann. Dies ist eine Kernfunktion von MongoDB, die in nahezu allen Anbietern der Open Source-Software verfügbar ist.

Die fünf wichtigsten integrierten MongoDB-Rollen, die Sie kennen sollten:

  • read::
    • Schreibgeschützter Zugriff, der normalerweise den meisten Benutzern gewährt wird
  • readWrite::
    • readWrite Der Zugriff ermöglicht das Bearbeiten von Daten
    • readWrite beinhaltet lesen
  • dbOwner::
    • Enthält readWrite, dbAdmin, userAdmin(für die Datenbank). userAdminbedeutet, Benutzer hinzuzufügen oder zu entfernen, Benutzern Berechtigungen zu erteilen und Rollen zu erstellen. Diese Berechtigungen werden nur dem jeweiligen Datenbankserver zugewiesen.
  • dbAdminAnyDatabase::
    • Erstellt dbAdminin allen Datenbanken, erlaubt jedoch keine Benutzerverwaltung (z. B. zum Erstellen oder Entfernen von Benutzern). Sie können Indizes erstellen, Komprimierungen aufrufen und vieles mehr. Dies bietet keinen Sharding-Zugriff.
  • root::
    • Dies ist ein Superuser, aber mit Grenzen
    • Es kann die meisten Dinge tun, aber nicht alle:
      • Systemerfassung kann nicht geändert werden
      • Einige Befehle sind für diese Rolle je nach Version immer noch nicht verfügbar. Mit der Stammrolle MongoDB 3.2 können Sie beispielsweise die Größe von Oplog oder Profiler nicht ändern, und mit der Stammrolle MongoDB 3.4 können Sie die aktuellen Ansichten nicht lesen.

Platzhalterdatenbanken und Sammlungen

Platzhalter bedeutet, großen Gruppen von Datenbanken oder Sammlungen (oder allen) auf einem Server Berechtigungen zu erteilen. Mit einem Nullwert können Sie alle Datenbanken oder Sammlungen angeben und die dbAdminAnyDatabaseRolle vermeiden . Auf diese Weise können bestimmte Benutzer alle Berechtigungen einschließlich der Verwaltungsfunktionen nutzen.

Das ist gefährlich.

Wenn Sie Platzhalter verwenden, gewähren Sie viele Sonderrechte, und Sie sollten sich bewusst sein, dass Sie mögliche Angriffswege eröffnen:

  • readWriteAnyDatabaseist extrem breit und setzt Benutzernamen und Rollen einem potenziellen Angriff über den Anwendungsbenutzer aus
  • Die Verwendung von Platzhaltern bedeutet, dass Sie bestimmte Anwendungen nicht auf bestimmte Datenbanken beschränken
  • Durch Platzhalter können Sie keine Mandantenfähigkeit für mehrere Datenbanken verwenden
  • Neue Datenbanken erhalten nicht automatisch Zugriff

Erstellen einer benutzerdefinierten Rolle

Die Stärke von MongoDB-Rollen liegt in der Erstellung benutzerdefinierter Rollen. In einer benutzerdefinierten Rolle können Sie angeben, dass jede Aktion für eine Ressource für einen bestimmten Benutzer angegeben werden kann. Mit dieser Granularität können Sie genau steuern, wer was in Ihrer MongoDB-Umgebung tun kann.

Wenn Sie eine benutzerdefinierte Rolle angeben, gibt es vier verschiedene Arten von Ressourcen:

  • db. Gibt eine Datenbank an. Sie können eine Zeichenfolge für einen Namen oder "" für "any" verwenden (kein Platzhalter).
  • collection. Gibt eine Sammlung von Dokumenten an. Sie können eine Zeichenfolge für einen Namen oder "" für "any" verwenden (kein Platzhalter).
  • cluster. Gibt einen Sharded-Cluster oder andere Metadatenressourcen an. Es ist ein boolescher Wert von true / false.
  • anyResource. Gibt den Zugriff auf alles überall an. Es ist ein boolescher Wert von true / false.

Jede Rolle kann die Eigenschaften einer anderen Rolle erben. Es gibt ein Array namens "Rollen", und Sie können eine neue Rolle im Array ablegen. Es erbt die Eigenschaften der angegebenen Rolle.

Verwenden Sie createRolediese Option, um dem Array eine Rolle hinzuzufügen.

Sie können einem Benutzer oder einer Rolle neue oder vorhandene Datenbanken hinzufügen. Sie können beispielsweise Lese- und Schreibzugriff auf eine Datenbank hinzufügen, indem Sie die Datenbank an eine Rolle anhängen.

Verwenden Sie den grantPrivilegesToRoleBefehl, um einer vorhandenen Rolle neue Ressourcen hinzuzufügen.

Unten finden Sie ein Beispiel für das Erstellen einer neuen Superuser-Rolle. Der Zweck dieser Rolle besteht wiederum darin, einen Benutzer zu haben, der in der MongoDB-Umgebung (für Notfallsituationen) in keiner Weise eingeschränkt ist.

db = db.geSiblingDB(“admin”);

db.createRole({     

     role: “superRoot”,     

     privileges:[{          

          resource: {anyResource:true},          

          actions: [‘anyAction’]     

     }]     

     roles:[]

});

db.createUser({     

     user: “comanyDBA”,     

     pwd: “EWqeeFpUt9*8zq”,     

     roles: [“superRoot”]

})

Diese Befehle erstellen eine neue Rolle in der geSiblingDBaufgerufenen Datenbank superRootund weisen dieser Rolle jede Ressource und jede Aktion zu. Dann erstellen wir einen neuen Benutzer in derselben Datenbank namens companyDBA(mit einem Kennwort) und weisen ihm die neue superRootRolle zu.

Verwenden von SSL für alle Dinge

SSL hilft dabei, die Sicherheit Ihrer Daten über ungesicherte Netzwerke zu gewährleisten. Wenn Sie eine Datenbank verwenden, die mit dem Internet interagiert, sollten Sie SSL verwenden.

Es gibt zwei sehr gute Gründe, SSL zum Sichern von MongoDB zu verwenden: Datenschutz und Authentifizierung. Ohne SSL können Sie auf Ihre Daten zugreifen, sie kopieren und für illegale oder schädliche Zwecke verwenden. Mit der Authentifizierung haben Sie eine sekundäre Sicherheitsstufe. Die Private Key Infrastructure (PKI) von SSL garantiert, dass nur Benutzer mit dem richtigen CA-Zertifikat auf MongoDB zugreifen können.

MongoDB bietet seit langem SSL-Unterstützung, hat jedoch die SSL-Unterstützung in den letzten Versionen erheblich verbessert. Wenn Sie SSL verwenden wollten, mussten Sie es zuvor herunterladen und manuell mit der MongoDB Community-Version kompilieren. Ab MongoDB 3.0 wird SSL standardmäßig mit der Software kompiliert. 

In älteren Versionen von MongoDB fehlte auch eine gültige Hostprüfung. Die Hostüberprüfung war lediglich ein Flag, das Sie in der Konfigurationsdatei einchecken konnten, die eine SSL-Anforderung von einer Verbindung erfüllte.

Die neuesten Versionen von SSL in MongoDB enthalten die folgenden Hauptfunktionen:

  • Überprüft auf gültige Hosts (optional)
  • Möglichkeit, auf eine bestimmte zu verwendende Setup-Schlüsseldatei zu verweisen
  • Benutzerdefinierte Zertifizierungsstelle (CA) für selbstsignierte Zertifikate oder alternative Unterzeichner
  • allowSSL, preferSSL, requireSSLModi, mit denen Sie eine Granularität für Ihre SSL - Nutzung wählen (von weniger sicher sicherer)

SSL: Verwenden einer benutzerdefinierten Zertifizierungsstelle

Mit den neueren SSL-Versionen in MongoDB können Sie eine benutzerdefinierte Zertifizierungsstelle verwenden. Dies gibt Ihnen zwar Flexibilität bei der Angabe, wie Sie mit SSL arbeiten möchten, ist jedoch mit Einschränkungen verbunden. Wenn Sie lediglich versuchen, die Verbindung zu sichern, könnten Sie versucht sein, sich dafür zu entscheiden sslAllowInvalidCertficates. Dies ist jedoch aus mehreren Gründen im Allgemeinen eine schlechte Idee:

  • Ermöglicht jede Verbindung von abgelaufenen zu widerrufenen Zertifikaten
  • Sie stellen keine Einschränkungen für einen bestimmten Hostnamen sicher
  • Sie sind bei weitem nicht so sicher, wie Sie denken

Um dies zu beheben, legen Sie einfach fest net.ssl.CAFile, und MongoDB verwendet sowohl den Schlüssel als auch die CA-Datei (Sie müssen dies auf dem Client tun).

Die Verwendung von SSL hat jedoch einen bekannten Nachteil: die Leistung. Sie werden definitiv etwas an Leistung verlieren, wenn Sie SSL verwenden.

Festplattenverschlüsselung

Die Daten sind entweder "unterwegs" oder "in Ruhe". Sie können eine oder beide in MongoDB verschlüsseln. Wir haben die Datenverschlüsselung während der Übertragung (SSL) erörtert. Betrachten wir nun die Daten in Ruhe.

Ruhedaten sind Daten, die auf der Festplatte gespeichert sind. Die Verschlüsselung im Ruhezustand bezieht sich normalerweise auf Daten, die an einem verschlüsselten Speicherort gespeichert sind. Dies dient dazu, Diebstahl durch physische Mittel zu verhindern und Backups zu erstellen, die auf eine Weise gespeichert werden, die von Dritten nicht leicht gelesen werden kann. Dem sind praktische Grenzen gesetzt. Das größte Problem besteht darin, Ihren Systemadministratoren zu vertrauen - und davon auszugehen, dass ein Hacker keinen Administratorzugriff auf das System erhalten hat.

Dies ist kein Problem, das nur bei MongoDB auftritt. Auch in anderen Systemen wirken vorbeugende Maßnahmen. Dazu gehören möglicherweise Verschlüsselungstools wie LUKS und cryptfs oder noch sicherere Methoden wie das Signieren von Verschlüsselungsschlüsseln mit LDAP, Smartcards und Token vom Typ RSA.

Wenn Sie diese Verschlüsselungsstufe durchführen, müssen Sie Faktoren wie das automatische Bereitstellen und Entschlüsseln von Laufwerken berücksichtigen. Dies ist jedoch für Ihre Systemadministratoren nicht neu. Sie können diese Anforderung genauso verwalten wie in anderen Teilen des Netzwerks. Der zusätzliche Vorteil ist ein einziges Verfahren für die Speicherverschlüsselung, nicht eines für die von einer bestimmten Funktion verwendete Technologie.

Die Datenverschlüsselung im Ruhezustand kann mit einer oder allen der folgenden Methoden gelöst werden:

  • Verschlüsseln Sie das gesamte Volume
  • Verschlüsseln Sie nur die Datenbankdateien
  • In der Anwendung verschlüsseln

Das erste Problem kann mit der Festplattenverschlüsselung im Dateisystem gelöst werden. Es ist einfach mit LUKS und dm-crypt einzurichten. Für die PCI DSS-Konformität und andere Zertifizierungsanforderungen sind nur die erste und die zweite Option erforderlich.

Prüfung

Für ein gutes Sicherheitsdesign ist es von zentraler Bedeutung, zu verfolgen, welcher Benutzer welche Aktion in der Datenbank ausgeführt hat (ähnlich wie Sie Ihre tatsächlichen Server steuern sollten). Mit der Überwachung können Sie die Ausgabe eines bestimmten Benutzers, einer bestimmten Datenbank, einer bestimmten Sammlung oder eines bestimmten Quellorts filtern. Dadurch wird ein Protokoll erstellt, das auf Sicherheitsvorfälle überprüft wird. Noch wichtiger ist, dass jedem Sicherheitsprüfer angezeigt wird, dass Sie die richtigen Schritte unternommen haben, um Ihre Datenbank vor einem Eindringen zu schützen und die Tiefe eines Eindringens zu verstehen, falls einer auftreten sollte.

Mit der Überwachung können Sie die Aktionen eines Eindringlings in Ihrer Umgebung vollständig verfolgen.

Hinweis: Die Überwachung ist nur in MongoDB Enterprise verfügbar. Es ist nicht in der Community-Version. Es ist in einigen anderen Open Source-Versionen von MongoDB verfügbar, z. B. Percona Server for MongoDB.