Delen via


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, tenant2enzovoort. 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