Microsoft SQL Server
Beveiliging op rijniveau
Zoeken…
RLS-filterpredikaat
Met Sql Server 2016+ en Azure Sql-database kunt u automatisch rijen filteren die in select statement worden geretourneerd met behulp van een predikaat. Deze functie wordt beveiliging op rijniveau genoemd .
Ten eerste hebt u een functie met tabelwaarde nodig die een bepaald predicaat bevat dat beschrijft wat de voorwaarde is waarmee gebruikers gegevens uit een tabel kunnen lezen:
DROP FUNCTION IF EXISTS dbo.pUserCanAccessCompany
GO
CREATE FUNCTION
dbo.pUserCanAccessCompany(@CompanyID int)
RETURNS TABLE
WITH SCHEMABINDING
AS RETURN (
SELECT 1 as canAccess WHERE
CAST(SESSION_CONTEXT(N'CompanyID') as int) = @CompanyID
)
In dit voorbeeld zegt het predicaat dat alleen gebruikers die een waarde in SESSION_CONTEXT hebben die overeenkomt met het invoerargument, toegang hebben tot het bedrijf. U kunt elke andere voorwaarde instellen, bijvoorbeeld die de databaserol of database_id van de huidige gebruiker controleert, enz.
De meeste van de bovenstaande code is een sjabloon die u wilt kopiëren en plakken. Het enige dat hier zal veranderen, zijn de naam en argumenten van predikaat en voorwaarde in de clausule WHERE. Nu maakt u een beveiligingsbeleid dat dit predicaat op sommige tabellen toepast.
Nu kunt u een beveiligingsbeleid maken dat een predikaat op sommige tabellen toepast:
CREATE SECURITY POLICY dbo.CompanyAccessPolicy
ADD FILTER PREDICATE dbo.pUserCanAccessCompany(CompanyID) ON dbo.Company
WITH (State=ON)
Dit beveiligingsbeleid kent predicaat toe aan bedrijfstabel. Wanneer iemand probeert gegevens uit de bedrijfstabel te lezen, past het beveiligingsbeleid predicaat toe op elke rij, geeft de kolom CompanyID door als parameter van het predicaat en wordt het predikaat geëvalueerd als deze rij wordt geretourneerd in het resultaat van de SELECT-query.
RLS beveiligingsbeleid wijzigen
Beveiligingsbeleid is een groep predicaten gekoppeld aan tabellen die samen kunnen worden beheerd. U kunt predikaten toevoegen of verwijderen of het gehele beleid in- of uitschakelen.
U kunt meer predicaten toevoegen aan tabellen in het bestaande beveiligingsbeleid.
ALTER SECURITY POLICY dbo.CompanyAccessPolicy
ADD FILTER PREDICATE dbo.pUserCanAccessCompany(CompanyID) ON dbo.Company
U kunt enkele predicaten uit het beveiligingsbeleid verwijderen:
ALTER SECURITY POLICY dbo.CompanyAccessPolicy
DROP FILTER PREDICATE ON dbo.Company
U kunt het beveiligingsbeleid uitschakelen
ALTER SECURITY POLICY dbo.CompanyAccessPolicy WITH ( STATE = OFF );
U kunt beveiligingsbeleid inschakelen dat is uitgeschakeld:
ALTER SECURITY POLICY dbo.CompanyAccessPolicy WITH ( STATE = ON );
Voorkomen bijgewerkt met behulp van RLS-blokpredikaat
Met beveiliging op rijniveau kunt u enkele predicaten definiëren die bepalen wie rijen in de tabel kan bijwerken. Eerst moet u een tabelwaardefunctie definiëren die het predicaat voorstelt dat het toegangsbeleid beheert.
CREËER FUNCTIE
dbo.pUserCanAccessProduct (@CompanyID int)
RETURNS TABLE
WITH SCHEMABINDING
ALS RETOUR (SELECT 1 als canAccess WAAR
CAST (SESSION_CONTEXT (N'CompanyID ') als int) = @CompanyID
) In dit voorbeeld zegt het predicaat dat alleen gebruikers die een waarde in SESSION_CONTEXT hebben die overeenkomt met het invoerargument, toegang hebben tot het bedrijf. U kunt elke andere voorwaarde instellen, bijvoorbeeld die de databaserol of database_id van de huidige gebruiker controleert, enz.
De meeste van de bovenstaande code is een sjabloon die u wilt kopiëren en plakken. Het enige dat hier zal veranderen, zijn de naam en argumenten van predikaat en voorwaarde in de clausule WHERE. Nu maakt u een beveiligingsbeleid dat dit predicaat op sommige tabellen toepast.
Nu kunnen we beveiligingsbeleid maken met het predicaat dat updates op producttabel blokkeert als de CompanyID-kolom in de tabel niet voldoet aan het predicaat.
CREËER VEILIGHEIDSBELEID dbo.ProductAccessPolicy VOEG BLOK VOORSPELLEN dbo.pUserCanAccessProduct (CompanyID) ON dbo.Product
Dit predicaat zal op alle operaties worden toegepast. Als u predicaat wilt toepassen op een bewerking, kunt u iets schrijven als:
CREËER VEILIGHEIDSBELEID dbo.ProductAccessPolicy VOEG BLOK VOORSPELLEN dbo.pUserCanAccessProduct (CompanyID) OP dbo.Product NA INVOEGEN
Mogelijke opties die u kunt toevoegen na de definitie van het blokpredikaat zijn:
[{NA {INSERT | BIJWERKEN } }
| {VOOR {UPDATE | VERWIJDEREN}}]