Sdílet prostřednictvím


Používání šifrování na straně klienta s funkcí Always Encrypted pro službu Azure Cosmos DB

PLATÍ PRO: NoSQL

Důležité

Ve verzi 1.0 našich šifrovacích balíčků jsme zavedli zásadní změnu. Pokud jste vytvořili šifrovací klíče dat a kontejnery s podporou šifrování s předchozími verzemi, budete muset po migraci klientského kódu na balíčky 1.0 znovu vytvořit databáze a kontejnery.

Funkce Always Encrypted je funkce navržená k ochraně citlivých dat, jako jsou čísla platebních karet nebo národní/regionální identifikační čísla (například čísla sociálního pojištění USA), uložená ve službě Azure Cosmos DB. Funkce Always Encrypted umožňuje klientům šifrovat citlivá data v klientských aplikacích a nikdy v databázi neodhalovat šifrovací klíče.

Funkce Always Encrypted přináší možnosti šifrování na straně klienta do služby Azure Cosmos DB. Šifrování dat na straně klienta může být vyžadováno v následujících scénářích:

  • Ochrana citlivých dat, která mají specifické charakteristiky důvěrnosti: Funkce Always Encrypted umožňuje klientům šifrovat citlivá data v jejich aplikacích a nikdy nezoznat data ve formátu prostého textu nebo šifrovací klíče pro službu Azure Cosmos DB.
  • Implementace řízení přístupu podle vlastností: Protože šifrování je řízeno klíči, které vlastníte a spravujete ze služby Azure Key Vault, můžete použít zásady přístupu k řízení, ke kterým citlivým vlastnostem má každý klient přístup.

Koncepty

Funkce Always Encrypted pro službu Azure Cosmos DB zavádí některé nové koncepty, které se týkají konfigurace šifrování na straně klienta.

Šifrovací klíče

Šifrovací klíče dat

Při použití funkce Always Encrypted se data šifrují pomocí šifrovacích klíčů dat (DEK), které by se měly vytvořit předem. Tyto sady DEK se ukládají ve službě Azure Cosmos DB a definují se na úrovni databáze, takže klíč DEK je možné sdílet napříč několika kontejnery. Vytvoření sad DEK se provádí na straně klienta pomocí sady SDK služby Azure Cosmos DB.

Můžete provádět následující akce:

  • Vytvoření jedné DEK na vlastnost pro šifrování nebo
  • K šifrování více vlastností použijte stejný klíč DEK.

Klíče spravované zákazníkem

Než se dek uloží ve službě Azure Cosmos DB, zabalí je klíč spravovaný zákazníkem (CMK). Díky řízení obtékání a rozbalení sad DEK efektivně řídí přístup k datům, která jsou zašifrovaná odpovídajícími sadami DEK. Úložiště CMK je navržené jako rozšiřitelné s výchozí implementací, která očekává, že se budou ukládat ve službě Azure Key Vault.

Šifrovací klíče

Zásady šifrování

Podobně jako u zásad indexování představuje zásada šifrování specifikaci na úrovni kontejneru popisující způsob šifrování vlastností JSON. Tato zásada musí být poskytována při vytváření kontejneru a je neměnná. V aktuální verzi nemůžete aktualizovat zásady šifrování.

Pro každou vlastnost, kterou chcete šifrovat, zásady šifrování definují:

  • Cesta vlastnosti ve formě /property. V současné době se podporují pouze cesty nejvyšší úrovně, například vnořené cesty, například /path/to/property nejsou podporovány.
  • ID DEK , které se má použít při šifrování a dešifrování vlastnosti.
  • Typ šifrování. Může to být náhodná nebo deterministická.
  • Šifrovací algoritmus, který se má použít při šifrování vlastnosti. Zadaný algoritmus může přepsat algoritmus definovaný při vytváření klíče, pokud jsou kompatibilní.

Randomizované vs. deterministické šifrování

