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, mensCREATE ROLE
kommandoen ikke.SUPERUSER
:Tillader rollen at omgå alle tilladelsestjek undtagen retten til at logge ind. Kun andreSUPERUSER
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 medCREATEROLE
attribut kan ikke ændreSUPERUSER
roller uden også at haveSUPERUSER
attribut.REPLICATION
:Tillader rollen at starte streamingreplikering. Roller med denne attribut skal også haveLOGIN
attribut.PASSWORD
:Tildeler en adgangskode til rollen, der skal bruges medpassword
ellermd5
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. UdenINHERIT
, skal medlemmer brugeSET 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årsagerSET 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.