sql >> Databáze >  >> NoSQL >> MongoDB

Přehled šifrování na úrovni pole na straně klienta v MongoDB

Data často vyžadují špičkové zabezpečení na téměř každé úrovni datové transakce, aby byla dodržena bezpečnostní pravidla, dodržování předpisů a vládní nařízení. Reputace organizace může být narušena, pokud dojde k neoprávněnému přístupu k citlivým datům, a tím nedodržení nastíněného mandátu.

V tomto blogu budeme diskutovat o některých bezpečnostních opatřeních, která můžete použít v souvislosti s MongoDB, a to zejména se zaměřením na klientskou stránku věcí.

Scénáře, kde lze získat přístup k datům

Existuje několik způsobů, jak se někdo může dostat k vašim datům MongoDB, zde jsou některé z nich...

  1. Zachycování dat přes nezabezpečenou síť. Někdo může přistupovat k vašim datům přes API se sítí VPN a bude těžké je vystopovat. V tomto případě jsou často na vině klidová data.
  2. Super uživatel, například správce s přímým přístupem. K tomu dochází, když se vám nepodaří definovat uživatelské role a omezení.
  3. Přístup k datům na disku při čtení databází záložních souborů.
  4. Čtení paměti serveru a protokolovaných dat.
  5. Náhodné zveřejnění údajů zaměstnancem.

Datové kategorie MongoDB a způsob jejich zabezpečení

Obecně každý databázový systém obsahuje dva typy dat: 

  1. Data-at-rest :Data, která jsou uložena v databázových souborech
  2. Přenos dat:Data, která se převádějí mezi klientem, serverem a databází.

MongoDB má funkci Encryption at Rest, která šifruje databázové soubory na disku, čímž zabraňuje přístup k databázovým souborům na disku.

Přenos dat po síti lze v MongoDB zabezpečit pomocí Transport Encryption pomocí TLS/SSL šifrováním dat.

V případě, že data náhodně odhalí zaměstnanec, například recepční na obrazovce počítače, MongoDB integruje řízení přístupu založené na rolích, které umožňuje administrátorům udělovat a omezovat uživatelům oprávnění na úrovni kolekce.

Data přenášená přes server mohou zůstat v paměti a tyto přístupy v žádném bodě neřeší problém zabezpečení proti přístupu k datům v paměti serveru. MongoDB proto zavedl Client-Side Field Level Encryption pro šifrování specifických polí dokumentu, která obsahují důvěrná data.

Šifrování na úrovni pole

MongoDB pracuje s dokumenty, které mají definovaná pole. Některá pole mohou vyžadovat důvěrné informace, jako je číslo kreditní karty, rodné číslo, údaje o diagnóze trpělivosti a mnoho dalšího.

Šifrování na úrovni pole nám umožní zabezpečit pole a mohou k nim přistupovat pouze oprávněné osoby s dešifrovacími klíči.

Šifrování lze provést dvěma způsoby

  1. Pomocí tajného klíče. Pro šifrování i dešifrování se používá jeden klíč, a proto musí být předložen při zdrojovém a cílovém přenosu, ale musí být všemi stranami udržován v tajnosti.
  2. Pomocí veřejného klíče. Používá dvojici klíčů, přičemž jeden se používá k šifrování a druhý k dešifrování

Při použití šifrování na úrovni pole zvažte použití nového nastavení databáze namísto stávající.

Client-Side Field Level Encryption (CSFLE)

Zavedeno v MongoDB verze 4.2 Enterprise s cílem nabídnout správcům databází úpravu pro šifrování polí obsahujících hodnoty, které je třeba zabezpečit. To znamená, že citlivá data jsou zašifrována nebo dešifrována klientem a pouze komunikována do a ze serveru v zašifrované podobě. Kromě toho ani super uživatelé, kteří nemají šifrovací klíče, nebudou mít kontrolu nad těmito šifrovanými datovými poli.

Jak implementovat CSFLE

