Microsoft SQL Server
Bezpieczeństwo na poziomie wiersza
Szukaj…
Predykat filtra RLS
Sql Server 2016+ i baza danych Azure Sql umożliwia automatyczne filtrowanie wierszy zwracanych w instrukcji select przy użyciu niektórych predykatów. Ta funkcja nazywa się Zabezpieczeniami na poziomie wiersza .
Po pierwsze, potrzebujesz funkcji o wartościach przechowywanych w tabeli, która zawiera predykat, który opisuje, co to warunek, który pozwoli użytkownikom odczytać dane z niektórych tabel:
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
)
W tym przykładzie predykat mówi, że tylko użytkownicy, którzy mają wartość w SESSION_CONTEXT, która jest zgodna z argumentem wejściowym, mogą uzyskać dostęp do firmy. Możesz postawić dowolny inny warunek, np. Sprawdzający rolę bazy danych lub identyfikator_bazy bieżącego użytkownika itp.
Większość powyższego kodu to szablon, który skopiujesz i wkleisz. Jedyne, co się tutaj zmieni, to nazwa i argumenty predykatu i warunku w klauzuli WHERE. Teraz tworzysz zasady bezpieczeństwa, które zastosują ten predykat na niektórych tabelach.
Teraz możesz utworzyć politykę bezpieczeństwa, która będzie stosować predykat na niektórych tabelach:
CREATE SECURITY POLICY dbo.CompanyAccessPolicy
ADD FILTER PREDICATE dbo.pUserCanAccessCompany(CompanyID) ON dbo.Company
WITH (State=ON)
Ta polityka bezpieczeństwa przypisuje predykat do tabeli firmy. Ilekroć ktoś próbuje odczytać dane z tabeli firmowej, polityka bezpieczeństwa zastosuje predykat w każdym wierszu, przekaże kolumnę CompanyID jako parametr predykatu i predykat oceni, czy ten wiersz zostanie zwrócony w wyniku zapytania SELECT.
Zmiana polityki bezpieczeństwa RLS
Polityka bezpieczeństwa to grupa predykatów powiązanych z tabelami, którymi można zarządzać razem. Możesz dodawać lub usuwać predykaty lub włączać / wyłączać całe zasady.
Możesz dodać więcej predykatów do tabel w istniejącej polityce bezpieczeństwa.
ALTER SECURITY POLICY dbo.CompanyAccessPolicy
ADD FILTER PREDICATE dbo.pUserCanAccessCompany(CompanyID) ON dbo.Company
Możesz usunąć niektóre predykaty z polityki bezpieczeństwa:
ALTER SECURITY POLICY dbo.CompanyAccessPolicy
DROP FILTER PREDICATE ON dbo.Company
Możesz wyłączyć politykę bezpieczeństwa
ALTER SECURITY POLICY dbo.CompanyAccessPolicy WITH ( STATE = OFF );
Możesz włączyć zasady bezpieczeństwa, które zostały wyłączone:
ALTER SECURITY POLICY dbo.CompanyAccessPolicy WITH ( STATE = ON );
Zapobieganie aktualizacji przy użyciu predykatu bloku RLS
Zabezpieczenia na poziomie wiersza umożliwiają zdefiniowanie niektórych predykatów, które będą kontrolować, kto może aktualizować wiersze w tabeli. Najpierw musisz zdefiniować funkcję tabeli-wartości, która reprezentuje predykat, który będzie kontrolował politykę dostępu.
UTWÓRZ FUNKCJĘ
dbo.pUserCanAccessProduct (@CompanyID int)
RETURNS TABLE
WITH SCHEMABINDING
JAK ZWROTU (WYBIERZ 1 jako canDostęp GDZIE
CAST (SESSION_CONTEXT (N'CompanyID ') as int) = @CompanyID
) W tym przykładzie predykat mówi, że tylko użytkownicy o wartości SESSION_CONTEXT, która jest zgodna z argumentem wejściowym, mogą uzyskać dostęp do firmy. Możesz postawić dowolny inny warunek, np. Sprawdzający rolę bazy danych lub identyfikator_bazy bieżącego użytkownika itp.
Większość powyższego kodu to szablon, który skopiujesz i wkleisz. Jedyne, co się tutaj zmieni, to nazwa i argumenty predykatu i warunku w klauzuli WHERE. Teraz tworzysz zasady bezpieczeństwa, które zastosują ten predykat na niektórych tabelach.
Teraz możemy utworzyć strategię bezpieczeństwa z predykatem, który zablokuje aktualizacje w tabeli produktów, jeśli kolumna CompanyID w tabeli nie spełni predykatu.
STWÓRZ POLITYKĘ BEZPIECZEŃSTWA dbo.ProductAccessPolicy DODAJ BLOKADĘ PRZEDSTAWICIEL dbo.pUserCanAccessProduct (CompanyID) NA dbo.Product
Ten predykat zostanie zastosowany do wszystkich operacji. Jeśli chcesz zastosować predykat do niektórych operacji, możesz napisać coś takiego:
STWÓRZ POLITYKĘ BEZPIECZEŃSTWA dbo.ProductAccessPolicy DODAJ BLOKADĘ PEDAKTY dbo.pUserCanAccessProduct (CompanyID) NA dbo.Produkt PO WSTAWIENIU
Możliwe opcje, które można dodać po definicji predykatu bloku, to:
[{PO {WSTAWIĆ | AKTUALIZACJA } }
| {PRZED {AKTUALIZACJĄ | USUNĄĆ } } ]