Daten erfordern oft High-End-Sicherheit auf nahezu jeder Ebene der Datentransaktion, um Sicherheitsrichtlinien, Compliance und behördliche Vorschriften zu erfüllen. Der Ruf der Organisation kann zerstört werden, wenn ein unbefugter Zugriff auf sensible Daten erfolgt und somit die umrissene Vorschrift nicht eingehalten wird.
In diesem Blog werden wir einige der Sicherheitsmaßnahmen besprechen, die Sie in Bezug auf MongoDB anwenden können, wobei wir uns insbesondere auf die Client-Seite der Dinge konzentrieren.
Szenarien, in denen auf Daten zugegriffen werden kann
Es gibt mehrere Möglichkeiten, wie jemand auf Ihre MongoDB-Daten zugreifen kann, hier sind einige davon...
- Erfassung von Daten über ein unsicheres Netzwerk. Jemand kann über eine API mit einem VPN-Netzwerk auf Ihre Daten zugreifen, und es wird schwierig sein, sie aufzuspüren. Daten im Ruhezustand sind in diesem Fall oft der Übeltäter.
- Ein Superuser wie ein Administrator mit direktem Zugriff. Dies passiert, wenn Sie Benutzerrollen und -einschränkungen nicht definieren.
- Zugriff auf Daten auf der Festplatte haben, während Datenbanken mit Sicherungsdateien gelesen werden.
- Lesen des Serverspeichers und der protokollierten Daten.
- Versehentliche Offenlegung von Daten durch einen Mitarbeiter.
MongoDB-Datenkategorien und wie sie gesichert werden
Im Allgemeinen beinhaltet jedes Datenbanksystem zwei Arten von Daten:
- Data-at-Rest:Daten, die in den Datenbankdateien gespeichert sind
- Daten während der Übertragung:Daten, die zwischen einem Client, Server und der Datenbank übertragen werden.
MongoDB verfügt über eine Funktion zur Verschlüsselung im Ruhezustand, die Datenbankdateien auf der Festplatte verschlüsselt und somit verhindert Zugriff auf Datenbankdateien auf der Festplatte.
Daten bei der Übertragung über ein Netzwerk können in MongoDB durch Transportverschlüsselung mit TLS/SSL gesichert werden, indem die Daten verschlüsselt werden.
Für den Fall, dass Daten versehentlich von einem Mitarbeiter, z. B. einem Rezeptionisten, auf dem Desktop-Bildschirm offengelegt werden, integriert MongoDB die rollenbasierte Zugriffskontrolle, die es Administratoren ermöglicht, Berechtigungen auf Sammlungsebene für Benutzer zu erteilen und einzuschränken.
Daten, die über den Server abgewickelt werden, können im Arbeitsspeicher bleiben, und diese Ansätze sprechen zu keinem Zeitpunkt die Sicherheitsbedenken gegen den Datenzugriff im Serverspeicher an. MongoDB hat daher die clientseitige Verschlüsselung auf Feldebene eingeführt, um bestimmte Felder eines Dokuments zu verschlüsseln, die vertrauliche Daten enthalten.
Verschlüsselung auf Feldebene
MongoDB arbeitet mit Dokumenten, die definierte Felder haben. Einige Felder können erforderlich sein, um vertrauliche Informationen wie Kreditkartennummer, Sozialversicherungsnummer, Geduldsdiagnosedaten und vieles mehr zu enthalten.
Die Verschlüsselung auf Feldebene ermöglicht es uns, die Felder zu sichern, und sie können nur von autorisiertem Personal mit den Entschlüsselungsschlüsseln aufgerufen werden.
Die Verschlüsselung kann auf zwei Arten erfolgen
- Mit einem geheimen Schlüssel. Ein einziger Schlüssel wird sowohl zum Verschlüsseln als auch zum Entschlüsseln verwendet, daher muss er bei der Quell- und Zielübertragung vorgelegt, aber von allen Parteien geheim gehalten werden.
- Mit einem öffentlichen Schlüssel. Verwendet ein Schlüsselpaar, wobei einer zum Verschlüsseln und der andere zum Entschlüsseln verwendet wird
Beim Anwenden der Feldebenenverschlüsselung erwägen Sie die Verwendung eines neuen Datenbank-Setups anstelle eines bestehenden.
Clientseitige Feldebenenverschlüsselung (CSFLE)
Eingeführt in MongoDB Version 4.2 Enterprise, um Datenbankadministratoren eine Anpassung zum Verschlüsseln von Feldern mit Werten anzubieten, die gesichert werden müssen. Das heißt, die sensiblen Daten werden vom Client verschlüsselt oder entschlüsselt und nur verschlüsselt zum und vom Server kommuniziert. Außerdem haben selbst Superuser, die die Verschlüsselungsschlüssel nicht haben, keine Kontrolle über diese verschlüsselten Datenfelder.
Wie man CSFLE implementiert
Um die clientseitige Feldebenenverschlüsselung zu implementieren, benötigen Sie Folgendes:
- MongoDB Server 4.2 Enterprise
- MongoDB kompatibel mit CSFLE
- Dateisystemberechtigungen
- Spezifische Sprachtreiber. (In unserem Blog werden wir Node.js verwenden)
Das Implementierungsverfahren beinhaltet:
- Eine lokale Entwicklungsumgebung mit einer Software zum Ausführen von Client und Server
- Generieren und Validieren der Verschlüsselungsschlüssel.
- Konfigurieren des Clients für die automatische Verschlüsselung auf Feldebene
- Durchgängige Operationen in Bezug auf Abfragen der verschlüsselten Felder.
CSFLE-Implementierung
CSFLE verwendet die Envelope-Verschlüsselungsstrategie, bei der Datenverschlüsselungsschlüssel mit einem anderen Schlüssel verschlüsselt werden, der als Hauptschlüssel bekannt ist. Die Client-Anwendung erstellt einen Hauptschlüssel, der im Local Key Provider im Wesentlichen das lokale Dateisystem gespeichert wird. Dieser Speicheransatz ist jedoch unsicher, daher wird empfohlen, den Schlüssel in einem Key Management System (KMS) zu konfigurieren, das speichert und entschlüsselt Datenverschlüsselungsschlüssel aus der Ferne.
Nachdem die Datenverschlüsselungsschlüssel generiert wurden, werden sie in der Tresorsammlung im selben MongoDB-Replikatsatz wie die verschlüsselten Daten gespeichert.
Hauptschlüssel erstellen
In node js müssen wir einen lokal verwalteten Hauptschlüssel mit 96 Byte generieren und in eine Datei in dem Verzeichnis schreiben, in dem das Hauptskript ausgeführt wird:
$npm install fs && npm install crypto
Dann im Skript:
const crypto = require(“crypto”)
const fs = require(“fs”)
try{
fs.writeFileSync(‘masterKey.txt’, crypto.randomBytes(96))
}catch(err){
throw err;
}
Datenverschlüsselungsschlüssel erstellen
Dieser Schlüssel wird in einer Schlüsseltresorsammlung gespeichert, wo CSFLE-aktivierte Clients auf den Schlüssel zur Verschlüsselung/Entschlüsselung zugreifen können. Um eine zu generieren, benötigen Sie Folgendes:
- Lokal verwalteter Hauptschlüssel
- Verbindung zu Ihrer Datenbank, d. h. die MongoDB-Verbindungszeichenfolge
- Schlüsseltresor-Namespace (Datenbank und Sammlung)
Schritte zum Generieren des Datenverschlüsselungsschlüssels
-
Lesen Sie vorher den generierten lokalen Hauptschlüssel
const localMasterKey = fs.readFileSync(‘./masterKey.txt’);
-
Geben Sie die KMS-Anbietereinstellungen an, die vom Client verwendet werden, um den Hauptschlüssel zu ermitteln.
const kmsProvider = {
local: {
key: localMasterKey
}
}
-
Erstellen des Datenverschlüsselungsschlüssels. Wir müssen einen Client mit der MongoDB-Verbindungszeichenfolge und der Schlüsseltresor-Namespace-Konfiguration erstellen. Nehmen wir an, wir haben eine Datenbank namens Benutzer und darin eine keyVault-Sammlung. Sie müssen zuerst uuid-base64 installieren, indem Sie den Befehl
ausführen
$ npm install uuid-base64
Dann in deinem Skript
const base64 = require('uuid-base64');
const keyVaultNamespace = 'users.keyVaul';
const client = new MongoClient('mongodb://localhost:27017', {
useNewUrlParser: true,
useUnifiedTopology: true,
});
async function createKey() {
try {
await client.connect();
const encryption = new ClientEncryption(client, {
keyVaultNamespace,
kmsProvider,
});
const key = await encryption.createDataKey('local');
const base64DataKeyId = key.toString('base64');
const uuidDataKeyId = base64.decode(base64DataKeyId);
console.log('DataKeyId [UUID]: ', uuidDataKeyId);
console.log('DataKeyId [base64]: ', base64DataKeyId);
} finally {
await client.close();
}
}
createKey();
Ihnen wird dann ein ähnliches Ergebnis präsentiert
DataKeyId [UUID]: ad4d735a-44789-48bc-bb93-3c81c3c90824
DataKeyId [base64]: 4K13FkSZSLy7kwABP4HQyD==
Der Client muss über ReadWrite-Berechtigungen für den angegebenen Schlüsseltresor-Namespace verfügen
-
Um zu überprüfen, ob der Datenverschlüsselungsschlüssel erstellt wurde
const client = new MongoClient('mongodb://localhost:27017', {
useNewUrlParser: true,
useUnifiedTopology: true,
});
async function checkClient() {
try {
await client.connect();
const keyDB = client.db(users);
const keyColl = keyDB.collection(keyVault);
const query = {
_id: ‘4K13FkSZSLy7kwABP4HQyD==’,
};
const dataKey = await keyColl.findOne(query);
console.log(dataKey);
} finally {
await client.close();
}
}
checkClient();
Sie sollten ein Ergebnis dieser Art erhalten
{
_id: Binary {
_bsontype: 'Binary',
sub_type: 4,
position: 2,
buffer: <Buffer 68 ca d2 10 16 5d 45 bf 9d 1d 44 d4 91 a6 92 44>
},
keyMaterial: Binary {
_bsontype: 'Binary',
sub_type: 0,
position: 20,
buffer: <Buffer f1 4a 9f bd aa ac c9 89 e9 b3 da 48 72 8e a8 62 97 2a 4a a0 d2 d4 2d a8 f0 74 9c 16 4d 2c 95 34 19 22 05 05 84 0e 41 42 12 1e e3 b5 f0 b1 c5 a8 37 b8 ... 110 more bytes>
},
creationDate: 2020-02-08T11:10:20.021Z,
updateDate: 2020-02-08T11:10:25.021Z,
status: 0,
masterKey: { provider: 'local' }
}
Die zurückgegebenen Dokumentdaten umfassen:Datenverschlüsselungsschlüssel-ID (UUID), Datenverschlüsselungsschlüssel in verschlüsselter Form, KMS-Anbieterinformationen des Hauptschlüssels und Metadaten wie Tag von Schöpfung.
Zu verschlüsselnde Felder mit dem JSON-Schema angeben
Eine JSON-Schemaerweiterung wird von den MongoDB-Treibern verwendet, um die automatische clientseitige Verschlüsselung und Entschlüsselung der angegebenen Felder von Dokumenten in einer Sammlung zu konfigurieren. Die CSFLE-Konfiguration für dieses Schema erfordert:den Verschlüsselungsalgorithmus, der beim Verschlüsseln jedes Felds verwendet werden soll, einen oder alle Verschlüsselungsschlüssel, die mit dem CSFLE-Hauptschlüssel verschlüsselt sind, und den BSON-Typ jedes Felds.
Dieses CSFLE-JSON-Schema unterstützt jedoch keine Dokumentvalidierung, da ansonsten alle Validierungsinstanzen dazu führen, dass der Client einen Fehler ausgibt.
Clients, die nicht mit dem entsprechenden clientseitigen JSON-Schema konfiguriert sind, können mithilfe des serverseitigen JSON-Schemas daran gehindert werden, unverschlüsselte Daten in ein Feld zu schreiben.
Es gibt hauptsächlich zwei Verschlüsselungsalgorithmen:Zufällig und deterministisch.
Wir werden einen encryptMetadata-Schlüssel auf Stammebene des JSON-Schemas definieren und ihn mit den zu verschlüsselnden Feldern konfigurieren, indem wir sie im Eigenschaftsfeld des Schemas definieren, sodass sie diesen Verschlüsselungsschlüssel erben können .
{
"bsonType" : "object",
"encryptMetadata" : {
"keyId" : // keyId generated here
},
"properties": {
// field schemas here
}
}
Nehmen wir an, Sie möchten ein Bankkontonummernfeld verschlüsseln, Sie würden so etwas tun:
"bankAccountNumber": {
"encrypt": {
"bsonType": "int",
"algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic"
}
}
Aufgrund der hohen Kardinalität und der Abfragebarkeit des Feldes verwenden wir den deterministischen Ansatz. Sensible Felder wie Blutgruppe mit niedrigem Abfrageplan und niedriger Kardinalität können mit dem Zufallsverfahren verschlüsselt werden.
Array-Felder sollten eine zufällige Verschlüsselung mit CSFLE verwenden, um die automatische Verschlüsselung für alle Elemente zu verbessern.
Mongocryptd-Anwendung
In MongoDB Enterprise Service 4.2 und höher installiert, ist dies eine separate Verschlüsselungsanwendung, die die clientseitige Verschlüsselung auf Feldebene automatisiert. Immer wenn ein CSFLE-fähiger Client erstellt wird, wird dieser Dienst standardmäßig automatisch gestartet in:
- Validieren Sie die im JSON-Schema beschriebenen Verschlüsselungsanweisungen und ermitteln Sie, welche Felder in den Durchsatzvorgängen verschlüsselt werden sollen.
- Verhindern Sie, dass nicht unterstützte Operationen auf den verschlüsselten Feldern ausgeführt werden.
Um die Daten einzufügen, führen wir die normale Einfügeabfrage durch und das resultierende Dokument enthält unten Beispieldaten in Bezug auf das Bankkontofeld.
{
…
"bankAccountNumber":"Ac+ZbPM+sk7gl7CJCcIzlRAQUJ+uo/0WhqX+KbTNdhqCszHucqXNiwqEUjkGlh7gK8pm2JhIs/P3//nkVP0dWu8pSs6TJnpfUwRjPfnI0TURzQ==",
…
}
Wenn ein autorisiertes Personal eine Abfrage durchführt, entschlüsselt der Fahrer diese Daten und gibt sie in einem lesbaren Format zurück, z. B.
{
…
"bankAccountNumber":43265436456456456756,
…
}
Hinweis:Es ist nicht möglich, Dokumente in einem zufällig verschlüsselten Feld abzufragen, es sei denn, Sie verwenden ein anderes Feld, um das Dokument zu finden, das eine Annäherung an die zufällig verschlüsselten Felddaten enthält.
Fazit
Datensicherheit sollte auf allen Ebenen in Bezug auf gespeicherte und übertragene Daten berücksichtigt werden. MongoDB Enterprise 4.2 Server bietet Entwicklern ein Fenster zum Verschlüsseln von Daten von der Clientseite mithilfe der clientseitigen Feldebenenverschlüsselung, wodurch die Daten vor den Datenbankhostanbietern geschützt und der Netzwerkzugriff unsicher wird. CSFLE verwendet Umschlagverschlüsselung, bei der ein Hauptschlüssel zum Verschlüsseln von Datenverschlüsselungsschlüsseln verwendet wird. Der Hauptschlüssel sollte daher mit Schlüsselverwaltungstools wie dem Schlüsselverwaltungssystem sicher aufbewahrt werden.