Abyste mohli implementovat šifrování na úrovni pole na straně klienta, potřebujete následující:

  1. MongoDB Server 4.2 Enterprise
  2. MongoDB  kompatibilní s CSFLE
  3. Oprávnění k systému souborů
  4. Konkrétní jazykové ovladače. (V našem blogu budeme používat Node.js)

Procedura implementace zahrnuje:

  • Místní vývojové prostředí se softwarem pro provoz klienta a serveru
  • Generování a ověřování šifrovacích klíčů.
  • Konfigurace klienta pro automatické šifrování na úrovni pole
  • V průběhu operací z hlediska dotazů na šifrovaná pole.

Implementace CSFLE

CSFLE používá  strategii šifrování obálek, kdy jsou klíče pro šifrování dat zašifrovány jiným klíčem známým jako hlavní klíč. Klientská aplikace vytvoří hlavní klíč, který je uložen v místním poskytovateli klíčů v podstatě v místním systému souborů. Tento přístup k ukládání je však nejistý, a proto se doporučuje nakonfigurovat klíč v systému správy klíčů (KMS), který ukládá a vzdáleně dešifruje klíče pro šifrování dat.

Po vygenerování klíčů pro šifrování dat se tyto klíče uloží do kolekce vaultu ve stejné sadě replik MongoDB jako šifrovaná data.

Vytvořit hlavní klíč

V node js potřebujeme vygenerovat 96bajtový lokálně spravovaný hlavní klíč a zapsat jej do souboru v adresáři, ze kterého se spouští hlavní skript: 

$npm install fs && npm install crypto

Poté ve skriptu:

const crypto = require(“crypto”)

const fs = require(“fs”)



try{

fs.writeFileSync(‘masterKey.txt’, crypto.randomBytes(96))

}catch(err){

throw err;

}

Vytvořit klíč pro šifrování dat

Tento klíč je uložen ve sbírce trezoru klíčů, kde mohou klienti s povoleným CSFLE přistupovat ke klíči pro šifrování/dešifrování. Chcete-li jej vygenerovat, potřebujete následující:

  • Místně spravovaný hlavní klíč
  • Připojení k vaší databázi, tj. připojovací řetězec MongoDB
  • Jmenný prostor trezoru klíčů (databáze a kolekce)

Kroky pro vygenerování šifrovacího klíče dat

  1. Přečtěte si vygenerovaný místní hlavní klíč dříve

const localMasterKey = fs.readFileSync(‘./masterKey.txt’);
  1. Upřesněte nastavení poskytovatele KMS, která bude klientem použita ke zjištění hlavního klíče.

const kmsProvider = {

local: {

key: localMasterKey

}

}
  1. Vytvoření klíče pro šifrování dat. Potřebujeme vytvořit klienta s připojovacím řetězcem MongoDB a konfigurací jmenného prostoru trezoru klíčů. Řekněme, že budeme mít databázi nazvanou uživatelé a uvnitř ní kolekci keyVault. Nejprve musíte nainstalovat uuid-base64 spuštěním příkazu

$ npm install uuid-base64

Pak ve skriptu

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();

Potom se vám zobrazí nějaký výsledek, který se podobá

DataKeyId [UUID]: ad4d735a-44789-48bc-bb93-3c81c3c90824

DataKeyId [base64]: 4K13FkSZSLy7kwABP4HQyD==

Klient musí mít oprávnění ReadWrite pro zadaný jmenný prostor trezoru klíčů

 

  1. Ověření, že byl vytvořen klíč pro šifrování dat

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();

Měli byste obdržet nějaký výsledek tohoto druhu

{

  _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' }

}

Data vráceného dokumentu zahrnují:ID klíče pro šifrování dat (UUID), klíč pro šifrování dat v zašifrované podobě, informace o hlavním klíči poskytovatele KMS a metadata jako den vytvoření.

Zadání polí, která mají být šifrována pomocí schématu JSON

