Potřebujete všechna data v databázi šifrovaná a to včetně jejich záloh? Na to je ideální použít Transparent Data Encryption (o tom v jiném článku). Je to jednoduché a v Azure SQL doslova na kliknutí. Někdy ale potřebujete šifrovat tak, že ani administrátor databáze data nepřečte. Možná to ani nemusí být na všechna data, ale jen vybrané sloupečky. V ten okamžik je dobré zašifrovat data aplikačně, tedy zcela mimo databázový systém. To má ale nevýhodu - musíte tuto funkci napsat ve své aplikaci, což znamená určitou náročnost. Druhá starost je pak s klíči - kde budete držet klíč k dešifrování dat? Azure má na obě starosti odpověď.
Připomeňme si, co chceme. Šifrovat v aplikaci, ale nemít s tím tolik práce. Řešením je implementovat tuto funkci v knihovně, tedy v kódu, který aplikace používá tak jako tak pro přístup k datům v databázi. Přesně tohle máte s AlwaysEncrypted k dispozici. Ve vaší aplikace se změní pouze ConnectionString, vše ostatní zůstane úplně stejné. Čtete a zapisujete jako bez šifrování a knihovna se bezpečně postará o vše potřebné.
Schématicky je to znázorněno zde.
Druhá potíž je ve správě šifrovacích klíčů. Můžete je samozřejmě uložit v trust store příslušného serveru, kde aplikace běží, ale to není zrovna praktické. Lepší je uložit si klíče do trezoru v Azure (na výběr máte softwarový trezor, ale i hardwarové řešení na speciálních čipech). Šifrovací klíč tak zůstává bezpečně v Azure a vy řídíte kdo si ho tam smí "vyzvednout". Azure Key Vault je perfektně provázán s AlwaysEncrypted, ale je univerzální a můžete trezor použít i pro jiné situace a aplikace, kde potřebujete držet nějaké tajnosti či certifikáty pěkně pod zámkem.
Vytvoříme si Azure Key Vault.
Vyplníme nějaké jméno a vybereme si uživatele, kteří mohou trezor na klíče využívat.
Pro začátek nebudeme zkoumat podrobnosti jednotlivých práv, vyberte uživatele a dejte mu všechna.
Teď půjdeme do SQL Server Management Studio a ověříme, že můžeme vypsat tyto sloupečky z jedné z tabulek, které jsou součástí sample databáze.
Příjmení, jak vidíme, získáváme v čitelné podobě. V našem byznysu je to ale extrémně citlivá informace a budeme chtít ji šifrovat přímo na koncovém bodu, tedy v aplikaci.
Spustíme průvodce zašifrováním sloupce.
V průvodci vybereme náš sloupeček a také zvolíme metodu šifrování. Deterministická způsobí jednoduché zašifrování tak, že ze stejného stupu vždy dostaneme stejný výstup. Díky tomu může políčko třeba i nadále fungovat pro operace typu JOIN, ale je to méně bezpečná varianta - v datech pak lze vypozorovat nějaké vzorce chování a je to nehodné zejména pro slupce, kde je malá variabilita dat (například zašifrovat takto sloupeček "pohlaví" je praticky zbytečné). Randomized je varianta, kdy se použije salt, tedy ke vstupním datům se přidá navíc něco náhodného a teprve to se zašifruje (při rozšifrování se to přidané zase odstraní). Výsledkem je, že i přes stejný vstupní údaj je výsledná šifra pokaždé jiná.
Velmi zajímavé je, že klíče můžeme bezpečně držet v Azure Key Vault a přímo z průvodce je tam můžeme generovat. Zvolte tuto volbu a přihlašte se do Azure.
Vybereme si Key Vault.
Na konci průvodce sledujme postup prací.
Po chvilce je hotovo - sloupeček je zašifrovaný. V SQL Server Management Studio si znovu vypíšeme data a uvidíme, že sloupeček je skutečně zašifrovaný.
A co na straně klienstké aplikace? Tohle přidejte do Connection stringu a máte hotovo.
Column Encryption Setting=Enabled
Potřebujete šifrovat data přímo na straně aplikace, ale přitom nechcete přepisovat váš kód a příslušné klíče držet v centrálním trezoru? Kombinace AlwaysEncrypted a Azure Key Vault je pro to myslím ideální.