sql >> Database teknologi >  >> RDS >> PostgreSQL

Håndtering af roller og rolleattributter i PostgreSQL


Introduktion

PostgreSQL bruger forskellige mekanismer til at implementere godkendelse, autorisation og objektejerskab i databaseklynger. Kernen blandt disse er begrebet roller.

PostgreSQL-roller er en kombination af ideer fra brugere og grupper i en enkelt fleksibel enhed. De er den persona, som brugeren anvender i databasesystemet, er den enhed, som godkendelsessystemet accepterer eller afviser forbindelser med, og er genstand for privilegiestyringsregler af alle omfang.

Denne vejledning vil dække, hvad roller er, og hvordan man administrerer dem i en PostgreSQL-databaseklynge. Mere specifikt vil denne vejledning dække rollestyring, som den relaterer til rolleegenskaber. For et mere bredt overblik over, hvordan roller passer ind i det større billede, kan du tage et kig på introduktionen til godkendelses- og autorisationsguide. For at lære, hvordan du ændrer rolleprivilegier på specifikke databaseobjekter, kan du se vores guide om rollebevillinger.



Hvad er roller?

I PostgreSQL er en rolle en gruppering af et specifikt sæt af kapaciteter, tilladelser og "ejede" enheder. I stedet for at have distinkte begreber "brugere" og "grupper", bruger PostgreSQL roller til at repræsentere begge disse ideer. En rolle kan svare til en individuel person i den virkelige verden, eller den kan fungere som en gruppe med en vis adgang, som andre roller kan blive medlemmer af.

Roller er ankerpunktet i PostgreSQL, der bestemmer, hvem godkendelses- og autorisationspolitikker gælder for. Enhver politik, der ikke gælder universelt, kræver en forestilling om identitet for at definere, hvem der skal begrænse, og hvem der skal tillades. I PostgreSQL er denne identitet repræsenteret af roller.

PostgreSQL's autentificeringssystem har en række forskellige komponenter, som hver især er knyttet til roller. For at blive brugt til den indledende forbindelse til databaseklyngen skal roller først have LOGIN attribut sæt. Selve godkendelsesreglerne er defineret i den værtsbaserede konfigurationsfil kaldet pg_hba.conf . Hver regel definerer godkendelsesmetoder, der kan være omfattet af den individuelle rolle. For roller, der er konfigureret til adgangskodegodkendelse, skal der være indstillet en adgangskodeattribut, så systemet kan validere den medfølgende brugeradgangskode.

Med hensyn til autorisation er roller defineret på databaseklyngeniveau, hvilket i PostgreSQL betyder, at de deles mellem databaser. Da roller spænder over databaser, styrer autorisationssystemet det adgangsniveau, hver rolle har til hver databaseentitet. Fordi roller kan repræsentere grupper af mennesker, er der stor fleksibilitet i, hvordan adgang kan konfigureres.

Roller er også afgørende for begrebet objektejerskab i PostgreSQL. Hver database og tabel har for eksempel præcis én rolle konfigureret som ejer. Andre end superusers , er ejerrollen den eneste rolle, der kan ændre eller slette det faktiske objekt.

Sammenfattende er roller kernen i de fleste praktiske databaseoperationer. Deres fleksibilitet giver dem mulighed for at fungere både som brugeridentifikatorer og brugerklasser. Hver handling i databaseklyngen kontrolleres i forhold til rollens privilegier, og succesen for hver forbindelse til databaseklyngen bestemmes af den rolle, man godkender til. Det er vigtigt at få styr på rollestyring på grund af dens betydning inden for så mange kerneoperationer.



Rolleattributter

Rolleattributter er flag på selve rollen, der bestemmer nogle af de kerneprivilegier, den har på databaseklyngeniveauet. Disse kan indstilles, når rollen oprindeligt oprettes, eller ændres til enhver tid af enhver rolle med de relevante attributter (SUPERUSER eller CREATEROLE i dette tilfælde).

