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.
Belangrijk
Azure Cosmos DB for PostgreSQL wordt niet meer ondersteund voor nieuwe projecten. Gebruik deze service niet voor nieuwe projecten. Gebruik in plaats daarvan een van deze twee services:
Gebruik Azure Cosmos DB voor NoSQL voor een gedistribueerde databaseoplossing die is ontworpen voor hoogwaardige schalen scenario's met een 99,999% service level agreement (SLA) voor beschikbaarheid, onmiddellijke autoschaalaanpassing en automatische failover over meerdere regio's.
Gebruik de functie Elastische clusters van Azure Database For PostgreSQL voor sharded PostgreSQL met behulp van de opensource Citus-extensie.
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, 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 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