Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
VAN TOEPASSING OP:
Azure Cosmos DB for PostgreSQL (mogelijk gemaakt door de Citus-database-extensie naar PostgreSQL)
Met beveiligingsbeleid op rijniveau van PostgreSQL kunt u bepalen welke gebruikers welke tabelrijen kunnen wijzigen of openen. Beveiliging op rijniveau kan met name nuttig zijn in een cluster met meerdere tenants. Hiermee kunnen individuele huurders volledige SQL-toegang tot de database hebben, terwijl de informatie van elke huurder voor andere huurders verborgen blijft.
Implementeren voor apps met meerdere tenants
We kunnen de scheiding van tenantgegevens implementeren met behulp van een naamconventie voor databaserollen die zijn gekoppeld aan beveiligingsbeleid op rijniveau op tabelniveau. Aan elke tenant wordt een databaserol toegewezen in een genummerde volgorde: tenant1
, tenant2
enzovoort. Tenants maken verbinding met Azure Cosmos DB for PostgreSQL met behulp van deze afzonderlijke rollen. Beveiligingsbeleid op rijniveau kan de rolnaam vergelijken met waarden in de tenant_id
distributiekolom om te bepalen of toegang moet worden toegestaan.
U kunt als volgt de benadering toepassen op een vereenvoudigde gebeurtenissentabel die wordt gedistribueerd door tenant_id
. Maak eerst de rollentenant1
en tenant2
. Voer vervolgens de volgende SQL-opdrachten uit als beheerder citus
:
CREATE TABLE events(
tenant_id int,
id int,
type text
);
SELECT create_distributed_table('events','tenant_id');
INSERT INTO events VALUES (1,1,'foo'), (2,2,'bar');
-- assumes that roles tenant1 and tenant2 exist
GRANT select, update, insert, delete
ON events TO tenant1, tenant2;
Iedereen met geselecteerde machtigingen voor deze tabel kan beide rijen zien. Gebruikers van een van beide tenants kunnen de rij van de andere tenant zien en bijwerken. We kunnen het gegevenslek oplossen met een tabelbeveiligingsbeleid op rijniveau.
Elke beleidsregel bestaat uit twee clausules: USING en WITH CHECK. Wanneer een gebruiker rijen probeert te lezen of te schrijven, evalueert de database elke rij op basis van deze componenten. PostgreSQL controleert bestaande tabelrijen op basis van de expressie die is opgegeven in de USING-component en rijen die worden gemaakt via INSERT of UPDATE op basis van de WITH CHECK-component.
-- first a policy for the system admin "citus" user
CREATE POLICY admin_all ON events
TO citus -- apply to this role
USING (true) -- read any existing row
WITH CHECK (true); -- insert or update any row
-- next a policy which allows role "tenant<n>" to
-- access rows where tenant_id = <n>
CREATE POLICY user_mod ON events
USING (current_user = 'tenant' || tenant_id::text);
-- lack of CHECK means same condition as USING
-- enforce the policies
ALTER TABLE events ENABLE ROW LEVEL SECURITY;
Nu krijgen rollen tenant1
en tenant2
verschillende resultaten voor hun queries:
Verbonden als tenant1:
SELECT * FROM events;
┌───────────┬────┬──────┐
│ tenant_id │ id │ type │
├───────────┼────┼──────┤
│ 1 │ 1 │ foo │
└───────────┴────┴──────┘
Verbonden als tenant2:
SELECT * FROM events;
┌───────────┬────┬──────┐
│ tenant_id │ id │ type │
├───────────┼────┼──────┤
│ 2 │ 2 │ bar │
└───────────┴────┴──────┘
INSERT INTO events VALUES (3,3,'surprise');
/*
ERROR: new row violates row-level security policy for table "events_102055"
*/
Volgende stappen
- Meer informatie over het maken van rollen in een cluster.
- Beveiligingsconcepten bekijken in Azure Cosmos DB for PostgreSQL