Pokud potřebujete ve své databázi uložit důvěrná data, můžete použít šifrování dat . SQL Server podporuje šifrování pomocí symetrických klíčů, asymetrických klíčů, certifikátů a hesel. Předpokládám, že vy, čtenáři, tyto pojmy již znáte. V tomto článku se zaměřím na dvě z mnoha možností šifrování, které SQL Server poskytuje:
- Transparentní šifrování dat (TDE)
- Vždy šifrováno (AE)
Transparentní šifrování dat
Transparentní šifrování dat (TDE) chrání data v klidu, když se nepoužívají. Když jsou data použita, SQL Server je automaticky dešifruje. TDE můžete použít pro šifrování a dešifrování dat a souborů protokolu v reálném čase. Data zašifrujete pomocí šifrovacího klíče databáze (DEK) , což je symetrický klíč. Je uložen v zaváděcím záznamu databáze a je tedy dostupný již během procesu obnovy databáze. DEK chráníte certifikátem v hlavní databázi. Místo certifikátu můžete také použít asymetrický klíč; asymetrický klíč však musí být uložen v modulu EKM. TDE používá pouze šifrování AES a Triple DES. TDE bylo poprvé implementováno v SQL Serveru ve verzi 2012.
TDE můžete použít pouze na uživatelské databáze. Nelze exportovat šifrovací klíč databáze. Tento klíč používá pouze databázový stroj SQL Server. Koncoví uživatelé jej nikdy nepoužívají. I když změníte vlastníka databáze, není nutné znovu vytvářet DEK.
TDE šifruje data na úrovni stránky. Kromě toho šifruje také protokol transakcí. Certifikát používaný k ochraně DEK a soukromý klíč používaný k ochraně certifikátu byste měli zálohovat ihned po povolení TDE. Pokud potřebujete obnovit nebo připojit šifrovanou databázi k jiné instanci SQL Serveru, musíte obnovit jak certifikát, tak soukromý klíč, jinak nebudete moci databázi otevřít. Znovu si všimněte, že DEK neexportujete, protože je součástí samotné databáze. Musíte si ponechat a udržovat certifikát používaný k ochraně DEK i poté, co deaktivujete TDE v databázi. Důvodem je, že části protokolu transakcí mohou být stále zašifrovány. Certifikát je potřeba, dokud neprovedete úplnou zálohu databáze.
Vždy šifrováno
SQL Server 2016 Enterprise Edition zavádí novou úroveň šifrování, konkrétně Always Encrypted (AE) Vlastnosti. Tato funkce umožňuje stejnou úroveň ochrany dat jako šifrování dat v klientské aplikaci. Ve skutečnosti, ačkoli se jedná o funkci SQL Server, jsou data šifrována a dešifrována na straně klienta. Šifrovací klíče nejsou nikdy odhaleny databázovému stroji SQL Server. Tímto způsobem také správce databází nemůže vidět citlivá data bez šifrovacích klíčů pouze tím, že má oprávnění správce systému na instanci SQL Server se zašifrovanými daty. Tímto způsobem AE odděluje správce, kteří data spravují, a uživatele, kteří data vlastní.
Klávesy AE
Pro Always Encrypted potřebujete dva klíče. Nejprve vytvoříte hlavní klíč sloupce (CMK) . Poté vytvoříte šifrovací klíč sloupce (CEK) a chraňte jej pomocí CMK. Aplikace používá CEK k šifrování dat. SQL Server ukládá pouze šifrovaná data a nemůže je dešifrovat. To je možné, protože hlavní klíče sloupců nejsou ve skutečnosti uloženy v databázi SQL Server. V databázi SQL Server ukládá pouze odkaz na tyto klíče. Hlavní klíče sloupců jsou uloženy mimo SQL Server na jednom z následujících možných míst:
- Úložiště certifikátů systému Windows pro aktuálního uživatele
- Úložiště certifikátů systému Windows pro místní počítač
- Služba Azure Key Vault
- Hardwarový bezpečnostní modul (HSM) , který podporuje Microsoft CryptoAPI nebo Cryptography API:Next Generation
Klíče pro šifrování sloupců jsou uloženy v databázi. Uvnitř databáze SQL Server je uložena pouze zašifrovaná část hodnot šifrovacích klíčů sloupců spolu s informacemi o umístění hlavních klíčů sloupců. CEK se nikdy neukládají jako prostý text v databázi. CMK jsou, jak již bylo zmíněno, ve skutečnosti uloženy v externích důvěryhodných úložištích klíčů.
Použití kláves AE
Aplikace může používat klíče AE a šifrování pomocí ovladače s povoleným AE, jako je .NET Framework Data Provider pro SQL Server verze 4.6 nebo vyšší, Microsoft JDBC Driver pro SQL Server 6.0 nebo vyšší nebo Windows ODBC ovladač pro SQL Server verze 13.1 nebo vyšší. Aplikace musí odesílat parametrizované dotazy na SQL Server. Ovladač s povoleným AE spolupracuje s databázovým strojem SQL Server, aby určil, které parametry by měly být zašifrovány nebo dešifrovány. Pro každý parametr, který je třeba zašifrovat nebo dešifrovat, získá ovladač z databázového stroje metadata potřebná pro šifrování, včetně šifrovacího algoritmu, umístění odpovídajícího CMK a zašifrované hodnoty pro odpovídající CEK. Poté ovladač kontaktuje úložiště CMK, získá CMK, dešifruje CEK a použije CEK k zašifrování nebo dešifrování parametru. Poté ovladač uloží CEK do mezipaměti, aby urychlil další použití stejného CEK. Následující obrázek ukazuje proces graficky.
Obrázek znázorňuje celý proces v krocích:
- Klientská aplikace vytvoří parametrizovaný dotaz
- Klientská aplikace odešle parametrizovaný dotaz ovladači s povoleným AE
- Ovladač s aktivovaným AE kontaktuje SQL Server, aby zjistil, které parametry potřebují šifrování nebo dešifrování, umístění CMK a zašifrovanou hodnotu CEK
- Ovladač s povoleným AE načte CMK a dešifruje CEK
- Ovladač s povoleným AE šifruje parametr(y)
- Ovladač odešle dotaz do databázového stroje
- Databázový stroj načte data a odešle sadu výsledků ovladači
- Ovladač v případě potřeby provede dešifrování a odešle sadu výsledků do klientské aplikace
Typy šifrování AE
Databázový stroj nikdy nepracuje s daty ve formátu prostého textu uloženými v zašifrovaných sloupcích. Některé dotazy na šifrovaná data jsou však možné v závislosti na typu šifrování. Existují dva typy šifrování:
- Deterministické šifrování , který vždy generuje stejnou zašifrovanou hodnotu pro stejnou vstupní hodnotu. Pomocí tohoto šifrování můžete indexovat šifrovaný sloupec a používat v šifrovaném sloupci vyhledávání bodů, spojení rovnosti a seskupení. Uživatel se zlými úmysly by se však mohl pokusit uhodnout hodnoty analýzou vzorů zašifrovaných hodnot. To je zvláště nebezpečné, když je sada možných hodnot pro sloupec diskrétní s malým počtem odlišných hodnot.
- Náhodné šifrování , který šifruje data nepředvídatelným způsobem.
AE Demo:Vytváření objektů
Je čas ukázat, jak AE funguje, prostřednictvím demo kódu. Nejprve vytvoříme a použijeme demo databázi.
USE master; IF DB_ID(N'AEDemo') IS NULL CREATE DATABASE AEDemo; GO USE AEDemo; GO
Dále vytvořte CMK v SSMS GUI. V Průzkumníku objektů obnovte složku Databáze, abyste viděli databázi AEDemo. Rozbalte tuto složku databáze, rozbalte podsložku Security, potom podsložku Always Encrypted Keys a klepněte pravým tlačítkem myši na podsložku Column Master Key az rozbalovací nabídky vyberte možnost New Column Master Key. Do textového pole Name napište AE_ColumnMasterKey a ujistěte se, že jste v rozevíracím seznamu Key Store vybrali možnost Windows Certificate Store – Local Machine, jak ukazuje následující obrázek.
Zda byl CMK úspěšně vytvořen, můžete zkontrolovat pomocí následujícího dotazu.
SELECT * FROM sys.column_master_keys;
Dále vytvoříte CEK. V SSMS v Object Exploreru klikněte pravým tlačítkem na podsložku Column Encryption Keys přímo pod podsložkou Column Master Key a z rozbalovací nabídky vyberte možnost New Column Encryption Key. Pojmenujte CEK AE_ColumnEncryptionKey a použijte AE_ColumnMasterKey CMK k jeho zašifrování. Zda bylo vytvoření CEK úspěšné, můžete zkontrolovat pomocí následujícího dotazu.
SELECT * FROM sys.column_encryption_keys;
V současné době jsou k dispozici pouze nové binární porovnávání, porovnávání s BIN2 přípona, jsou podporovány pro AE. Vytvořme proto tabulku s příslušnými řazeními pro sloupce znaků.
CREATE TABLE dbo.Table1 (id INT, SecretDeterministic NVARCHAR(10) COLLATE Latin1_General_BIN2 ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = AE_ColumnEncryptionKey, ENCRYPTION_TYPE = DETERMINISTIC, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NULL, SecretRandomized NVARCHAR(10) COLLATE Latin1_General_BIN2 ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = AE_ColumnEncryptionKey, ENCRYPTION_TYPE = RANDOMIZED, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NULL );
AE Demo:Vkládání dat
Nyní můžete zkusit vložit řádek dat pomocí následujícího příkazu.
INSERT INTO dbo.Table1 (id, SecretDeterministic, SecretRandomized) VALUES (1, N'DeterSec01', N'RandomSec1');
Zobrazí se chyba 206, text chyby:„Clash typu operandu:nvarchar je nekompatibilní s nvarchar(4000) zašifrovaným s (encryption_type ='DETERMINISTIC', encryption_algorithm_name ='AEAD_AES_256_CBC_HMAC_SHA_2Cyptem_key název sloupce', název_cryption_AEKcryptenkey_sloupce_sloupce_AEKcrypten_key_sloupce . SQL Server nemůže šifrovat nebo dešifrovat data. Musíte upravit data z klientské aplikace. Ze serveru SQL můžete provádět omezenou sadu operací na tabulce. Můžete například použít příkaz TRUNCATE TABLE pro tabulku se sloupci AE.
Vytvořil jsem velmi jednoduchou klientskou aplikaci Windows Console ve Visual C#. Aplikace ve skutečnosti pouze načte klíče a vloží jeden řádek do tabulky vytvořené pomocí výše uvedeného kódu. Zde je kód C#.
using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; namespace AEDemo { class Program { static void Main(string[] args) { string connectionString = "Data Source=localhost; “ + “Initial Catalog=AEDemo; Integrated Security=true; ” + “Column Encryption Setting=enabled"; SqlConnection connection = new SqlConnection(connectionString); connection.Open(); if (args.Length != 3) { Console.WriteLine("Please enter a numeric “ + “and two string arguments."); return; } int id = Int32.Parse(args[0]); { using (SqlCommand cmd = connection.CreateCommand()) { cmd.CommandText = @"INSERT INTO dbo.Table1 “ + “(id, SecretDeterministic, SecretRandomized)" + " VALUES (@id, @SecretDeterministic, @SecretRandomized);"; SqlParameter paramid= cmd.CreateParameter(); paramid.ParameterName = @"@id"; paramid.DbType = DbType.Int32; paramid.Direction = ParameterDirection.Input; paramid.Value = id; cmd.Parameters.Add(paramid); SqlParameter paramSecretDeterministic = cmd.CreateParameter(); paramSecretDeterministic.ParameterName = @"@SecretDeterministic"; paramSecretDeterministic.DbType = DbType.String; paramSecretDeterministic.Direction = ParameterDirection.Input; paramSecretDeterministic.Value = "DeterSec1"; paramSecretDeterministic.Size = 10; cmd.Parameters.Add(paramSecretDeterministic); SqlParameter paramSecretRandomized = cmd.CreateParameter(); paramSecretRandomized.ParameterName = @"@SecretRandomized"; paramSecretRandomized.DbType = DbType.String; paramSecretRandomized.Direction = ParameterDirection.Input; paramSecretRandomized.Value = "RandomSec1"; paramSecretRandomized.Size = 10; cmd.Parameters.Add(paramSecretRandomized); cmd.ExecuteNonQuery(); } } connection.Close(); Console.WriteLine("Row inserted successfully"); } } }
Můžete spustit kód C# ze sady Visual Studio v režimu ladění nebo sestavit aplikaci. Poté můžete spustit aplikaci AEDemo.exe z příkazového řádku nebo z SSMS v režimu SQMCMD.
AE Demo:Čtení dat
Po spuštění aplikace byste měli zkusit načíst data ze stejné relace v SSMS, kterou jste použili k vytvoření tabulky.
SELECT * FROM dbo.Table1;
Můžete vidět pouze zašifrovaná data. Nyní otevřete druhé okno dotazu v SSMS. Klepněte pravým tlačítkem myši v tomto okně a vyberte Připojení a poté Změnit připojení. V dialogovém okně Připojení klikněte dole na tlačítko Možnosti. Jako název databáze zadejte AEDemo a klepněte na kartu Další parametry připojení. Do textového pole zadejte „Nastavení šifrování sloupců=povoleno“ (bez uvozovek). Poté klikněte na Připojit.
Zkuste znovu vložit řádek z SSMS. Použijte následující dotaz.
INSERT INTO dbo.Table1 (id, SecretDeterministic, SecretRandomized) VALUES (2, N'DeterSec2', N'RandomSec2');
Opět se mi objevila chyba. Tato verze SSMS, kterou používám, stále nedokáže parametrizovat vložky ad-hoc. Zkusme však data přečíst pomocí následujícího dotazu.
SELECT * FROM dbo.Table1;
Tentokrát dotaz funguje a získáte následující výsledek:
Id SecretDeterministic SecretRandomized
— ——————– ——————-
1 DeterSec1 RandomSec1
2 DeterSec2 RandomSec2
Omezení AE
Již jste viděli některá omezení Always Encrypted, včetně:
- Pro řetězce jsou podporovány pouze řazení BIN2
- Můžete indexovat pouze sloupce s deterministickým šifrováním a na těchto sloupcích použít omezenou sadu operací T-SQL
- Nelze indexovat sloupce pomocí náhodného šifrování
- AE je omezena pouze na edice Enterprise a Developer
- Práce s AE v SSMS může být bolestivá
Podrobnější seznam omezení AE najdete v Books Online. Všimněte si však také silných stránek AE. Jeho implementace je jednoduchá, protože nepotřebuje žádné úpravy v aplikaci, kromě úpravy připojovacích řetězců. Data jsou šifrována end-to-end, od klientské paměti přes síť až po databázové úložiště. Dokonce ani správci databází nemohou prohlížet data pouze v rámci SQL Serveru; dokonce i správci databází potřebují přístup k úložišti klíčů mimo SQL Server, aby mohli číst CMK. AE a další možnosti šifrování v SQL Serveru poskytují kompletní sadu možností a je na vás a na obchodním problému, který řešíte, abyste zvolili vhodnou metodu.
Závěr
Transparentní šifrování dat se velmi snadno používá. Ochrana dat je však velmi omezená. TDE chrání data pouze v klidu. Always Encrypted je však opravdu mocná funkce. Implementace stále není příliš složitá a data jsou zcela chráněna. Bez přístupu k šifrovacím klíčům to neuvidí ani správce databází. Doufejme, že omezení pro AE, zejména omezení řazení, budou v budoucích verzích SQL Serveru odstraněna.