Beveiliging op rijniveau in Azure Cosmos DB for PostgreSQL
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 afzonderlijke tenants volledige SQL-toegang tot de database hebben terwijl de gegevens van elke tenant uit andere tenants worden verborgen.
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 rollen tenant1
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.
Elk beleid bestaat uit twee componenten: 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;
tenant1
Rollen nu en tenant2
krijgen verschillende resultaten voor hun query's:
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