Přístupy uživatelů k tabulkám a sloupcům v Azure SQL Database

Data uložená v Azure SQL databázi nemusí být určena každému - určitě se nám budou hodit účty, které nesmí zapisovat a mohou jen číst. A možná v některé z tabulek bude konkrétní sloupeček, který nechceme, aby viděl každý. Dnes si pohrajeme s účty v Azure SQL.

Klasický SQL user vs. contained SQL user

Klasické řešení uživatelského účtu je vytvořit přístupový login na úrovni serveru (tedy nějaké přihlašovací jméno a heslo). V jednotlivých databázích potom můžeme vytvořit uživatele, jehož přihlašovací údaje jsou právě tento login na serveru. Můžete tedy jeden login používat u mnoha databází a pokud potřebujete změnit heslo, stačí to udělat jednou.

Azure SQL nemá koncept skutečného serveru, který by vám patřil, takže má trochu jinak definované role a "serverové" loginy jsou vytvářeny na úrovni master databáze.

Nejprve vytvoříme LOGIN v master DB (pošlete v SQL Server Management Studio toto Query na master):

CREATE LOGIN serveruser WITH PASSWORD = 'Azure123456';

Pak spusťte Query ve vaší databázi, v mém případě v mojesql:

CREATE USER serveruser FROM LOGIN serveruser;
ALTER ROLE db_datareader ADD MEMBER serveruser;

Teď se můžete zkusit tímto účtem nalogovat. V databázi mojesql budete moci číst, ale ne zapisovat.

Nevýhodou tohoto přístupu je, že bez LOGIN v serveru tento USER nefunguje. Pokud tedy například budete DB replikovat, musíte si ručně zajistit, že na jiném serveru v destinaci tento LOGIN taky existuje. Možná je tedy lepší uživatele vytvořit specificky přímo pro databázi tak, že nemá žádné návaznosti na cokoli jiného. Contained uživatele vytvoříme snadno - stačí poslat tohle rovnou na kontextu databáze, v mém případě mojesql.

CREATE USER dbuser WITH PASSWORD = 'Azure123456';
ALTER ROLE db_datareader ADD MEMBER dbuser;

To je vše, můžete se nalogovat.

Znepřístupnění tabulky nebo konkrétního sloupečku

Nejen, že můžeme někomu zpřístupnit data pouze pro čtení, ale dá se i specifikovat které tabulky nebo dokonce které sloupečky může používat. Pokud nechceme něco takové řešit pro každého uživatele zvlášť (ale můžeme), použijeme role. Vytvořme si novou roli, ve které povolíme pouze čtení tabulky zákazníků a to pouze sloupečků křestního jména a příjmení.

CREATE ROLE kontraktor AUTHORIZATION db_datareader; 
GRANT SELECT ON SalesLT.Customer (FirstName, LastName) TO kontraktor;
CREATE USER franta WITH PASSWORD = 'Azure123456';
ALTER ROLE kontraktor ADD MEMBER franta;

Připojte se jako uživatel franta a zkuste tento SELECT:

Pokud se pokusíme číst nějaký sloupeček, na který nemáme právo, nepodaří se to.

 

Přístup k tabulkám a sloupečkům můžete v Azure SQL dobře. Kromě toho máte na výběr celou řadu dalších bezpečnostních funkcí jako je row-level security, AlwaysEncrypted nebo Data Masking. O těch v jiných článcích.



Cloud-native Palo Alto firewall jako služba pro Azure Virtual WAN Security
Federované workload identity v AKS - preview bezpečného řešení pro autentizaci služeb bez hesel Security
Azure Firewall Basic - levnější bráška pro malá prostředí nebo distribuované IT Security
Datové hřiště - jak si hrát s daty bez sebemenšího kliknutí s Terraform a Azure SQL
Nativní Azure Monitor a Microsoft Sentinel nově umí levnější logy a zabudovanou levnější archivaci - praxe (část 2) Security