PostgreSQL (25) - Administrace skupin a uživatelů

PostgreSQL Od počátku seriálu o PostgreSQL jsme se přehoupli přes řadu 8.1, která změnila systém vytváření uživatelů a je zapotřebí se seznámit i se systémem vytváření skupin a s pokročilejší správou uživatelů. Ale protože se vyskytují i servery, jejichž správci jsou konzervativní v nasazování nových verzí, pokusíme se shrnout i odlišnosti starších verzí.

12.1.2007 10:00 | MaReK Olšavský | přečteno 19117×

Vytvoření a správa skupin

Vytváření skupin uživatelů může předcházet vytvoření jednotlivých uživatelů, proto jej předřazuji samotnému vytvoření uživatelů. Práva k jednotlivým databázím a tabulkám totiž lze přiřazovat jednotlivým skupinám, i uživatelům, ale je mnohem přehlednější vytvořit skupinu, která má garantované určité přístupy, do níž se pak přidávají nově vytvoření uživatelé, než vytvářet uživatele mimo skupiny a těm pak jednotlivě přiřazovat potřebná práva. Je rozdíl mezi verzemi před 8.0, včetně, a v tom, jaké jsou změny od řady 8.1. To jak je systém přepracován od verze 8.1 naleznete v odstavcích dále a tuto část textu můžete přeskočit.

Nová skupina uživatelů se vytváří pomocí příkazu CREATE GROUP jmeno_skupiny [[WITH] volba [dalsi_volba]], kde volby a parametry jsou následující (ve verzi 7.4 nejsou tyto volby obsaženy):

-- ve verzi 8.0
SYSID gid
USER uzivatelske_jmeno [, dalsi_uzivatel [, ...]]

Jedinými parametry jsou číslo skupiny (gid), které pokud nezadáte bude vygenerováno automaticky a členové skupiny, které však můžete přidávat později pomocí ALTER GROUP.

Například při tvorbě účetního systému pro přístup ke klíčovým datům, při rozdělení na různých činností, které je běžné ve velkých firmách, budete mít skupiny správců, perzonalistů a účetních (i ty lze rozdělit na mzdové a finanční), do kterých pak budete přiřazovat jednotlivé uživatele, kteří pak budou mít přístup definovaný pouze k určitým databázím, tabulkám, či pohledům.

Změny ve skupinách se realizují pomocí příkazu ALTER USER ve třech možných variantách.

-- pridani jednoho nebo vice uzivatelu do skupiny jmeno
ALTER GROUP jmeno ADD USER uzivatel1 [, ...]
-- odebrani jednoho nebo vice uzivatelu ze skupiny jmeno
ALTER GROUP jmeno DROP USER uzivatel1 [, ...]
-- prejmenovani skupiny, toto smi udelat pouze vlastnik db
ALTER GROUP jmeno RENAME TO nove_jmeno

Pro smazání skupiny je, nejjednodušší a nejkratší, příkaz DROP GROUP jmeno.

Od verze 8.1 jsou skupiny v tomto pojetí zrušeny, nejedná se o SQL standard, a je povoleno vytvářet pouze uživatele/role.

Vytváření a správa uživatelů

Stále platí, že pro vytvoření prvního uživatele musíte být přihlášeni jako hlavní uživatel postgres, a to ať z konzole/terminálu, nebo v rámci SQL příkazu, ale už zmizela jedna menší nelogičnost v právech vytváření uživatelů. Protože se snažím v seriálu postihnout vlastnosti řady 7 i aktuální 8, pokusíme se v tomto díle vysvětlit obě verze.

Z terminálu vytvoříte uživatele, pochopitelně, máte-li k tomu patřičná práva, příkazem createuser, jehož přesné parametry naleznete buď vyvoláním nápovědy pomocí createuser --help, případně s přesným popisem pomocí man createuser, eventuálně v dokumentaci na stránkách PostgreSQL serveru, samozřejmě, že musíte otevřít dokumentaci k té verzi PgSQL, kterou používáte. Alespoň bodově si popíšeme změny:

Ostatní parametry zůstaly beze změny. Pokud nezadáte některý z podstatných parametrů, jako například má-li být superuživatelem, právo vytvářet databáze a další běžné uživatele, utilita createuser se interaktivně vyptá na zbylé parametry.

Konzolový příkaz createuser má svůj ekvivalent i v SQL příkazu, protože může být velmi užitečné moci vytvořit dalšího uživatele z aplikace, což by použitím konzolové utility nemuselo být vůbec snadné. Tento příkaz je CREATE USER jmeno_uzivatele [WITH volba [dalsi_volba]]. Naprostým ekvivalentem a používaným se stejnými parametry je příkaz CREATE ROLE jmeno_uzivatele [WITH volba [dalsi_volba]]. Parametry příkazu jsou víceméně samodokumentační, čiže by měl většině uživatelů postačit jejich prostý výpis, eventuálně lze nahládnout do dokumentace na stránkách PostgreSQL, v tomto díle popíšu jen ty volby, kde by mohli být nejasnosti.

Ve verzích 8.0 a starších byly parametry:

