Microsoft SQL Server
Sicurezza a livello di riga
Ricerca…
Predicato del filtro RLS
Sql Server 2016+ e il database Azure Sql consentono di filtrare automaticamente le righe restituite nell'istruzione select utilizzando un determinato predicato. Questa funzione è chiamata sicurezza a livello di riga .
Innanzitutto, è necessaria una funzione valutata a livello di tabella che contenga un predicato che descriva quale sia la condizione che consentirà agli utenti di leggere i dati da una tabella:
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 questo esempio, il predicato afferma che solo gli utenti che hanno un valore in SESSION_CONTEXT che corrisponde all'argomento di input possono accedere alla società. Puoi inserire qualsiasi altra condizione, ad es. Che controlli il ruolo del database o l'id_database dell'utente corrente, ecc.
La maggior parte del codice sopra riportato è un modello che verrà copiato e incollato. L'unica cosa che cambierà qui è il nome e gli argomenti di predicato e condizione nella clausola WHERE. Ora si creano criteri di sicurezza che applicheranno questo predicato su alcune tabelle.
Ora puoi creare una politica di sicurezza che applicherà il predicato su alcune tabelle:
CREATE SECURITY POLICY dbo.CompanyAccessPolicy
ADD FILTER PREDICATE dbo.pUserCanAccessCompany(CompanyID) ON dbo.Company
WITH (State=ON)
Questa politica di sicurezza assegna un predicato alla tabella aziendale. Ogni volta che qualcuno tenta di leggere i dati dalla tabella Company, i criteri di sicurezza applicheranno il predicato su ogni riga, passeranno la colonna CompanyID come parametro del predicato e il predicato valuterà se questa riga verrà restituita nel risultato della query SELECT.
Modifica della politica di sicurezza RLS
La politica di sicurezza è un gruppo di predicati associati alle tabelle che possono essere gestiti insieme. È possibile aggiungere o rimuovere predicati o attivare / disattivare l'intera politica.
È possibile aggiungere più predicati sulle tabelle nella politica di sicurezza esistente.
ALTER SECURITY POLICY dbo.CompanyAccessPolicy
ADD FILTER PREDICATE dbo.pUserCanAccessCompany(CompanyID) ON dbo.Company
È possibile eliminare alcuni predicati dalla politica di sicurezza:
ALTER SECURITY POLICY dbo.CompanyAccessPolicy
DROP FILTER PREDICATE ON dbo.Company
È possibile disabilitare la politica di sicurezza
ALTER SECURITY POLICY dbo.CompanyAccessPolicy WITH ( STATE = OFF );
È possibile abilitare la politica di sicurezza che è stata disabilitata:
ALTER SECURITY POLICY dbo.CompanyAccessPolicy WITH ( STATE = ON );
Impedire l'aggiornamento utilizzando il predicato del blocco RLS
La sicurezza a livello di riga consente di definire alcuni predicati che controlleranno chi potrebbe aggiornare le righe nella tabella. Per prima cosa è necessario definire una funzione valore di tabella che rappresenti un predicato che controllerà la politica di accesso.
CREA FUNZIONE
dbo.pUserCanAccessProduct (@CompanyID int)
RETURNS TABLE
WITH SCHEMABINDING
AS RETURN (SELEZIONA 1 come canAccess WHERE
CAST (SESSION_CONTEXT (N'CompanyID ') come int) = @CompanyID
) In questo esempio, il predicato afferma che solo gli utenti che hanno un valore in SESSION_CONTEXT che corrisponde all'argomento di input possono accedere alla società. Puoi inserire qualsiasi altra condizione, ad es. Che controlli il ruolo del database o l'id_database dell'utente corrente, ecc.
La maggior parte del codice sopra riportato è un modello che verrà copiato e incollato. L'unica cosa che cambierà qui è il nome e gli argomenti di predicato e condizione nella clausola WHERE. Ora si creano criteri di sicurezza che applicheranno questo predicato su alcune tabelle.
Ora possiamo creare una politica di sicurezza con il predicato che bloccherà gli aggiornamenti sulla tabella dei prodotti se la colonna CompanyID nella tabella non soddisfa il predicato.
CREARE LA POLITICA DI SICUREZZA dbo.ProductAccessPolicy AGGIUNGI BLOCCO PREDICA dbo.pUserCanAccessProduct (CompanyID) ON dbo.Product
Questo predicato verrà applicato su tutte le operazioni. Se vuoi applicare il predicato su qualche operazione puoi scrivere qualcosa come:
CREA POLITICA DI SICUREZZA dbo.ProductAccessPolicy AGGIUNGI BLOCCO PREDICA dbo.pUserCanAccessProduct (CompanyID) ON dbo.Product DOPO INSERIMENTO
Le possibili opzioni che è possibile aggiungere dopo la definizione del predicato del blocco sono:
[{DOPO {INSERIRE | AGGIORNARE } }
| {PRIMA {AGGIORNAMENTO | ELIMINA } } ]