Attributter, der kan anvendes på en rolle, omfatter:

  • LOGIN :Tillader brugere at oprette forbindelse til databaseklyngen ved hjælp af denne rolle. CREATE USER kommando tilføjer automatisk denne attribut, mens CREATE ROLE kommandoen ikke.
  • SUPERUSER :Tillader rollen at omgå alle tilladelsestjek undtagen retten til at logge ind. Kun andre SUPERUSER roller kan oprette roller med denne attribut.
  • CREATEDB :Tillader rollen at oprette nye databaser.
  • CREATEROLE :Tillader rollen at oprette, ændre og slette andre roller. Denne attribut giver også rollen mulighed for at tildele eller ændre rollemedlemskab. En undtagelse er, at en rolle med CREATEROLE attribut kan ikke ændre SUPERUSER roller uden også at have SUPERUSER attribut.
  • REPLICATION :Tillader rollen at starte streamingreplikering. Roller med denne attribut skal også have LOGIN attribut.
  • PASSWORD :Tildeler en adgangskode til rollen, der skal bruges med password eller md5 autentificeringsmekanismer. Denne attribut tager en adgangskode i anførselstegn som et argument direkte efter attributnøgleordet.
  • INHERIT :Bestemmer, om rollen arver privilegierne for roller, den er medlem af. Uden INHERIT , skal medlemmer bruge SET ROLE at skifte til den anden rolle for at få adgang til disse eksklusive privilegier. Denne attribut er som standard indstillet til nye roller.

Du kan finde ud af mere om rolleattributter ved at tjekke PostgreSQL's dokumentation om rolleattributter og CREATE ROLE kommando.



Hvad er en superuser rolle?

Som nævnt kort ovenfor, et særligt privilegium kaldet superuser tillader ubegrænset administrativ adgang til databaseklyngen. Dette ligner root konto i Linux og Unix-lignende operativsystemer, men på databaseniveau.

Der skal altid være mindst én rolle med superuser privilegier i hver databaseklynge. Den indledende superuser konto oprettes under installationsprocessen. Navnet på den indledende superuser konto kan variere afhængigt af installationsprocessen, men oftest kaldes denne konto for postgres .

Det anbefales ikke at udføre dit daglige arbejde med en konto med superuser privilegier, både på grund af dets potentiale for destruktive handlinger og også for at minimere chancen for at kompromittere en konto med bred adgang. I stedet bør brugere det meste af tiden bruge konti dedikeret til de specifikke funktioner eller dataobjekter, de arbejder med, kun ved at bruge superuser konti, når der kræves mere kraftfuld adgang.



Kontrol af eksisterende rolleattributter

Nu hvor du har en bred idé om, hvad rolleattributter er, og hvilke typer privilegier de tillader, bør du lære, hvordan du finder de attributter, der anvendes på roller i hele PostgreSQL. Denne sektion vil vise dig nogle kommandoer, der hjælper dig med at finde de egenskaber, der er sat på roller generelt og specifikt på din egen nuværende rolle.


Visning af alle databaseroller og deres attributter

Der er et par forskellige måder at kontrollere de attributter, der anvendes på roller i hele systemet.

Hvis du bruger psql kommandolinjeklient, kan du drage fordel af nogle nyttige metakommandoer, som giver dig mulighed for at få oplysninger om rolleattributter uden en forespørgsel.

\du meta-kommando viser alle roller og deres attributter:

\du
                                   List of roles Role name |                         Attributes                         | Member of-----------+------------------------------------------------------------+----------- postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

I dette tilfælde er postgres rolle er standardrollen med superuser privilegier konfigureret for denne databaseklynge.

Den tilsvarende SQL til listeroller (kan findes ved at sende -E eller --echo-hidden flag, når du starter psql ) er:

SELECT r.rolname, r.rolsuper, r.rolinherit,  r.rolcreaterole, r.rolcreatedb, r.rolcanlogin,  r.rolconnlimit, r.rolvaliduntil,  ARRAY(SELECT b.rolname        FROM pg_catalog.pg_auth_members m        JOIN pg_catalog.pg_roles b ON (m.roleid = b.oid)        WHERE m.member = r.oid) as memberof, r.rolreplication, r.rolbypassrlsFROM pg_catalog.pg_roles rWHERE r.rolname !~ '^pg_'ORDER BY 1;

En lignende forespørgsel, der giver oplysninger om rolleattributter (uden rollemedlemskabskomponenten) er nedenfor. Vi bruger psql meta-kommando \x on for at udskrive resultaterne lodret for bedre læsbarhed her:

-- turn on vertical display\x onSELECT * FROM pg_roles WHERE rolname !~ '^pg_';-- turn off vertical display\x off
-[ RECORD 1 ]--+---------rolname        | postgresrolsuper       | trolinherit     | trolcreaterole  | trolcreatedb    | trolcanlogin    | trolreplication | trolconnlimit   | -1rolpassword    | ********rolvaliduntil  | rolbypassrls   | trolconfig      | oid            | 10

Hvis du kun er interesseret i at se, hvilke roller der har superuser attribut, kan du bede om en liste eksplicit:

