sql >> Databáze >  >> RDS >> PostgreSQL

Správa rolí a atributů rolí v PostgreSQL


Ú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ímco CREATE 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 s CREATEROLE atribut nemůže změnit SUPERUSER 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 s password nebo md5 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. Bez INHERIT , členové musí používat SET 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.




  1. Jak zálohovat databáze MySQL pomocí AutoMySQLBackup

  2. Porovnání dat Oracle bylo přerušeno kvůli letnímu času

  3. SQLite - Vyberte Data

  4. Vyplnění položky stromu skupinou záznamů v Oracle Forms