Toegangsbeheer in Azure HorizonDB (preview)

Het beheren van toegang tot uw Azure HorizonDB is een belangrijk onderdeel van het onderhouden van beveiliging en naleving. In dit artikel wordt uitgelegd hoe u PostgreSQL-rollen en Azure-functies gebruikt om machtigingen te beheren en aanbevolen procedures voor toegangsbeheer te implementeren.

Rolbeheer

De beste manier om Azure toegangsmachtigingen voor HorizonDB-databases op schaal te beheren, is door gebruik te maken van het concept van roles. Een rol kan een databasegebruiker of een groep databasegebruikers zijn. Rollen kunnen eigenaar zijn van de databaseobjecten en bevoegdheden voor deze objecten toewijzen aan andere rollen om te bepalen wie toegang heeft tot welke objecten. U kunt lidmaatschap van een rol toewijzen aan een andere rol, zodat de lidrol bevoegdheden kan gebruiken die aan een andere rol zijn toegewezen. Azure HorizonDB kunt u rechtstreeks machtigingen verlenen aan de databasegebruikers. Maak als een goede beveiligingspraktijk rollen met specifieke sets machtigingen op basis van minimale toepassings- en toegangsvereisten. Wijs de juiste rollen toe aan elke gebruiker. Gebruik rollen om een model met minimale bevoegdheden af te dwingen voor toegang tot databaseobjecten.

Naast de ingebouwde rollen die PostgreSQL maakt, bevat het Azure HorizonDB-cluster drie standaardrollen. U kunt deze rollen zien door de volgende opdracht uit te voeren:

SELECT rolname FROM pg_roles;

De rollen zijn:

  • azure_pg_admin
  • azuresu
  • administrator role

Wanneer u het Azure HorizonDB-cluster maakt, geeft u referenties op voor een administrator role. Gebruik dit administrator role om meer PostgreSQL-rollen te maken.

U kunt bijvoorbeeld een gebruiker of rol met de naam exampleusermaken.

CREATE USER exampleuser PASSWORD password123;

Gebruik de beheerdersrol niet voor de toepassing.

In PaaS-omgevingen in de cloud is de toegang tot een Azure HorizonDB-superuseraccount beperkt tot alleen besturingsvlakbewerkingen. De rol azuresu heeft supergebruikersbevoegdheden, maar het Azure HorizonDB-clusterbeheerdersaccount maakt geen deel uit van de rol azuresu.

De azure_pg_admin rol bestaat als een pseudo-superuser-account. Het aanmeldingsaccount van de beheerder dat u hebt geconfigureerd toen u het cluster maakte, maakt deel uit van de azure_pg_admin-rol.

U kunt regelmatig de lijst met rollen in uw cluster controleren.

U kunt bijvoorbeeld verbinding maken met behulp van de psql client en een query uitvoeren op de pg_roles tabel, waarin alle rollen worden vermeld, samen met bevoegdheden zoals het maken van andere rollen, het maken van databases, replicatie en meer.

select * from pg_roles where rolname='demouser';
-[ RECORD 1 ]--+---------
rolname        | demouser
rolsuper       | f
rolinherit     | t
rolcreaterole  | f
rolcreatedb    | f
rolcanlogin    | f
rolreplication | f
rolconnlimit   | -1
rolpassword    | ********
rolvaliduntil  |
rolbypassrls   | f
rolconfig      |
oid            | 24827

Belangrijk

Azure HorizonDB kunt u CAST-opdrachten maken. Als u de CREATE CAST instructie wilt uitvoeren, moet de gebruiker lid zijn van de azure_pg_admin rol. Op dit moment kunt u een CAST niet verwijderen nadat u deze hebt gemaakt.

Azure HorizonDB ondersteunt alleen CAST-opdrachten die gebruikmaken van de opties WITH FUNCTION en WITH INOUT. De optie WITHOUT FUNCTION wordt niet ondersteund.

Toegang tot schema's beheren