SELECT rolname FROM pg_roles WHERE rolsuper;
 rolname---------- postgres(1 row)

Alternativt kan du liste alle brugere og deres superuser status for et mere komplet billede:

SELECT usename,usesuper FROM pg_user;
 usename  | usesuper----------+---------- postgres | t user1    | f(2 rows)

Den samme information kan hentes ved hjælp af PostgreSQL's "rolle"-paradigme i stedet for dens (nogle gange tvetydige) "bruger"-overlay med denne lidt længere forespørgsel i stedet:

SELECT rolname,rolsuper FROM pg_roles WHERE rolname !~ '^pg_';
 rolname  | rolsuper----------+---------- postgres | t user1    | f(2 rows)


Angivelse af dine egne attributter

Hvis du vil finde egenskaberne for den rolle, du bruger i øjeblikket, kan du nemt filtrere outputtet.

Når du bruger psql meta-kommandoer, kan du bruge USER variabel, som vil blive erstattet med den aktuelle tilsluttede rolle. psql bruger kolon (: ) for at interpolere variable:

\du :USER
                                   List of roles Role name |                         Attributes                         | Member of-----------+------------------------------------------------------------+----------- postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

For at få en liste, der viser værdierne for alle mulige rolleattributter, kan du bruge en forespørgsel, der sammenligner rollenavnet med værdien returneret af CURRENT_ROLE PostgreSQL funktion. Igen bruger vi lodret output for læsbarhed:

-- First, turn on vertical output\x onSELECT * FROM pg_roles WHERE rolename = CURRENT_ROLE;-- Change back to normal output\x off
-[ RECORD 1 ]--+---------rolname        | postgresrolsuper       | trolinherit     | trolcreaterole  | trolcreatedb    | trolcanlogin    | trolreplication | trolconnlimit   | -1rolpassword    | ********rolvaliduntil  |rolbypassrls   | trolconfig      |oid            | 10

For bare at tjekke om din nuværende rolle har superuser privilegier, kan du skrive:

SHOW is_superuser;
 is_superuser-------------- on(1 row)


Tjek, om du har rettigheder til rollestyring

For at lave, ændre eller slette roller skal du enten have superuser eller CREATEROLE privilegier.

For at kontrollere, hvilke roller i systemet der har rollestyringsrettigheder, skal du skrive:

SELECT rolname as "Users who can manage roles" FROM pg_roles WHERE rolsuper OR rolcreaterole;
 Users who can manage roles---------------------------- postgres(1 rows)

Hvis du bare vil vide, om din nuværende rolle har rettigheder til rollestyring, kan du i stedet bruge:

SELECT 'Yes' AS "Can I manage roles?" FROM pg_roles WHERE rolname = :'USER' AND (rolsuper OR rolcreaterole);
 Can I manage roles?--------------------- Yes(1 row)



Oprettelse af roller

Når du har bekræftet, at du har rettigheder til rolleadministration, kan du begynde at oprette, ændre eller fjerne roller i PostgreSQL.

En mulighed for at angive rolleattributter er at erklære dem på det tidspunkt, hvor du opretter rollen. Dette giver dig mulighed for at indstille startbetingelserne for rollen, men du kan stadig ændre dem efterfølgende, hvis du vil ændre rollens adgangsniveau. Du kan finde flere oplysninger om CREATE ROLE kommando, som vi vil bruge til at gøre dig bekendt med den grundlæggende syntaks.

En måde at oprette en rolle på er fra kommandolinjen. PostgreSQL inkluderer en createuser kommando, der vil oprette en rolle i databaseklyngen med LOGIN privilegier.

Den generelle syntaks er:

createuser <options> <rolename>

For eksempel at oprette en rolle ved navn admin med superuser privilegier, mens du beder om en adgangskode, kan du skrive:

createuser --superuser admin

Du vil derefter være i stand til at logge ind med admin konto i henhold til godkendelsesmetoderne beskrevet i pg_hba.conf fil.

For at oprette roller ved hjælp af SQL , den generelle syntaks ser sådan ud:

CREATE ROLE <role>;

Attributter kan defineres ved at angive dem efter rollenavnet ved hjælp af WITH :

CREATE ROLE <role> WITH <options>;

For eksempel at oprette en rolle ved navn user1 der kan logge ind med adgangskoden secretpassword , kan du skrive:

CREATE ROLE "user1" WITH LOGIN PASSWORD 'secretpassword';

