Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Importante
Azure Cosmos DB per PostgreSQL non è più supportato per i nuovi progetti. Non usare questo servizio per i nuovi progetti. Usare invece uno dei due servizi seguenti:
Usare Azure Cosmos DB per NoSQL per una soluzione di database distribuita progettata per scenari su alta scala con un accordo sul livello di servizio (SLA) di disponibilità del 99.999%, scalabilità automatica istantanea e failover automatico in più regioni.
Usare la funzionalità Cluster elastici di Database di Azure per PostgreSQL per PostgreSQL partizionato usando l'estensione Citus open source.
I criteri di sicurezza a livello di riga di PostgreSQL limitano gli utenti che possono modificare o accedere a date righe della tabella. La sicurezza a livello di riga può essere particolarmente utile in un cluster multi-tenant. Consente ai singoli tenant di avere un accesso SQL completo al database nascondendo le informazioni di ogni tenant agli altri tenant.
Implementazione per app multi-tenant
È possibile implementare la separazione dei dati del tenant usando una convenzione di denominazione per i ruoli del database che si collega ai criteri di sicurezza a livello di riga della tabella. Si assegnerà a ogni tenant un ruolo del database in una sequenza numerata: tenant1, tenant2 e così via. I tenant si connetteranno ad Azure Cosmos DB for PostgreSQL usando questi ruoli separati. I criteri di sicurezza a livello di riga possono confrontare il nome del ruolo con i valori nella colonna di distribuzione tenant_id per decidere se consentire l'accesso.
Ecco come applicare l'approccio a una tabella eventi semplificata distribuita da tenant_id. Creare prima di tutto i ruolitenant1 e tenant2. Quindi,eseguire i comandi SQL seguenti come utente amministratore 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;
In questo modo, chiunque disponga delle autorizzazioni di selezione per questa tabella può visualizzare entrambe le righe. Gli utenti di entrambi i tenant possono visualizzare e aggiornare la riga dell'altro tenant. È possibile risolvere la perdita di dati con i criteri di sicurezza delle tabelle a livello di riga.
Ogni criterio è costituito da due clausole: USING e WITH CHECK. Quando un utente tenta di leggere o scrivere righe, il database valuta ogni riga rispetto a queste clausole. PostgreSQL controlla le righe di tabella esistenti rispetto all'espressione specificata nella clausola USING e le righe che verrebbero create tramite INSERT o UPDATE rispetto alla clausola WITH CHECK.
-- 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;
Adesso, i ruoli tenant1 e tenant2 ottengono risultati diversi per le query:
Connesso come tenant1:
SELECT * FROM events;
┌───────────┬────┬──────┐
│ tenant_id │ id │ type │
├───────────┼────┼──────┤
│ 1 │ 1 │ foo │
└───────────┴────┴──────┘
Connesso come 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"
*/
Passaggi successivi
- Scopri come creare ruoli in un cluster.
- Esplora concetti di sicurezza in Azure Cosmos DB for PostgreSQL