Rozšíření schématu JSON používají ovladače MongoDB ke konfiguraci automatického šifrování na straně klienta a dešifrování zadaných polí dokumentů v kolekci. Konfigurace CSFLE pro toto schéma bude vyžadovat:šifrovací algoritmus, který se má použít při šifrování každého pole, jeden nebo všechny šifrovací klíče zašifrované hlavním klíčem CSFLE a typem BSON každého pole.

Toto schéma CSFLE JSON však nepodporuje ověřování dokumentů, jinak jakékoli instance ověření způsobí, že klient vyvolá chybu.

Klientům, kteří nemají nakonfigurováno příslušné schéma JSON na straně klienta, lze omezit zápis nešifrovaných dat do pole pomocí schématu JSON na straně serveru.

Existují hlavně dva šifrovací algoritmy:náhodný a deterministický.

Na kořenové úrovni schématu JSON definujeme nějaký klíč encryptMetadata a nakonfigurujeme jej s poli, která mají být šifrována, jejich definováním v poli vlastností schématu, takže budou moci zdědit tento šifrovací klíč .

{

    "bsonType" : "object",

    "encryptMetadata" : {

        "keyId" : // keyId generated here

    },

    "properties": {

        // field schemas here

    }

}

Řekněme, že chcete zašifrovat pole s číslem bankovního účtu, udělali byste něco jako:

"bankAccountNumber": {

    "encrypt": {

        "bsonType": "int",

        "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic"

    }

}

Z důvodu vysoké mohutnosti a dotazovatelného pole používáme deterministický přístup. Citlivá pole, jako je krevní skupina, která mají nízký plán dotazů a nízkou mohutnost, mohou být šifrována pomocí náhodného přístupu.

Pole pole by měla používat náhodné šifrování pomocí CSFLE, aby se zlepšilo automatické šifrování pro všechny prvky.

Aplikace Mongocryptd

Toto je samostatná šifrovací aplikace nainstalovaná ve službě MongoDB Enterprise Service 4.2 a novější, která automatizuje šifrování na úrovni pole na straně klienta. Kdykoli je vytvořen klient s povoleným CSFLE, tato služba se automaticky spustí ve výchozím nastavení:

  • Ověřte pokyny pro šifrování uvedené ve schématu JSON a zjistěte, která pole mají být v operacích propustnosti šifrována.
  • Zabraňte provádění nepodporovaných operací na zašifrovaných polích.

Pro vložení dat provedeme běžný vkládací dotaz a výsledný dokument bude mít níže ukázková data týkající se pole bankovního účtu.

{

…

"bankAccountNumber":"Ac+ZbPM+sk7gl7CJCcIzlRAQUJ+uo/0WhqX+KbTNdhqCszHucqXNiwqEUjkGlh7gK8pm2JhIs/P3//nkVP0dWu8pSs6TJnpfUwRjPfnI0TURzQ==",

…

}

Když oprávněný personál provede dotaz, řidič tato data dešifruje a vrátí je v čitelném formátu, tj. 

{

…

"bankAccountNumber":43265436456456456756,

…

}

Poznámka:  Není možné dotazovat se na dokumenty v náhodně zašifrovaném poli, pokud nepoužijete jiné pole k nalezení dokumentu, který obsahuje přibližnou hodnotu dat náhodně zašifrovaného pole.

Závěr

Bezpečnost dat by měla být zvážena na všech úrovních s ohledem na klidovou i tranzitní. MongoDB Enterprise 4.2 Server nabízí vývojářům okno pro šifrování dat ze strany klienta pomocí Client-Side Field Level Encryption, čímž zajišťuje data od poskytovatelů hostitele databáze a nezabezpečený přístup k síti. CSFLE používá šifrování obálek, kde se k šifrování klíčů pro šifrování dat používá hlavní klíč. Hlavní klíč by proto měl být uchováván v bezpečí pomocí nástrojů pro správu klíčů, jako je Key Management System.


  1. Index v MongoDB

  2. Je rozdíl mezi dvěma seznamy?

  3. Sidekiq nezpracovává frontu

  4. Redis py:kdy použít fond připojení?