Úvod
PostgreSQL používá různé mechanismy k implementaci ověřování, autorizace a vlastnictví objektů v databázových klastrech. Jádrem z nich je koncept rolí.
PostgreSQL role jsou kombinací nápadů uživatelů a skupin do jediné flexibilní entity. Jedná se o osobu, kterou si uživatel osvojuje v databázovém systému, je entitou, pomocí které autentizační systém přijímá nebo odmítá připojení, a je předmětem pravidel správy oprávnění všech rozsahů.
Tato příručka se bude zabývat tím, co jsou role a jak je spravovat v databázovém clusteru PostgreSQL. Konkrétněji se tato příručka bude zabývat správou rolí ve vztahu k atributům rolí. Chcete-li získat širší přehled o tom, jak role zapadají do širšího obrazu, podívejte se na úvod do průvodce ověřováním a autorizací. Chcete-li se dozvědět, jak změnit oprávnění rolí u konkrétních databázových objektů, prohlédněte si naši příručku o udělení rolí.
Co jsou role?
V PostgreSQL je role seskupením specifické sady schopností, oprávnění a „vlastněných“ entit. Místo toho, aby měl PostgreSQL odlišné koncepty „uživatelů“ a „skupin“, používá k reprezentaci obou těchto myšlenek role. Role může odpovídat jednotlivé osobě v reálném světě, nebo může fungovat jako skupina s určitým přístupem, jehož členy se mohou stát další role.
Role jsou kotevním bodem v PostgreSQL, který určuje, na koho se autentizační a autorizační zásady vztahují. Jakákoli politika, která neplatí univerzálně, vyžaduje pojem identity k definování toho, koho omezit a koho povolit. V PostgreSQL je tato identita reprezentována rolemi.
Autentizační systém PostgreSQL má řadu různých komponent, z nichž každá je svázána s rolí. Aby mohly být role použity pro počáteční připojení k databázovému clusteru, musí mít nejprve LOGIN
sada atributů. Samotná autentizační pravidla jsou definována v hostitelském konfiguračním souboru s názvem pg_hba.conf
. Každé pravidlo definuje metody autentizace, které mohou být omezeny na jednotlivé role. Pro role, které jsou nakonfigurovány pro ověřování heslem, musí mít nastaven atribut hesla, aby systém mohl ověřit dodané uživatelské heslo.
Z hlediska autorizace jsou role definovány na úrovni databázového clusteru, což v PostgreSQL znamená, že jsou sdíleny mezi databázemi. Protože role zahrnují databáze, autorizační systém řídí úroveň přístupu, kterou má každá role ke každé databázové entitě. Protože role mohou představovat skupiny lidí, existuje velká flexibilita v tom, jak lze konfigurovat přístup.
Role jsou také zásadní pro koncept vlastnictví objektů v PostgreSQL. Každá databáze a tabulka má například přesně jednu roli nakonfigurovanou jako vlastník. Jiní než superusers
, role vlastníka je jedinou rolí, která může upravit nebo odstranit skutečný objekt.
Stručně řečeno, role jsou jádrem většiny praktických databázových operací. Jejich flexibilita jim umožňuje fungovat jako uživatelské identifikátory i třídy uživatelů. Každá akce v databázovém clusteru je kontrolována s ohledem na oprávnění role a úspěšnost každého připojení k databázovému clusteru je určena rolí, ke které se člověk autentizuje. Je důležité dobře ovládat správu rolí, protože je důležitá v tolika základních operacích.
Atributy role
Atributy role jsou příznaky na samotné roli, které určují některá základní oprávnění, která má na úrovni databázového klastru. Ty lze nastavit při prvním vytvoření role nebo kdykoli změnit kteroukoli rolí s příslušnými atributy (SUPERUSER
nebo CREATEROLE
v tomto případě).
Atributy, které lze na roli použít, zahrnují:
LOGIN
:Umožňuje uživatelům zpočátku se připojit k databázovému clusteru pomocí této role.CREATE USER
příkaz automaticky přidá tento atribut, zatímcoCREATE ROLE
příkaz ne.SUPERUSER
:Umožňuje roli obejít všechny kontroly oprávnění kromě práva přihlásit se. Pouze ostatníSUPERUSER
role mohou vytvářet role s tímto atributem.CREATEDB
:Umožňuje roli vytvářet nové databáze.CREATEROLE
:Umožňuje roli vytvářet, měnit a odstraňovat další role. Tento atribut také umožňuje roli přiřadit nebo změnit členství v roli. Výjimkou je role sCREATEROLE
atribut nemůže změnitSUPERUSER
role, aniž by měl takéSUPERUSER
atribut.REPLICATION
:Umožňuje roli zahájit streamovanou replikaci. Role s tímto atributem musí mít takéLOGIN
atribut.PASSWORD
:Přiřadí heslo roli, která bude použita spassword
nebomd5
autentizační mechanismy. Tento atribut přebírá heslo v uvozovkách jako argument přímo za klíčovým slovem atributu.INHERIT
:Určuje, zda role zdědí oprávnění rolí, kterých je členem. BezINHERIT
, členové musí používatSET ROLE
změnit na jinou roli a získat přístup k těmto exkluzivním oprávněním. Tento atribut je standardně nastaven pro nové role.
Více o atributech rolí se můžete dozvědět v dokumentaci PostgreSQL o atributech rolí a CREATE ROLE
příkaz.
Co je to superuser
role?
Jak bylo stručně zmíněno výše, speciální privilegium zvané superuser
umožňuje neomezený administrativní přístup k databázovému clusteru. Je to podobné jako root
účet v Linuxu a operačních systémech podobných Unixu, ale na úrovni databáze.
Vždy musí existovat alespoň jedna role s superuser
oprávnění v každém databázovém clusteru. Počáteční superuser
účet je vytvořen během procesu instalace. Jméno počátečního superuser
účet se může lišit v závislosti na procesu instalace, ale nejčastěji se tento účet nazývá postgres
.
Nedoporučuje se provádět každodenní práci pomocí účtu s superuser
privilegia, a to jak kvůli jeho potenciálu pro destruktivní akce, tak také kvůli minimalizaci možnosti ohrožení účtu s širokým přístupem. Místo toho by uživatelé většinou měli používat účty věnované konkrétním funkcím nebo datovým objektům, se kterými pracují, pouze pomocí superuser
účtů, když je vyžadován výkonnější přístup.
Kontrola existujících atributů rolí
Nyní, když máte širokou představu o tom, co jsou atributy rolí a jaké typy oprávnění umožňují, měli byste se naučit, jak najít atributy aplikované na role v PostgreSQL. Tato část vám ukáže některé příkazy, které vám pomohou najít atributy nastavené u rolí obecně a konkrétně u vaší vlastní aktuální role.
Výpis všech databázových rolí a jejich atributů
Existuje několik různých způsobů, jak zkontrolovat atributy aplikované na role v celém systému.
Pokud používáte psql
klient příkazového řádku, můžete využít některé užitečné meta-příkazy, které vám umožní získat informace o atributu role bez dotazu.
\du
meta-příkaz zobrazuje všechny role a jejich atributy:
\du
List of roles Role name | Attributes | Member of-----------+------------------------------------------------------------+----------- postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
V tomto případě postgres
role je výchozí role s superuser
oprávnění nakonfigurovaná pro tento databázový cluster.
Ekvivalentní SQL pro seznam rolí (zjistitelné předáním -E
nebo --echo-hidden
příznak při spouštění psql
) je:
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;
Podobný dotaz, který poskytuje informace o atributu role (bez komponenty členství v roli), je uveden níže. Používáme psql
meta-příkaz \x on
pro svislý výstup výsledků pro lepší čitelnost zde:
-- 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
Pokud vás zajímá pouze to, které role mají superuser
atribut, můžete požádat o seznam výslovně:
SELECT rolname FROM pg_roles WHERE rolsuper;
rolname---------- postgres(1 row)
Případně můžete uvést všechny uživatele a jejich superuser
stav pro úplnější obrázek:
SELECT usename,usesuper FROM pg_user;
usename | usesuper----------+---------- postgres | t user1 | f(2 rows)
Stejné informace lze získat pomocí paradigmatu „role“ PostgreSQL namísto jeho (někdy nejednoznačného) „uživatelského“ překrytí s tímto trochu delším dotazem:
SELECT rolname,rolsuper FROM pg_roles WHERE rolname !~ '^pg_';
rolname | rolsuper----------+---------- postgres | t user1 | f(2 rows)
Uvedení vlastních atributů
Pokud chcete najít atributy role, kterou aktuálně používáte, můžete výstup snadno filtrovat.
Při použití psql
meta-příkazy, můžete použít USER
proměnná, která bude nahrazena aktuální připojenou rolí. psql
používá dvojtečku (:
) k interpolaci proměnných:
\du :USER
List of roles Role name | Attributes | Member of-----------+------------------------------------------------------------+----------- postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
Chcete-li získat seznam s hodnotami všech možných atributů role, můžete použít dotaz porovnávající název role s hodnotou vrácenou CURRENT_ROLE
Funkce PostgreSQL. Opět používáme vertikální výstup pro čitelnost:
-- 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
Stačí zkontrolovat, zda má vaše aktuální role superuser
oprávnění, můžete zadat:
SHOW is_superuser;
is_superuser-------------- on(1 row)
Zkontrolujte, zda máte oprávnění ke správě rolí
Chcete-li vytvářet, měnit nebo mazat role, musíte mít buď superuser
nebo CREATEROLE
privilegia.
Chcete-li zkontrolovat, které role v systému mají oprávnění správy rolí, zadejte:
SELECT rolname as "Users who can manage roles" FROM pg_roles WHERE rolsuper OR rolcreaterole;
Users who can manage roles---------------------------- postgres(1 rows)
Pokud jen chcete vědět, zda má vaše aktuální role oprávnění pro správu rolí, můžete místo toho použít:
SELECT 'Yes' AS "Can I manage roles?" FROM pg_roles WHERE rolname = :'USER' AND (rolsuper OR rolcreaterole);
Can I manage roles?--------------------- Yes(1 row)
Vytváření rolí
Jakmile ověříte, že máte oprávnění pro správu rolí, můžete začít vytvářet, upravovat nebo odstraňovat role v PostgreSQL.
Jednou z možností, jak nastavit atributy role, je deklarovat je při vytváření role. To vám umožňuje nastavit počáteční podmínky pro roli, ale stále je můžete upravit poté, pokud chcete změnit úroveň přístupu role. Můžete najít další informace o CREATE ROLE
příkaz, který budeme používat k seznámení se základní syntaxí.
Jedním ze způsobů vytvoření role je z příkazového řádku. PostgreSQL obsahuje createuser
příkaz, který vytvoří roli v databázovém clusteru s LOGIN
privilegia.
Obecná syntaxe je:
createuser <options> <rolename>
Chcete-li například vytvořit roli s názvem admin
s superuser
privilegia během výzvy k zadání hesla, můžete napsat:
createuser --superuser admin
Poté se budete moci přihlásit pomocí admin
účet podle metod ověřování uvedených v pg_hba.conf
soubor.
Chcete-li vytvořit role pomocí SQL
, obecná syntaxe vypadá takto:
CREATE ROLE <role>;
Atributy lze definovat tak, že je zadáte za název role pomocí WITH
:
CREATE ROLE <role> WITH <options>;
Chcete-li například vytvořit roli s názvem user1
který se může přihlásit pomocí hesla secretpassword
, můžete napsat:
CREATE ROLE "user1" WITH LOGIN PASSWORD 'secretpassword';
Místo toho vytvořit roli pomocí superuser
oprávnění (musíte být také superuser
úspěšně provést tento příkaz), což nelze přihlášení (uživatel musí použít SET ROLE
pro změnu na tuto roli), můžete napsat:
CREATE ROLE "user2" WITH SUPERUSER;
Změna stávajících rolí
Chcete-li upravit atributy existujících rolí, můžete použít ALTER ROLE
místo toho příkaz. Stejně jako při vytváření role musí mít vaše aktuální role také buď superuser
nebo CREATEROLE
privilegia. Uživatelé, kteří tato oprávnění nemají, mohou používat pouze ALTER ROLE
příkaz ke změně vlastního hesla.
Změna rolí umožňuje po vytvoření změnit atributy přiřazené roli. Stejné atributy uvedené v části vytváření role lze použít s ALTER ROLE
syntax. Jeden rozdíl je v tom, že každý typ atributu lze negovat přidáním NO
předpona. Chcete-li například povolit roli přihlášení k databázovému clusteru, můžete jí přidělit LOGIN
atribut. Chcete-li tuto schopnost odstranit, změňte roli zadáním NOLOGIN
.
ALTER ROLE
příkaz pouze změní atributy, které jsou výslovně uvedeny. Jinými slovy, ALTER ROLE
příkaz určuje změny na atributy, nikoli na úplnou sadu nových atributů.
Chcete-li povolit user2
role pro přihlášení do databázového clusteru, můžete zadat:
ALTER ROLE "user2" WITH LOGIN;
Mějte na paměti, že i když to umožňuje možnost přihlášení, povolené metody ověřování jsou stále řízeny pg_hba.conf
soubor.
Pokud chcete user2
abyste se místo toho mohli přihlásit, vytvářet role a databáze, můžete zadat tyto tři atributy oddělené mezerami:
ALTER ROLE "user2" WITH LOGIN CREATEROLE CREATEDB;
Chcete-li zrušit superuser
stav z role (tento příkaz můžete provést pouze pomocí jiného superuser
role), zadejte:
ALTER ROLE "user2" WITH NOSUPERUSER;
Chcete-li změnit heslo pro roli, můžete zadat následující (všechny role by měly být schopny provést tento příkaz ve své vlastní roli, bez ohledu na CREATEROLE
nebo superuser
privilegia):
ALTER ROLE <role> WITH PASSWORD '<password>';
Ačkoli výše uvedený příkaz funguje, pokud je to možné, je lepší použít psql
meta-příkaz pro změnu hesla. psql
příkaz automaticky vyzve k zadání hesla a zašifruje jej před odesláním na server. To pomáhá zabránit úniku citlivých dat v protokolech.
Heslo role můžete změnit pomocí psql
zadáním následujícího
-- To change your own password\password-- To change the password for another role\password <role>
Můžete také použít ALTER ROLE
příkaz pro přejmenování role:
ALTER ROLE <role> RENAME TO <newrole>
Mějte na paměti, že svou aktuální roli relace nemůžete přejmenovat.
Odstranění rolí
Odstranění existující role se řídí podobným vzorem jako předchozí příkazy. Opět musíte mít CREATEROLE
nebo superuser
oprávnění provádět tyto příkazy.
Jedním komplikujícím faktorem je, že role nemohou být odstraněny, pokud na ně stále odkazují objekty v databázi. To znamená, že musíte odstranit nebo převést vlastnictví všech objektů, které role vlastní. Poté musíte také zrušit všechna další oprávnění, která má role k databázovým objektům.
Podrobné vysvětlení, jak vhodně znovu přiřadit a zrušit oprávnění, poskytuje Erwin Brandstetter na webu Database Administrators Stack Exchange. Stejný postup se používá níže.
Nejprve můžete změnit přiřazení všech objektů vlastněných rolí pomocí REASSIGNED OWNED
příkaz. Pokud se například chystáte smazat user2
můžete přiřadit jeho objekty do postgres
role zadáním:
REASSIGN OWNED BY "user2" TO "postgres";
Nyní jsou objekty ve vlastnictví postgres
, můžeme použít DROP OWNED
příkaz k odebrání všech ostatních oprávnění, která nám byla udělena k objektům. Tento příkaz také odstraní všechny objekty, které vlastníme, ale protože jsme je právě přenesli do postgres
role, user2
role již nemá žádné vlastněné objekty. Z tohoto důvodu příkaz odejme pouze jakákoli další oprávnění role:
DROP OWNED BY "user2";
Bez DROP OWNED
výše, budete muset provést REVOKE ALL PRIVILEGES
na každý jednotlivý objekt nebo typ objektu, ke kterému má role oprávnění.
Jakmile odeberete všechna přidružená oprávnění, můžete roli odebrat zadáním:
DROP ROLE "user2";
Přihlášení pomocí psql
Jakmile nakonfigurujete novou roli a nakonfigurujete podrobnosti ověřování pomocí pg_hba.conf
souboru, můžete se přihlásit do databázového clusteru pomocí své nové role. psql
klient příkazového řádku poskytuje snadný způsob, jak toho dosáhnout.
Ve výchozím nastavení psql
předpokládá, že se chcete připojit pomocí role, která odpovídá vašemu uživatelskému jménu operačního systému. Pokud jste tedy přihlášeni k počítači jako john
, psql
bude předpokládat, že se chcete pokusit připojit k databázi pomocí role, která se také nazývá john
.
Chcete-li toto chování přepsat, můžete předat -U
nebo --username=
volba. Pokud se například chcete přihlásit do role s názvem kerry
, můžete zadat:
psql -U kerry
Úspěch psql
příkaz bude záviset na existenci kerry
role, dostupnost serveru, ke kterému se pokoušíte připojit, a autentizační pravidla definovaná na serveru.
Změna na jinou roli během relace
Někdy možná budete chtít dočasně převzít oprávnění a identitu jiné role, ke které máte přístup. Je to například nutné, pokud chcete získat oprávnění role, které jste členem, pokud vaše aktuální role nemá INHERIT
atribut.
Abyste pochopili, jak to funguje, musíte znát terminologii, kterou PostgreSQL používá ke kategorizaci aktivních rolí:
- Role relace :Role relace je role, se kterou jste se přihlásili během počátečního připojení k databázovému clusteru PostgreSQL. Nastaví vaše počáteční oprávnění a určí váš přístup do systému. Tato role musí mít
LOGIN
atribut. - Aktuální role :Naproti tomu současná role je role, kterou aktuálně vystupujete. Oprávnění spojená s aktuální rolí, ať už nastavená přímo nebo zděděná z jiných rolí, určují akce, které smíte provádět, a objekty, ke kterým máte přístup.
Hodnoty relace a aktuální role můžete zobrazit zadáním:
SELECT SESSION_USER, CURRENT_USER;
current_user | session_user--------------+-------------- postgres | postgres(1 row)
I když jediným způsobem, jak změnit roli relace, je zahájit nové připojení pomocí jiné role, svou aktuální roli můžete změnit pomocí SET ROLE
příkaz. SET ROLE
příkaz se používá k dočasnému vystupování jako jiná role. Příkaz také volitelně přebírá následující modifikátory:
SESSION
:Výchozí nastavení. To způsobíSET ROLE
příkaz ovlivnit celou relaci databáze.LOCAL
:Tento modifikátor způsobí, že příkaz změní roli pouze pro aktuální transakci.
Chcete-li změnit aktuální roli na user2
role (pro zbytek relace), zadejte:
SET ROLE "user2";
Pokud zkontrolujete hodnoty relace a aktuální role, uvidíte, že se aktuální hodnota role změnila:
SELECT SESSION_USER, CURRENT_USER;
current_user | session_user--------------+-------------- user2 | postgres(1 row)
Všechny vaše akce budou nyní používat user2
role jako jejich kontext.
Chcete-li se vrátit zpět k roli relace, kterou jste dříve používali, můžete zadat:
SET ROLE NONE;
Alternativa, která dosáhne stejného výsledku, je:
RESET ROLE;
Závěr
Systém rolí, atributů rolí, grantů a autentizace PostgreSQL vytváří flexibilní systém, který správcům umožňuje efektivně spravovat oprávnění a přístup k databázi. Tato příručka popsala, co přesně role jsou a jak zahrnují širokou škálu případů použití. Zabýval se také tím, jak vytvářet, upravovat a odstraňovat role a spravovat atributy rolí, které určují jejich globální schopnosti. Pochopení toho, jak spravovat tyto identity, je nezbytné pro zabezpečení vašich databází a poskytnutí použitelného přístupu vašim legitimním uživatelům.