Služba Azure Cosmos DB nikdy neuvidí prostý text vlastností zašifrovaných pomocí funkce Always Encrypted. V závislosti na typu šifrování použitém pro vlastnost ale stále podporuje některé možnosti dotazování na šifrovaná data. Funkce Always Encrypted podporuje následující dva typy šifrování:

  • Deterministické šifrování: Vždy generuje stejnou šifrovanou hodnotu pro libovolnou danou hodnotu prostého textu a konfiguraci šifrování. Použití deterministického šifrování umožňuje dotazům provádět filtry rovnosti u šifrovaných vlastností. Útočníkům ale může umožnit uhodnout informace o šifrovaných hodnotách prozkoumáním vzorů v šifrované vlastnosti. To platí zejména v případě, že existuje malá sada možných šifrovaných hodnot, jako je Pravda/Nepravda nebo Severní/Jih/Východ/Západní oblast.

  • Náhodné šifrování: Používá metodu, která šifruje data méně předvídatelným způsobem. Randomizované šifrování je bezpečnější, ale brání dotazům v filtrování podle šifrovaných vlastností.

Další informace o deterministickém a randomizovaném šifrování ve funkci Always Encrypted najdete v tématu Generování inicializačního vektoru (IV ).

Nastavení služby Azure Key Vault

Prvním krokem, jak začít používat Funkci Always Encrypted, je vytvoření sad CMK ve službě Azure Key Vault:

  1. Vytvořte novou instanci služby Azure Key Vault nebo přejděte k existující instanci.
  2. V části Klíče vytvořte nový klíč.
  3. Po vytvoření klíče přejděte do aktuální verze a zkopírujte jeho úplný identifikátor klíče:
    https://<my-key-vault>.vault.azure.net/keys/<key>/<version>. Pokud vynecháte verzi klíče na konci identifikátoru klíče, použije se nejnovější verze klíče.

Dále je potřeba nakonfigurovat, jak bude sada SDK služby Azure Cosmos DB přistupovat k vaší instanci služby Azure Key Vault. Toto ověřování se provádí prostřednictvím identity Microsoft Entra. S největší pravděpodobností použijete identitu aplikace Microsoft Entra nebo spravované identity jako proxy server mezi vaším klientským kódem a instancí služby Azure Key Vault, i když se dá použít jakýkoli druh identity. K použití identity Microsoft Entra jako proxy použijte následující postup:

  1. V instanci služby Azure Key Vault přejděte do části Zásady přístupu a přidejte nové zásady:

    1. V části Oprávnění ke klíči vyberte Získat, List, Rozbalit klíč, Zalamovat klíč, Ověřit a Podepsat.
    2. V části Vybrat objekt zabezpečení vyhledejte svou identitu Microsoft Entra.

Ochrana klíče CMK před náhodným odstraněním

Pokud chcete mít jistotu, že po náhodném odstranění klíče CMK nepřijdete o přístup k zašifrovaným datům, doporučujeme nastavit dvě vlastnosti instance služby Azure Key Vault: obnovitelné odstranění a vyprázdnění.

Pokud vytvoříte novou instanci služby Azure Key Vault, během vytváření povolte tyto vlastnosti:

Snímek obrazovky s vlastnostmi obnovitelného odstranění a ochrany před vymazáním nové instance služby Azure Key Vault

Pokud používáte existující instanci služby Azure Key Vault, můžete ověřit, že jsou tyto vlastnosti povolené, a to v části Vlastnosti na webu Azure Portal. Pokud některé z těchto vlastností není povolené, přečtěte si část "Povolení obnovitelného odstranění" a "Povolení ochrany před vymazáním" v jednom z následujících článků:

Inicializace sady SDK

Poznámka:

Funkce Always Encrypted pro službu Azure Cosmos DB se v současné době podporuje:

  • V .NET s balíčkem Microsoft.Azure.Cosmos.Encryption.
  • V Javě s balíčkem azure.cosmos.encryption.

Pokud chcete použít funkci Always Encrypted, musí být instance sady KeyResolver AZURE Cosmos DB SDK připojená. Tato třída definovaná v Azure.Security.KeyVault.Keys.Cryptography oboru názvů slouží k interakci s úložištěm klíčů hostujícím vaše sady CMK.

Následující fragmenty kódu používají DefaultAzureCredential třídu k načtení identity Microsoft Entra, která se má použít při přístupu k instanci služby Azure Key Vault. Tady najdete příklady vytváření různých druhů TokenCredential tříd.

Poznámka:

Pro přístup ke třídám TokenCredential budete potřebovat další balíček Azure.Identity.

var tokenCredential = new DefaultAzureCredential();
var keyResolver = new KeyResolver(tokenCredential);
var client = new CosmosClient("<connection-string>")
    .WithEncryption(keyResolver, KeyEncryptionKeyResolverName.AzureKeyVault);