SYSID uid 
CREATEDB | NOCREATEDB
CREATEUSER | NOCREATEUSER
IN GROUP groupname [, ...]
[ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password'
VALID UNTIL 'abstime'

A od verze 8.1 jsou platné parametry:

SUPERUSER | NOSUPERUSER
CREATEDB | NOCREATEDB
CREATEROLE | NOCREATEROLE
CREATEUSER | NOCREATEUSER
INHERIT | NOINHERIT
LOGIN | NOLOGIN
CONNECTION LIMIT limit_spojeni
[ ENCRYPTED | UNENCRYPTED ] PASSWORD 'heslo'
VALID UNTIL 'casovy_udaj'
IN ROLE role [, ...]
IN GROUP role [, ...]
ROLE role [, ...]
ADMIN role [, ...]
USER role [, ...]
SYSID uid

Opět není třeba zadávat všechny parametry, leč nebudete na vlastnosti nového uživatele interaktivně dotázáni, ale budou použity defaultní volby, které jsou defaultní stejně jako v případě konzolové varianty. Jak vidíte z výpisu možných parametrů, které jsou použitelné v SQL příkazu, tak možnosti jsou poněkudsi širší. Některé parametry si popíšeme v krátkém seznamu.

Již z popisu přepínačů je vidět, že role zcela nahrazují původní model uživatelů a skupin uživatelů. Pro někoho může být pochopitelnější a průhlednější původní systém, ale do Postgresu se dostávají takto veliké změny po velmi zralé úvaze, čiže se bude jednat opravdu o značně lepší systém ve správě uživatelů, především je vidět jeho lepší variabilita. Podstatné je, že od verze 8.1 je zapotřebí přestat uvažovat o uživatelích a skupinách, ale uvažovat o rolích, které jsou i ANSI SQL standardem.

Změna nastavení uživatelů se provádí příkazem ALTER USER jmeno [[WITH] volba [, dalsi_volba]], od verze 8.1, v terminologii rolí, se využívá funkce ALTER ROLE jmeno [[WITH] volba [, dalsi volba]] Volby jsou téměř stejné jako při vytváření nového uživatele, jen jich několik chybí:

Do verze 8.0, včetně, jsou parametry:

CREATEDB | NOCREATEDB
| CREATEUSER | NOCREATEUSER 
| [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password' 
| VALID UNTIL 'abstime'

Od verze 8.1 platí následující parametry:

SUPERUSER | NOSUPERUSER
CREATEDB | NOCREATEDB
CREATEROLE | NOCREATEROLE
CREATEUSER | NOCREATEUSER
INHERIT | NOINHERIT
LOGIN | NOLOGIN
CONNECTION LIMIT limit_spojeni
[ENCRYPTED | UNECRYPTED] PASSWORD 'heslo'
VALID_UNTIL 'casovy_udaj'

Přiřazení práv

V předchozích odstavcích jste se seznámili s vytvářením jednotlivých uřivatelů a skupin v PostgreSQL, nyní je zapotřebí vytvořeným rolím přiřadit práva na objekty v databázi. K delegování práv slouží příkaz GRANT, s patřičnými parametry. Pokud na PostgreSQL přecházíte z MySQL, tento příkaz pravděpodobně znáte. Výpis všech parametrů příkazu naleznete

v dokumentaci na stránkách PostgreSQL, nebudu jej zde uvádět z prostorových důvodů, spíše bude vhodnější si vše ukázat na příkladech, které se budou z pochopitelných důvodů vztahovat k verzi 8.1 a novějším.

GRANT poslouží k delegování práv k databázovým objektům pro jednotlivé role, ale pokud chceme tato práva odebrat, alespoň některá z nich, je třeba použít příkazu REVOKE, který je opět popsán v původní dokumentaci na stránkách PostgreSQL, parametrů má poměrně mnoho.

Příklad

-- hlavni role, ktera mi zastresuje cele mzdy
CREATE ROLE amzdy NOLOGIN ENCRYPTED PASSWORD '123mzdy';

-- podrizene role
CREATE ROLE pam NOLOGIN ENCRYPTED PASSWORD 'derf' IN ROLE amzdy;
CREATE ROLE admin NOLOGIN ENCRYPTED PASSWORD 'fred' IN ROLE amzdy;

-- Nyni uzivatele
CREATE ROLE marek2 LOGIN ENCRYPTED PASSWORD 'm123' IN ROLE pam, admin;
  -- sebe davam jako (hlavniho) spravce do vsech roli
CREATE ROLE jarsuk LOGIN ENCRYPTED PASSWORD 'jaro123';

-- zapomenuta role i s uzivateli
CREATE ROLE mzdy NOLOGIN ENCRYPTED PASSWORD 'vyplaty' IN ROLE amzdy ROLE
  jarsuk, marek2;

-- sobe pridelim veskera prava
GRANT ALL ON DATABASE amzdy TO marek2 WITH GRANT OPTION;

-- k mzdovym tabulkam (casti) pridam prava pro role mzdy a amzdy
 GRANT SELECT, INSERT, UPDATE, DELETE ON prac, nemd, mzdp, ucty TO amzdy, mzdy;
 
-- uzivateli jarsuk odeberu prava mazani a prepisu
REVOKE DELETE, UPDATE ON prac, nemd, mzdp, ucty FROM jarsuk;

Závěr

V tomto díle jsem si dovolil udělat menší odbočku, která vznikla díky změně z PostgreSQL 7.2 na 8.1 na jednom serveru, o který se starám. Zpočátku se mi změna systému, od jednoduché terminologie skupin a uživatelů k rolím, příliž nelíbila, ale po vytvoření pár desítek rolí, z celkového počtu 120, jsem uznal, že tento systém je mnohem průhlednější a pružnější.

Příště se zase vrátíme k běžné manipulaci s daty a bude již načase otevřít možnosti programování na straně databáze, tj. uděláme krok k vícevrstvým aplikacím.

Online verze článku: http://www.linuxsoft.cz/article.php?id_article=1398