Nieuw gemaakte databases in Azure HorizonDB bevatten een standaardset bevoegdheden in het openbare schema van de database die alle databasegebruikers en rollen de mogelijkheid biedt om objecten te maken. Als u de toegang van toepassingsgebruikers tot de databases die u op uw Azure HorizonDB-exemplaar maakt, beter wilt beperken, overweeg dan deze standaard publieke machtigingen in te trekken. Na het intrekken van deze bevoegdheden verleent u specifieke bevoegdheden aan databasegebruikers op een gedetailleerdere basis. Voorbeeld:

  • Maakbevoegdheden voor het schema intrekken vanuit de publicpublic rol om te voorkomen dat gebruikers van de toepassingsdatabase objecten maken in het openbare schema.

    REVOKE CREATE ON SCHEMA public FROM PUBLIC;
    
  • Maak een nieuwe database.

    CREATE DATABASE Test_db;
    
  • Alle bevoegdheden van het OPENBARE schema voor deze nieuwe database intrekken.

    REVOKE ALL ON DATABASE Test_db FROM PUBLIC;
    
  • Maak een aangepaste rol voor toepassingsdatabasegebruikers.

    CREATE ROLE Test_db_user;
    
  • Geef databasegebruikers met deze rol de mogelijkheid om verbinding te maken met de database.

    GRANT CONNECT ON DATABASE Test_db TO Test_db_user;
    GRANT ALL PRIVILEGES ON DATABASE Test_db TO Test_db_user;
    
  • Maak een databasegebruiker.

    CREATE USER user1 PASSWORD 'Password_to_change'
    
  • Wijs de rol, met de CONNECT- en SELECT-machtigingen, toe aan de gebruiker.

    GRANT Test_db_user TO user1;
    

In dit voorbeeld kan gebruiker gebruiker1 verbinding maken en alle bevoegdheden hebben in de testdatabase Test_db, maar geen andere database in het cluster. In plaats van deze gebruiker of rol ALLE BEVOEGDHEDEN voor die database en de bijbehorende objecten te geven, kunt u beter selectieve machtigingen opgeven, zoals SELECT, INSERT, EXECUTEen andere. Zie de opdrachten GRANT en REVOKE in de PostgreSQL-documenten voor meer informatie over bevoegdheden in PostgreSQL-databases.

Wijzigingen in het eigendom van openbare schema's in Azure HorizonDB

In Azure HorizonDB is het openbare schema eigendom van de rol azure_pg_admin in alle ondersteunde PostgreSQL-versies.

Verbeterde controle voor azure_pg_admin

In Azure HorizonDB is de azure_pg_admin rol een door het systeem beheerde, beperkte rol die u niet kunt wijzigen. Als u deze probeert te wijzigen, bijvoorbeeld door een andere rol toe te kennen, krijgt u een foutmelding zoals:

GRANT <db_user> TO azure_pg_admin;
ERROR: permission denied to alter restricted role "azure_pg_admin"

Deze beperking is een ingebouwde beveiliging om wijzigingen in kritieke beheerrollen te voorkomen. Als u bevoegdheden of rollen wilt toewijzen, kunt u in plaats daarvan een aangepaste rol maken en de benodigde machtigingen voor die rol verlenen.

Azure HorizonDB verbetert de mogelijkheden van de azure_pg_admin rol in alle PostgreSQL-versies. Leden van de azure_pg_admin rol kunnen rollen beheren en toegang krijgen tot objecten die eigendom zijn van een niet-beperkte rol, zelfs als deze rollen ook lid zijn van azure_pg_admin. Deze functie zorgt ervoor dat gebruikers met beheerdersrechten consistente en uitgebreide controle houden over rol- en machtigingsbeheer, waardoor een naadloze en betrouwbare ervaring wordt geboden zonder supergebruikerstoegang te vereisen.

Belangrijk

Azure HorizonDB staat niet toe dat gebruikers het attribuut pg_write_all_data toegekend krijgen, waarmee een gebruiker naar alle gegevens in tabellen, weergaven en reeksen kan schrijven, alsof deze gebruiker INSERT-, UPDATE- en DELETE-rechten op die objecten heeft, en USAGE-rechten op alle schema's, zelfs zonder dat dit expliciet is toegekend. Als tijdelijke oplossing wordt aanbevolen vergelijkbare machtigingen toe te kennen op een gedetailleerder niveau per database en object.

