Behörighet på radnivå i SQL Server

Oopps! Upgrade your browser pretty please. Oopps! Upgrade your browser pretty please.

Det finns ingen inbyggd funktionalitet i SQL Server för att sätta behörighet på radnivå utan enbart på tabellnivå. Det finns inte heller i den nyaste versionen SQL Server 2012 något stöd för radsäkerhet, alltså stöd för vilka poster som de olika användarna skall se. Dock finns det på förslagslistan till förbättringar, men tydligen prioriteras inte detta nog mycket. Däremot finns det vedertagna sätt för att lösa behovet av radsäkerhet som jag här i korthet beskriver.

För att adminstrera behörighet på radnivå så lägger man till några administrationstabeller och definerar nivåer av säkerhet som man önskar. Detta gör man enklast med ett verktyg ”Label Policy Designer” som är utvecklat av Microsofts team ”Consulting Services”. 

Nedan är en bild av hur nivåerna kan se ut.

 

 

När definitionen av säkerheten och dess nivåer är uppsatt i detta verktyg så väljer man därefter  databas och implementerar denna design i databasen. Det som då händer är att fem tabeller skapas och fylls med poster för att stödja designen man gjort av behörigheterna. Dessutom skapas vyer, funktioner och roller i den valda databasen.  Tanken är nämligen att istället för att ge behörighet till tabellerna så använder man vyer som styr vilka rader ur tabellerna de olika användarna ser. Detta innebär att alla tabeller som skall ha radbehörighet måste kompletteras med en kolumn, t.ex. RLS_ID som sedan fylls med  rätt behörighetsnivå . Det kan då se ut som nedan.

DECLARE @SECRET int exec usp_GetSecLabelID ‘<Label><Cl>SECRET</Cl></Label>’, @SECRET OUTPUT

INSERT INTO tblCustomer (Name, Phone, Email, RLS_ID) VALUES (‘Catherine R. Abel (AdvWorks)’, ‘(888) 555-4433’, ‘catherine0@adventure-works.com’, @SECRET)

 

Dessutom måste roller tilldelas till de olika användarna som t.ex. nedan.

exec sp_addrolemember ‘clSECRET’, ‘Bob’

Som sagt kommer vyer användas av användarna istället för direkt gå mot tabellerna. Nedan ser man ett typiskt exempel på hur en vy ser ut.

CREATE VIEW Customer WITH ENCRYPTION, VIEW_METADATA AS 

SELECT tblCustomer.ID, Name, Phone, Email            

FROM tblCustomer WITH (READCOMMITTED) INNER JOIN vwVisibleLabels  ON tblCustomer.RLS_ID = vwVisibleLabels.ID

GO

Allt detta innebär i slutändan att användarna beroende på sin behörighet får olika resultat på denna fråga:

SELECT [Name], [Phone],[Email] FROM [dbo].[Customer]

En användare kan då få detta resultat:  

Medan en annan användare som har ”mer” behörighet får detta resultat:  

Mer information hittar ni i denna artikel

http://technet.microsoft.com/en-us/library/cc966395.aspx

SQL Server Label Security Toolkit hittar ni här.

 http://sqlserverlst.codeplex.com/