Megosztás a következőn keresztül:


Sorszintű biztonság az Azure Cosmos DB for PostgreSQL-ben

Fontos

Az Azure Cosmos DB for PostgreSQL már nem támogatott új projektek esetén. Ne használja ezt a szolgáltatást új projektekhez. Ehelyett használja az alábbi két szolgáltatás egyikét:

  • Az Azure Cosmos DB for NoSQL használata nagy léptékű forgatókönyvekhez tervezett elosztott adatbázis-megoldáshoz 99,999% rendelkezésre állási szolgáltatásiszint-szerződéssel (SLA), azonnali automatikus skálázással és automatikus feladatátvétellel több régióban.

  • Használja az Azure Database For PostgreSQL Rugalmas fürtök funkcióját a megosztott PostgreSQL-hez a nyílt forráskódú Citus-bővítmény használatával.

A PostgreSQL sorszintű biztonsági szabályzatai korlátozzák, hogy mely felhasználók módosíthatják vagy érhetik el a táblasorokat. A sorszintű biztonság különösen hasznos lehet több-bérlős fürtökben. Lehetővé teszi az egyes bérlők számára, hogy teljes SQL-hozzáféréssel rendelkezzenek az adatbázishoz, miközben elrejtik az egyes bérlők adatait más bérlők elől.

Megvalósítás több bérlős alkalmazásokra

A bérlői adatok elkülönítését a tábla sorszintű biztonsági szabályzataihoz kapcsolódó adatbázis-szerepkörök elnevezési konvenciójának használatával valósíthatjuk meg. Minden bérlőhöz hozzárendelünk egy adatbázisszerepkört számozott sorrendben: tenant1, tenant2stb. A bérlők az alábbi különálló szerepkörökkel csatlakoznak az Azure Cosmos DB for PostgreSQL-hez. A sorszintű biztonsági szabályzatok összehasonlíthatják a szerepkör nevét a tenant_id terjesztési oszlop értékeivel, így eldönthetik, hogy engedélyezik-e a hozzáférést.

Az alábbiakban bemutatjuk, hogyan alkalmazhatja a megközelítést egy egyszerűsített eseménytáblán, amely a következő szerint tenant_idoszlik meg: Először hozza létre a szerepkörökettenant1 és tenant2. Ezután futtassa a következő SQL-parancsokat rendszergazdai citus felhasználóként:

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;

A jelenlegi állapot szerint a táblázathoz kiválasztott engedélyekkel rendelkezők mindkét sort láthatják. Bármelyik bérlő felhasználói megtekinthetik és frissíthetik a másik bérlő sorát. Az adatszivárgást sorszintű táblabiztonsági szabályzatokkal oldhatjuk meg.

Minden szabályzat két záradékból áll: USING és WITH CHECK. Amikor egy felhasználó sorokat próbál olvasni vagy írni, az adatbázis kiértékeli az egyes sorokat ezen záradékok alapján. A PostgreSQL ellenőrzi a meglévő táblasorokat a USING záradékban megadott kifejezéssel, és az INSERT vagy UPDATE használatával létrehozott sorokat a WITH CHECK záradékkal.

-- 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;

Mostantól a szerepkörök tenant1 és tenant2 különböző eredményeket kapnak a lekérdezéseikre.

Bérlőként csatlakoztatva1:

SELECT * FROM events;
┌───────────┬────┬──────┐
│ tenant_id │ id │ type │
├───────────┼────┼──────┤
│         1 │  1 │ foo  │
└───────────┴────┴──────┘

Bérlőként csatlakoztatva2:

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"
*/

Következő lépések