For i stedet at oprette en rolle med superuser privilegier (du skal også være superuser for at udføre denne kommando), som ikke kan login (brugeren skal bruge SET ROLE for at skifte til denne rolle), kan du skrive:

CREATE ROLE "user2" WITH SUPERUSER;


Ændring af eksisterende roller

For at ændre attributterne for eksisterende roller kan du bruge ALTER ROLE kommando i stedet. Som med oprettelse af rolle, skal din nuværende rolle også have enten superuser eller CREATEROLE privilegier. Brugere, der ikke har disse rettigheder, kan kun bruge ALTER ROLE kommando for at ændre deres egen adgangskode.

Ændring af roller giver dig mulighed for at ændre de attributter, der er tildelt en rolle efter oprettelsen. De samme attributter, der er nævnt i afsnittet om oprettelse af rolle, kan bruges med ALTER ROLE syntaks. En forskel er, at hver attributtype kan negeres ved at tilføje NO præfiks. For at tillade en rolle at logge ind på databaseklyngen, kan du f.eks. give den LOGIN attribut. For at fjerne denne evne skal du ændre rollen ved at angive NOLOGIN .

ALTER ROLE kommandoen ændrer kun attributterne er dem, der udtrykkeligt er nævnt. Med andre ord, ALTER ROLE kommando angiver ændringer til attributter, ikke et komplet sæt af nye attributter.

For at tillade user2 rolle for at logge ind på databaseklyngen, kan du skrive:

ALTER ROLE "user2" WITH LOGIN;

Husk på, at selvom dette muliggør muligheden for at logge ind, styres de tilladte godkendelsesmetoder stadig af pg_hba.conf fil.

Hvis du vil have user2 for at være i stand til at logge ind, oprette roller og oprette databaser i stedet, kan du angive disse tre attributter, adskilt af mellemrum:

ALTER ROLE "user2" WITH LOGIN CREATEROLE CREATEDB;

For at tilbagekalde superuser status fra en rolle (du kan kun udføre denne kommando ved at bruge en anden superuser rolle), skriv:

ALTER ROLE "user2" WITH NOSUPERUSER;

For at ændre adgangskoden til en rolle, kan du skrive følgende (alle roller skal kunne udføre denne kommando på deres egen rolle, uanset CREATEROLE eller superuser privilegier):

ALTER ROLE <role> WITH PASSWORD '<password>';

Selvom ovenstående kommando virker, hvis det er muligt, er det en bedre idé at bruge psql meta-kommando til at ændre adgangskoder. psql kommandoen beder automatisk om en adgangskode og krypterer den, før den sendes til serveren. Dette hjælper med at undgå at lække følsomme data i logfiler.

Du kan ændre en rolles adgangskode med psql ved at skrive følgende

-- To change your own password\password-- To change the password for another role\password <role>

Du kan også bruge ALTER ROLE kommando for at omdøbe en rolle:

ALTER ROLE <role> RENAME TO <newrole>

Husk, at du ikke kan omdøbe din nuværende sessionsrolle.



Sletning af roller

Sletning af en eksisterende rolle følger et lignende mønster som de tidligere kommandoer. Igen skal du have CREATEROLE eller superuser privilegier til at udføre disse kommandoer.

En komplicerende faktor er, at roller ikke kan fjernes, hvis de stadig refereres af objekter i databasen. Det betyder, at du skal slette eller overføre ejerskab af alle objekter, som rollen ejer. Bagefter skal du også tilbagekalde eventuelle yderligere privilegier rollen har på databaseobjekter.

En detaljeret forklaring på, hvordan man på passende vis gentildeler og sletter privilegier, er leveret af Erwin Brandstetter på Database Administrators Stack Exchange-webstedet. Den samme proces bruges nedenfor.

Først kan du omtildele alle rollens ejede objekter ved hjælp af REASSIGNED OWNED kommando. For eksempel, hvis du forbereder at slette user2 rolle, kan du tildele dens objekter til postgres rolle ved at skrive:

REASSIGN OWNED BY "user2" TO "postgres";

Nu ejes objekterne af postgres , kan vi bruge DROP OWNED kommando til at tilbagekalde alle de andre privilegier, vi har fået tildelt på objekter. Denne kommando sletter også alle objekter, vi ejer, men da vi lige har overført dem til postgres rollen, user2 rollen har ikke længere nogen ejede objekter. På grund af dette vil kommandoen kun tilbagekalde nogen af ​​rollens ekstra privilegier:

DROP OWNED BY "user2";

Uden DROP OWNED genvejen ovenfor, skal du udføre REVOKE ALL PRIVILEGES på hvert enkelt objekt eller objekttype, som rollen har rettigheder til.

