Novinky v oblasti bezpečnosti nového SQL Serveru 2016

Úvod

Ke konci květná Microsoft uvolnil ke stažení testovací build nového SQL Serveru 2016 (ke stažení je CTP2), který obsahuje mnoho zajímavých nových funkcí. Nové možnosti začínají hned u instalace, kdy např. setup automaticky generuje adekvátní množství souborů pro databázi tempdb – sice je stále potřeba nastavit detailně další parametry, ale i to je posun dopředu. Novinky serveru v oblasti databázového engine zahrnují jak rozšíření stávajích funkcionalit, které byly představeny s SQL 2012/2014, tak i zcela nové nastavení.

V tomto článku se společně podíváme na nové možnosti týkající se bezpečnosti SQL Serveru.

Dynamic data masking

První z nastavení, které si ukážeme a popíšeme je Dynamic Data Masking. Představme si SQL Server a tabulku, která obsahuje citlivé údaje – email, telefonní číslo, číslo kreditní karty atd. V případě, že nechceme tato data individuálně šifrovat, můžeme tato data alespoň skrývat. Následně bude obsah těchto sloupců maskován a zobrazován pouze částečně, tak aby nebylo možné odhadnout celý obsah. Kdo tato data uvidí je dáno nastavením a novými oprávněními v SQL serveru. Sysadmin samozřejmě, jak můžete odhadnout, uvidí vše v nemaskované podobě. Každý běžný uživatel však uvidí data maskována, dokud mu nebude přiděleno oprávnění UNMASK. To stejné platí i pro uživatele dbo, který jako vlastník databáze může číst veškerá data.

Samotné nastavení je poměrně jednoduché. Maskovací funkce jsou dostupné tři

· Pro email

· Výchozí

· Částečná

Maskování emailu zobrazí všechny emailové adresy ve formátu RXXX@XXXX.com– zobrazuje se tedy první písmeno emailu a doména, což zatím není nikterak nastavitelné. Výchozí funkce maskuje data pomocí znaků ‘X’ nebo pomocí číslice 0 v závislosti na datovém typu.

Nejbohatší masking dovoluje částečná funkce, která umí vkládat určité vzory, např pro kreditní kartu zobrazenou jako 01XX-XXXX-XXXX-1234, kdy je nutné zadat kolik znaků má být před maskovacím vzorem a kolik za ním.

V ukázkovém kódu na databázi AdventureWorks2014 je přidán masking na sloupec obsahující číslo kreditní karty, a následný výsledek dotazu je zobrazen pomocí maskování.

clip_image002

Figure 1 – Nastavení

clip_image003

Figure 2 - Výsledek dotazu s maskováním dat

Masking bohužel nefunguje se všemi datovými typy, mezi nepodporované patří: char, text, varchar(max), xml, image a mnoho dalších. Celá funkcionalita je dostupná i v SQL Azure, ale konfigurace probíhá pomocí portálu. V SQL Serveru je vše zatím třeba konfigurovat pomocí T-SQL, v Management Studiu konfigurace dynamic data masking zatím není.

Row-LEVEL SEcurity

Row-level security dovoluje nastavit systém tak, aby zobrazoval různé řádky tabulky různým uživatelům. Když pomineme row-level security, tak každý uživatel s oprávněním select mohl číst všechny řádky tabulky. Bylo pouze možné definovat, které sloupce lze číst a které ne. Pro zkomplikování situace bylo ještě možné zapnout common criteria compliance, kdy deny oprávnění tabulky mělo prioritu nad allow oprávněním jednotlivých sloupců (bez common criteria je to naopak). To ale nic neměnilo na situaci, že uživatel mohl číst všechny řádky.

S pomocí row-level security je možné nastavit, aby uživateli byly zobrazeny pouze takové řádky, které mu z pohledu bezpečnosti zobrazeny být mají. Pro konfiguraci je nutné nastavit dva objekty – predikát a politiku. Predikát je implementován pomocí T-SQL funkce, která je následně použita v bezpečnostní politice. Tato politika vyhodnocuje jednotlivé řádky pro dotazy SELECT, UPDATE a DELETE, tak aby uživatel mohl pracovat pouze se svými daty. Konfiguraci si opět ukážeme na databázi AdventureWorks2014. Nejprve je nutné vytvořit funkci, která bude limitovat data, vrácená uživateli.

clip_image005

Do databáze jsme přidali tabulku SalesUser, která obsahuje seznam uživatelů a jejich přiřazené TerritoryID. Jména uživatelů odpovídají databázovým uživatelům, které porovnáme pomoci funkce USER_NAME().

clip_image006

Následně vytvoříme politiku, která bude tuto funkci aplikovat na tabulku Sales.Customer a vyhodnocovat hodnotu na sloupci TerritoryID. Bude-li TerritoryID, ve kterém se nachází náš zákazník, shodné s TerritoryID našeho obchodního zástupce, poté mu budou zobrazena data tohoto zákazníka. Samozřejmě je možné funkci doplnit, tak aby vracela hodnotu 1 v případě, že je přihlášen např. obchodní ředitel, který má možnost vidět všechny záznamy.

Nastavení jednotlivých tabulek je možné kontrolovat i pomocí management studia, kde je zobrazen nastavený predikát a jeho funkce.

clip_image008

Celá tato logika je zpravidla implementována na aplikační úrovní, protože v databázové vrstvě pro to chyběla podpora, které je nyní s verzí SQL Server 2016 doplněna.

Závěr

SQL Server CTP2, který byl nedávno uvolněn, obsahuje dvě velmi zajímavé funkce pro zvýšení bezpečnosti při práci s daty na SQL Serveru. Nejen, že byly přidány funkce row-level security a dynamic data masking, ale zároveň s nimi jsou dostupné i nové oprávnění pro tato nastavení. Pomocí těchto oprávnění je možné vytvářet politiky pro row-level security a také měnit sloupce a přidávat dynamic masking.

Marek Chmel