Vytvoření šifrovacího klíče dat

Před šifrováním dat v kontejneru je nutné v nadřazené databázi vytvořit šifrovací klíč dat.

Vytvoření nového šifrovacího klíče dat se provádí voláním CreateClientEncryptionKeyAsync metody a předáním:

  • Identifikátor řetězce, který jednoznačně identifikuje klíč v databázi.
  • Šifrovací algoritmus určený k použití s klíčem. V současné době se podporuje pouze jeden algoritmus.
  • Identifikátor klíče CMK uložený ve službě Azure Key Vault. Tento parametr se předává v obecném EncryptionKeyWrapMetadata objektu, kde:
    • Definuje type typ překladače klíčů (například Azure Key Vault).
    • Může name to být libovolný popisný název.
    • Musí value to být identifikátor klíče.

    Důležité

    Po vytvoření klíče přejděte na aktuální verzi a zkopírujte jeho úplný identifikátor klíče: https://<my-key-vault>.vault.azure.net/keys/<key>/<version>. Pokud vynecháte verzi klíče na konci identifikátoru klíče, použije se nejnovější verze klíče.

    • Definuje algorithm , který algoritmus se použije k zabalení šifrovacího klíče klíče do klíče spravovaného zákazníkem.
var database = client.GetDatabase("my-database");
await database.CreateClientEncryptionKeyAsync(
    "my-key",
    DataEncryptionAlgorithm.AeadAes256CbcHmacSha256,
    new EncryptionKeyWrapMetadata(
        KeyEncryptionKeyResolverName.AzureKeyVault,
        "akvKey",
        "https://<my-key-vault>.vault.azure.net/keys/<key>/<version>",
        EncryptionAlgorithm.RsaOaep.ToString()));

Vytvoření kontejneru se zásadami šifrování

Při vytváření kontejneru zadejte zásady šifrování na úrovni kontejneru.

var path1 = new ClientEncryptionIncludedPath
{
    Path = "/property1",
    ClientEncryptionKeyId = "my-key",
    EncryptionType = EncryptionType.Deterministic.ToString(),
    EncryptionAlgorithm = DataEncryptionAlgorithm.AeadAes256CbcHmacSha256
};
var path2 = new ClientEncryptionIncludedPath
{
    Path = "/property2",
    ClientEncryptionKeyId = "my-key",
    EncryptionType = EncryptionType.Randomized.ToString(),
    EncryptionAlgorithm = DataEncryptionAlgorithm.AeadAes256CbcHmacSha256
};
await database.DefineContainer("my-container", "/partition-key")
    .WithClientEncryptionPolicy()
    .WithIncludedPath(path1)
    .WithIncludedPath(path2)
    .Attach()
    .CreateAsync();

Čtení a zápis šifrovaných dat

Jak se data šifrují

Při každém zápisu dokumentu do služby Azure Cosmos DB sada SDK vyhledá zásady šifrování a zjistí, které vlastnosti je potřeba zašifrovat a jak. Výsledkem šifrování je základní řetězec 64.

Šifrování komplexních typů:

  • Při šifrování vlastnosti je pole JSON, každá položka pole je zašifrována.

  • Pokud je vlastnost, která se má šifrovat, objekt JSON, zašifrují se pouze hodnoty typu list objektu. Zprostředkující názvy dílčích vlastností zůstanou ve formátu prostého textu.

Čtení zašifrovaných položek

K dešifrování šifrovaných vlastností při vydávání čtení typu point-read (načtení jedné položky podle ID a klíče oddílu), dotazů nebo čtení kanálu změn není nutná žádná explicitní akce. Je to proto, že:

  • Sada SDK vyhledá zásady šifrování a zjistí, které vlastnosti je potřeba dešifrovat.
  • Výsledkem šifrování je vložení původního typu JSON hodnoty.

Všimněte si, že rozlišení šifrovaných vlastností a jejich následné dešifrování vychází pouze z výsledků vrácených z vašich požadavků. Pokud je například zašifrovaný, property1 ale projektovaný do property2 (SELECT property1 AS property2 FROM c), nebude při přijetí sadou SDK identifikován jako zašifrovaná vlastnost.

Filtrování dotazů na šifrované vlastnosti