Når du har tilbagekaldt alle tilknyttede privilegier, kan du fjerne rollen ved at skrive:

DROP ROLE "user2";


Log ind med psql

Når du har konfigureret en ny rolle og har konfigureret godkendelsesdetaljer ved hjælp af pg_hba.conf fil, kan du logge ind på databaseklyngen ved hjælp af din nye rolle. psql kommandolinjeklienten giver en nem måde at gøre dette på.

Som standard er psql antager, at du vil oprette forbindelse ved hjælp af en rolle, der matcher dit operativsystems brugernavn. Så hvis du er logget ind på din computer som john , psql vil antage, at du vil prøve at oprette forbindelse til databasen ved hjælp af en rolle, der også kaldes john .

For at tilsidesætte denne adfærd kan du videregive -U eller --username= mulighed. For eksempel, hvis du vil logge ind på en rolle kaldet kerry , kan du skrive:

psql -U kerry

Succesen med psql kommandoen vil afhænge af eksistensen af ​​kerry rolle, tilgængeligheden af ​​den server, du forsøger at oprette forbindelse til, og de godkendelsesregler, der er defineret på serveren.



Skift til en anden rolle under en session

Nogle gange vil du måske midlertidigt adoptere privilegierne og identiteten for en anden rolle, du har adgang til. Dette er for eksempel nødvendigt, hvis du ønsker at opnå privilegierne for en rolle, du er medlem af, hvis din nuværende rolle ikke har INHERIT attribut.

For at forstå, hvordan dette fungerer, skal du kende den terminologi, PostgreSQL bruger til at kategorisere aktive roller:

  • Sessionsrolle :En sessionsrolle er den rolle, du loggede ind med under din første forbindelse til PostgreSQL-databaseklyngen. Det angiver dine indledende privilegier og bestemmer din adgang til systemet. Denne rolle skal have LOGIN attribut.
  • Nuværende rolle :I modsætning hertil er den nuværende rolle den rolle, du i øjeblikket fungerer som. De rettigheder, der er knyttet til den aktuelle rolle, uanset om de er sat direkte eller nedarvet fra andre roller, bestemmer de handlinger, du har tilladelse til at udføre, og de objekter, du har adgang til.

Du kan se din session og aktuelle rolleværdier ved at skrive:

SELECT SESSION_USER, CURRENT_USER;
 current_user | session_user--------------+-------------- postgres     | postgres(1 row)

Mens den eneste måde at ændre din sessionsrolle på er at starte en ny forbindelse med en anden rolle, kan du ændre din nuværende rolle ved at bruge SET ROLE kommando. SET ROLE kommando bruges til midlertidigt at fungere som en anden rolle. Kommandoen tager også valgfrit følgende modifikatorer:

  • SESSION :Standardindstillingen. Dette forårsager SET ROLE kommando for at påvirke hele databasesessionen.
  • LOCAL :Denne modifikator får kommandoen til kun at ændre rollen for den aktuelle transaktion.

For at ændre den aktuelle rolle til user2 rolle (for resten af ​​sessionen), skriv:

SET ROLE "user2";

Hvis du tjekker din session og aktuelle rolleværdier, vil du se, at den aktuelle rolleværdi er ændret:

SELECT SESSION_USER, CURRENT_USER;
 current_user | session_user--------------+-------------- user2        | postgres(1 row)

Alle dine handlinger vil nu bruge user2 rolle som deres kontekst.

For at skifte tilbage til den sessionsrolle, du tidligere havde brugt, kan du skrive:

SET ROLE NONE;

Et alternativ, der opnår samme resultat, er:

RESET ROLE;


Konklusion

PostgreSQL's system af roller, rolleattributter, bevillinger og autentificering skaber et fleksibelt system, der giver administratorer mulighed for effektivt at administrere tilladelser og databaseadgang. Denne vejledning beskrev præcis, hvad roller er, og hvordan de omfatter en bred vifte af use cases. Den dækkede også, hvordan man opretter, ændrer og sletter roller og administrerer de rolleattributter, der bestemmer deres globale muligheder. Det er nødvendigt at forstå, hvordan man administrerer disse identiteter, for at sikre dine databaser og give brugbar adgang til dine legitime brugere.




  1. DB-kontrol nærmer sig sin død

  2. WHERE-sætning på SQL Server Tekstdatatype

  3. Sådan får du aktuelle ugedata i MySQL

  4. Android SQLite Journal-adfærd ændret?