Zabezpečenie na úrovni riadkov v sklade údajov služby Fabric
Vzťahuje sa na:✅ koncový bod analýzy SQL a sklad v službe Microsoft Fabric
Zabezpečenie na úrovni riadkov umožňuje použiť členstvo v skupine alebo kontext vykonávania na ovládanie prístupu k riadkom v tabuľke databázy. Môžete napríklad zabezpečiť, aby pracovníci získali prístup len k tým údajovým riadkom, ktoré sú relevantné pre ich oddelenie. Ďalším príkladom je obmedzenie prístupu zákazníkov k údajom len na údaje relevantné pre ich spoločnosť v multitenantnej architektúre. Táto funkcia je podobná ako zabezpečenie na úrovni riadkov na SQL Serveri.
Zabezpečenie na úrovni riadkov na úrovni údajov
Zabezpečenie na úrovni riadkov zjednodušuje návrh a kódovanie zabezpečenia vo vašej aplikácii. Zabezpečenie na úrovni riadkov pomáha implementovať obmedzenia prístupu k riadkom údajov.
Logika obmedzenia prístupu sa nachádza v databázovej úrovni, nie v žiadnej úrovni jednej aplikácie. Databáza uplatňuje obmedzenia prístupu pri každom pokuse o prístup k údajom z akejkoľvek aplikácie alebo platformy vytvárania zostáv vrátane služby Power BI. Vďaka tomu je váš bezpečnostný systém spoľahlivejší a robustnejší zredukovaním povrchu bezpečnostného systému. Zabezpečenie na úrovni riadkov sa vzťahuje len na dotazy na koncovom bode analýzy Warehouse alebo SQL v službe Fabric. Dotazy Power BI v sklade v režime Direct Lake sa vrátia späť do režimu Direct Query, aby dodržiavali zabezpečenie na úrovni riadkov.
Obmedzenie prístupu k určitým riadkom na určitých používateľov
Implementovať zabezpečenie na úrovni riadkov pomocou príkazu CREATE SECURITY POLICY Transact-SQL a predikátov vytvorených ako funkcie s vnorenou tabuľkou.
Zabezpečenie na úrovni riadkov sa použije na zdieľaný sklad alebo lakehouse, pretože základný zdroj údajov sa nezmenil.
Zabezpečenie na úrovni riadkov na úrovni predikátu
Zabezpečenie na úrovni riadkov v sklade údajov služby Fabric podporuje zabezpečenie na základe prediktov. Filtrovať predikáty ticho filtrovať riadky k dispozícii na čítanie operácií.
Prístup k údajom na úrovni riadkov v tabuľke je obmedzený predikátom zabezpečenia definovaným ako vnorená funkcia s hodnotou tabuľky. Funkcia sa potom vyvolá a vynucuje politikou zabezpečenia. V prípade predikátov filtrov aplikácia nevie o riadkoch, ktoré sú filtrované z množiny výsledkov. Ak sú všetky riadky filtrované, vráti sa množina null.
Predikáty filtrov sa používajú pri čítaní údajov zo základnej tabuľky. Ovplyvňujú všetky operácie získania: SELECT
, DELETE
, a UPDATE
. Každá tabuľka musí mať vlastné zabezpečenie na úrovni riadkov definované samostatne. Používatelia, ktorí dotazujú tabuľky bez politiky zabezpečenia na úrovni riadkov, zobrazia nefiltrované údaje.
Používatelia nemôžu vybrať ani odstrániť riadky, ktoré sú filtrované. Používateľ nemôže aktualizovať riadky, ktoré sú filtrované. Riadky je však možné aktualizovať tak, aby sa potom filtrovať.
Predikát filtra a politiky zabezpečenia sa správajú takto:
Môžete definovať funkciu predikátu, ktorá sa spojí s inou tabuľkou a/alebo vyvolá funkciu. Ak je politika zabezpečenia vytvorená pomocou
SCHEMABINDING = ON
funkcie (predvolené), pripojenie alebo funkcia je dostupná z dotazu a funguje podľa očakávania bez akýchkoľvek ďalších kontrol povolení.Môžete vytvoriť dotaz na tabuľku, ktorá má definovaný, ale zakázaný predikát zabezpečenia. Všetky riadky, ktoré sú filtrované alebo blokované, nie sú ovplyvnené.
Ak používateľ služby dbo, člen
db_owner
roly alebo vlastník tabuľky dotazuje tabuľku, ktorá má definovanú a povolenú politiku zabezpečenia, riadky sa filtrujú alebo blokujú podľa definície politiky zabezpečenia.Pokusy o zmenu schémy tabuľky viazanej politikou zabezpečenia viazanou na schému budú mať za následok chybu. Stĺpce, na ktoré sa nevzťahuje predikát, sa však môžu zmeniť.
Pokusy o pridanie predikátu do tabuľky, ktorá už má definovanú pre zadanú operáciu, majú za následok chybu. To sa stane, či je predikát povolený alebo nie.
Pokusy o úpravu funkcie, ktorá sa používa ako predikát v tabuľke v rámci politiky zabezpečenia viazaného na schému, budú mať za následok chybu.
Definovanie viacerých aktívnych politík zabezpečenia, ktoré obsahujú neprekrytie predikátov, je úspešné.
Predikáty filtrov majú nasledujúce správanie:
- Definujte politiku zabezpečenia, ktorá filtruje riadky tabuľky. Aplikácia nevie o žiadnych riadkoch, ktoré sú filtrované pre
SELECT
operácie ,UPDATE
aDELETE
. Zahrnutie situácií, v ktorých sú všetky riadky odfiltrované. Aplikácia môžeINSERT
riadky použiť, dokonca aj vtedy, ak budú filtrované počas akejkoľvek inej operácie.
Povolenia
Vytváranie, zmena alebo zrušenie politík zabezpečenia vyžaduje ALTER ANY SECURITY POLICY
povolenie. Vytvorenie alebo zvrhnutie politiky zabezpečenia vyžaduje ALTER
povolenie na schému.
Okrem toho sa pre každý pridaný predikát vyžadujú nasledujúce povolenia:
SELECT
aREFERENCES
povolenia týkajúce sa funkcie, ktorá sa používa ako predikát.REFERENCES
povolenia pre cieľovú tabuľku, ktorá je viazaná na politiku.REFERENCES
povolenie pre každý stĺpec z cieľovej tabuľky, ktorá sa používa ako argumenty.
Politiky zabezpečenia sa vzťahujú na všetkých používateľov vrátane používateľov platformy dbo v databáze. Používatelia služby Dbo môžu meniť alebo zrušiť politiky zabezpečenia, ich zmeny politík zabezpečenia však môžu byť auditované. Ak členovia rolí, ako napríklad správca, člen alebo prispievateľ, potrebujú zobraziť všetky riadky na riešenie problémov s údajmi alebo ich overenie, musí byť zapísané politika zabezpečenia, aby to bolo možné.
Ak sa pomocou politiky zabezpečenia vytvorí SCHEMABINDING = OFF
dotaz na cieľovú tabuľku, používatelia musia mať SELECT
povolenie alebo EXECUTE
pre funkciu predikátu a všetky ďalšie tabuľky, zobrazenia alebo funkcie použité v rámci funkcie predikátu. Ak je politika zabezpečenia vytvorená pomocou SCHEMABINDING = ON
funkcie (predvolené), tieto kontroly povolení sa obídu, keď používatelia dotazujú cieľovú tabuľku.
Dôležité informácie týkajúce sa zabezpečenia: útoky na bočnom kanáli
Zvážte a pripravte nasledujúce dva scenáre.
Správca politiky škodlivého zabezpečenia
Je dôležité poznamenať, že škodlivý manažér politiky zabezpečenia s dostatočnými povoleniami na vytvorenie politiky zabezpečenia nad citlivým stĺpcom a povolenie na vytváranie alebo zmenu funkcií s vnorenými tabuľkami sa môže dohadovať s iným používateľom, ktorý má vybrané povolenia pre tabuľku na vykonávanie exfiltrácie údajov škodlivým spôsobom vytvorením funkcií s hodnotami vnorených tabuliek určených na použitie útokov bočného kanála na odvodenie údajov. Takéto útoky by si vyžadovali tajnú dohodu (alebo nadmerné povolenia udelené škodlivému používateľovi) a pravdepodobne by vyžadovali niekoľko iterácií úpravy politiky (vyžadujúc povolenie na odstránenie predikátu, aby sa prerušila väzba schémy), úprava funkcií vnorenej tabuľky a opakované spúšťanie vybraných príkazov v cieľovej tabuľke. Odporúčame obmedziť povolenia podľa potreby a monitorovať akúkoľvek podozrivú aktivitu. Aktivity, ako sú neustále sa meniace politiky a vnorené funkcie s hodnotami z tabuliek súvisiace so zabezpečením na úrovni riadkov, by sa mali monitorovať.
Starostlivo vytvorené dotazy
Je možné spôsobiť únik informácií pomocou starostlivo vytvorených dotazov, ktoré používajú chyby na exfiltrovanie údajov. Napríklad SELECT 1/(SALARY-100000) FROM PAYROLL WHERE NAME='John Doe';
by zlomyseľný používateľ vedel, že plat Johna Doea je presne 100 000 dolárov. Napriek tomu, že existuje predikát zabezpečenia, ktorý má zabrániť škodlivému používateľovi priamo dotazovať plat iných ľudí, používateľ môže určiť, kedy dotaz vráti výnimku delenia nulou.
Príklady
V službe Microsoft Fabric môžeme preukázať sklad zabezpečenia na úrovni riadkov a koncový bod analýzy SQL.
V nasledujúcom príklade sa vytvoria vzorové tabuľky, ktoré budú fungovať so skladom v službe Fabric, ale v koncovom bode analýzy SQL sa použijú existujúce tabuľky. V koncovom bode analýzy SQL nemôžete CREATE TABLE
, ale môžete CREATE SCHEMA
, CREATE FUNCTION
a CREATE SECURITY POLICY
.
V tomto príklade najprv vytvorte schému sales
, tabuľku sales.Orders
.
CREATE SCHEMA sales;
GO
-- Create a table to store sales data
CREATE TABLE sales.Orders (
SaleID INT,
SalesRep VARCHAR(100),
ProductName VARCHAR(50),
SaleAmount DECIMAL(10, 2),
SaleDate DATE
);
-- Insert sample data
INSERT INTO sales.Orders (SaleID, SalesRep, ProductName, SaleAmount, SaleDate)
VALUES
(1, 'Sales1@contoso.com', 'Smartphone', 500.00, '2023-08-01'),
(2, 'Sales2@contoso.com', 'Laptop', 1000.00, '2023-08-02'),
(3, 'Sales1@contoso.com', 'Headphones', 120.00, '2023-08-03'),
(4, 'Sales2@contoso.com', 'Tablet', 800.00, '2023-08-04'),
(5, 'Sales1@contoso.com', 'Smartwatch', 300.00, '2023-08-05'),
(6, 'Sales2@contoso.com', 'Gaming Console', 400.00, '2023-08-06'),
(7, 'Sales1@contoso.com', 'TV', 700.00, '2023-08-07'),
(8, 'Sales2@contoso.com', 'Wireless Earbuds', 150.00, '2023-08-08'),
(9, 'Sales1@contoso.com', 'Fitness Tracker', 80.00, '2023-08-09'),
(10, 'Sales2@contoso.com', 'Camera', 600.00, '2023-08-10');
Vytvorte schému Security
, funkciu Security.tvf_securitypredicate
a politiku SalesFilter
zabezpečenia .
-- Creating schema for Security
CREATE SCHEMA Security;
GO
-- Creating a function for the SalesRep evaluation
CREATE FUNCTION Security.tvf_securitypredicate(@SalesRep AS nvarchar(50))
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN SELECT 1 AS tvf_securitypredicate_result
WHERE @SalesRep = USER_NAME() OR USER_NAME() = 'manager@contoso.com';
GO
-- Using the function to create a Security Policy
CREATE SECURITY POLICY SalesFilter
ADD FILTER PREDICATE Security.tvf_securitypredicate(SalesRep)
ON sales.Orders
WITH (STATE = ON);
GO
Ak chcete upraviť funkciu zabezpečenia na úrovni riadkov, najprv musíte politiku zabezpečenia zrušiť. V nasledujúcom skripte politiku SalesFilter
pred vydaním ALTER FUNCTION
príkazu Security.tvf_securitypredicate
do . Potom znova vytvoríme politiku SalesFilter
.
-- Drop policy so we can change the predicate function.
DROP SECURITY POLICY SalesFilter;
GO
-- Alter the function for the SalesRep evaluation
ALTER FUNCTION Security.tvf_securitypredicate(@SalesRep AS nvarchar(50))
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN SELECT 1 AS tvf_securitypredicate_result
WHERE @SalesRep = USER_NAME() OR USER_NAME() = 'president@contoso.com';
GO
-- Re-create a Security Policy
CREATE SECURITY POLICY SalesFilter
ADD FILTER PREDICATE Security.tvf_securitypredicate(SalesRep)
ON sales.Orders
WITH (STATE = ON);
GO