Při psaní dotazů, které filtrují šifrované vlastnosti, musí být použita konkrétní metoda k předání hodnoty parametru dotazu. Tato metoda přebírá následující argumenty:

  • Název parametru dotazu.
  • Hodnota, kterou chcete použít v dotazu.
  • Cesta šifrované vlastnosti (jak je definováno v zásadách šifrování).

Důležité

Šifrované vlastnosti lze použít pouze ve filtrech rovnosti (WHERE c.property = @Value). Jakékoli jiné využití vrátí nepředvídatelné a nesprávné výsledky dotazu. Toto omezení bude vynucováno lépe v dalších verzích sady SDK.

var queryDefinition = container.CreateQueryDefinition(
    "SELECT * FROM c where c.property1 = @Property1");
await queryDefinition.AddParameterAsync(
    "@Property1",
    1234,
    "/property1");

Čtení dokumentů, pokud lze dešifrovat pouze podmnožinu vlastností

V situacích, kdy klient nemá přístup ke všem cmk používaným k šifrování vlastností, lze při zpětném čtení dat dešifrovat pouze podmnožinu vlastností. Pokud byl například property1 zašifrován pomocí klíče1 a property2 byl zašifrován klíčem 2, klientská aplikace, která má přístup pouze ke klíči1, může stále číst data, ale ne property2. V takovém případě je nutné číst data prostřednictvím dotazů SQL a projektovat vlastnosti, které klient nemůže dešifrovat: SELECT c.property1, c.property3 FROM c.

Rotace CMK

Pokud máte podezření, že došlo k ohrožení zabezpečení aktuálního klíče CMK, můžete klíč CMK "otočit" (tj. použít nový klíč CMK místo aktuálního klíče CMK). Je také běžným postupem zabezpečení pravidelně obměňovat CMK. Pokud chcete toto otočení provést, musíte zadat pouze identifikátor klíče nového klíče CMK, který by se měl použít k zabalení konkrétního klíče DEK. Upozorňujeme, že tato operace nemá vliv na šifrování vašich dat, ale na ochranu DEK. Přístup k předchozímu klíči CMK by neměl být odvolán, dokud se obměna nedokončí.

await database.RewrapClientEncryptionKeyAsync(
    "my-key",
    new EncryptionKeyWrapMetadata(
        KeyEncryptionKeyResolverName.AzureKeyVault,
        "akvKey",
        "https://<my-key-vault>.vault.azure.net/keys/<new-key>/<version>",
        EncryptionAlgorithm.RsaOaep.ToString()));

Otočení DEK

Provedení obměně šifrovacího klíče dat se nenabízí jako funkce na klíč. Důvodem je to, že aktualizace DEK vyžaduje kontrolu všech kontejnerů, ve kterých se tento klíč používá, a opětovné šifrování všech vlastností zašifrovaných tímto klíčem. K této operaci může dojít pouze na straně klienta, protože služba Azure Cosmos DB neukládá nebo vůbec přistupuje k hodnotě prostého textu DEK.

V praxi je možné rotaci DEK provést provedením migrace dat z ovlivněných kontejnerů na nové. Nové kontejnery je možné vytvořit úplně stejně jako původní kontejnery. Pro pomoc s takovou migrací dat najdete samostatný nástroj pro migraci dat na GitHubu.

Přidání dalších šifrovaných vlastností

Přidání dalších šifrovaných vlastností do existujících zásad šifrování se nepodporuje ze stejných důvodů, které jsou vysvětlené v předchozí části. Tato operace vyžaduje úplnou kontrolu kontejneru, aby se zajistilo, že všechny instance vlastností jsou správně zašifrované a jedná se o operaci, která může nastat pouze na straně klienta. Stejně jako obměna DEK je možné přidat další šifrované vlastnosti provedením migrace dat do nového kontejneru s příslušnými zásadami šifrování.

Pokud máte flexibilitu v tom, jak se dají nové šifrované vlastnosti přidat z hlediska schématu, můžete využít také nezávislou na schématu služby Azure Cosmos DB. Pokud použijete vlastnost definovanou v zásadách šifrování jako "taška vlastností", můžete přidat další vlastnosti níže bez omezení. Představme si například, že property1 je definována v zásadách šifrování a vy na začátku píšete property1.property2 do dokumentů. Pokud budete později potřebovat přidat property3 jako zašifrovanou vlastnost, můžete začít psát property1.property3 do dokumentů a nová vlastnost se automaticky zašifruje. Tento přístup nevyžaduje migraci dat.

Další kroky