Beveiliging per rij

Row-level security (RLS) is een Azure HorizonDB-beveiligingsfunctie waarmee databasebeheerders beleidsregels kunnen definiëren waarmee wordt bepaald hoe specifieke rijen met gegevens worden weergegeven en worden gebruikt voor een of meer rollen. Beveiliging op rijniveau voegt een extra filter toe aan een Azure HorizonDB-databasetabel. Wanneer een gebruiker een actie op een tabel probeert uit te voeren, wordt dit filter toegepast vóór de querycriteria of andere filters en worden de gegevens beperkt of geweigerd volgens uw beveiligingsbeleid. U kunt beveiligingsbeleid op rijniveau maken voor specifieke opdrachten, zoals SELECT, INSERTUPDATE, en , of DELETEopgeven voor alle opdrachten. Gebruiksvoorbeelden voor beveiliging op rijniveau omvatten PCI-compatibele implementaties, geclassificeerde omgevingen en gedeelde hosting of multitenant-toepassingen.

Alleen gebruikers met SET ROW SECURITY rechten kunnen rijbeveiligingsrechten toepassen op een tabel. De eigenaar van de tabel kan beveiliging op rijniveau instellen op een tabel. Net als OVERRIDE ROW SECURITY is dit recht momenteel een impliciet recht. Beveiliging op rijniveau overschrijft geen bestaande GRANT machtigingen. Het voegt een fijner controleniveau toe. Als u bijvoorbeeld ROW SECURITY FOR SELECT zo instelt dat een bepaalde gebruiker alleen toegang heeft tot rijen, krijgt die gebruiker alleen toegang als de gebruiker ook over SELECT-rechten beschikt voor de betreffende kolom of tabel.

In het volgende voorbeeld ziet u hoe u een beleid maakt dat ervoor zorgt dat alleen leden van de aangepaste managerrol toegang hebben tot de rijen voor een specifiek account. De code in het volgende voorbeeld wordt gedeeld in de PostgreSQL-documentatie.

CREATE TABLE accounts (manager text, company text, contact_email text);

ALTER TABLE accounts ENABLE ROW LEVEL SECURITY;

CREATE POLICY account_managers ON accounts TO managers
  USING (manager = current_user);

De USING component voegt impliciet een WITH CHECK component toe, zodat leden van de rol Manager geen bewerkingen kunnen uitvoeren op SELECTDELETE rijen die deel uitmaken van andere managers en geen UPDATE nieuwe rijen kunnen toevoegen INSERTdie tot een andere manager behoren.

U kunt een beleid voor beveiliging op rijniveau verwijderen met de opdracht DROP POLICY, zoals in dit voorbeeld wordt weergegeven:

DROP POLICY account_managers ON accounts;

Hoewel u het beleid kunt verwijderen, kan rolbeheerder nog steeds geen gegevens bekijken die deel uitmaken van een andere manager. Deze beperking bestaat omdat het beveiligingsbeleid op rijniveau nog steeds is ingeschakeld in de tabel Accounts. Als beveiliging op rijniveau standaard is ingeschakeld, gebruikt PostgreSQL een standaardbeleid voor weigeren.

U kunt beveiliging op rijniveau uitschakelen, zoals wordt weergegeven in het volgende voorbeeld:

ALTER TABLE accounts DISABLE ROW LEVEL SECURITY;

Beveiliging op rijniveau overslaan

PostgreSQL bevat BYPASSRLS en NOBYPASSRLS machtigingen die u aan een rol kunt toewijzen. Standaard wordt de NOBYPASSRLS machtiging toegewezen. In Azure HorizonDB werkt de bevoegdheid om beveiliging op rijniveau te omzeilen (BYPASSRLS) als volgt:

  • Niet-administratieve gebruikers die door de beheerder met de rol azure_pg_admin zijn aangemaakt, kunnen indien nodig rollen maken met het kenmerk of privilege BYPASSRLS.

  • Gebruik de azure_pg_admin gebruiker om beheertaken uit te voeren waarvoor de BYPASSRLS bevoegdheid is vereist.