Postgre jogosultságok és a homály

Régebben már dolgoztam Postgre -vel, akkor ezt simán vettem. Most megint felcsaptam egyet (Squeeze PostgreSQL 8.7.14). Alapból úgy tűnik, csak a posgres felhasználónak van adatbázis létrehozási joga? Mint programozó nekem szükségem van arra, hogy ilyesmit csináljak.
Ugyanakkor, persze ha az ember állandóan "super root" szinten mozog, és így írja a programját, az ahhoz vezet, hogy aztán mint sima user az egész használhatatlan.
Tudtok valami jól átlátható, érthető leírást a PostgreSQL jogosultsági rendszeréről és hogy is kellene azt használni? - az angol jó.
Az "autentikus" dokumentáció homályos, zavarosnak tűnik - nekem.
(Nem kizárható, hogy bennem van a hiba.)

Hozzászólások

Vegyél fel egy role-t aminek van createdb joga.

Van egyébként createuser "parancs" is, annak is nézd meg a doksiját.
A Postgres wikiben levő dolgok egyébként igen jók.
Arra figyelj, hogy a megfelelő verziójú doksit nézd a felinstallált változathoz képest.
Én amúgy javasolnám, hogy 9.1-et tegyél fel.

--
Gábriel Ákos
http://i-logic.hu

Most akkor végül is az a jó, ha csak a 'postgres' felhasználó tud adatbázist kreálni?
Sajnos én megragadtam annál a szintél, hogy jogosultságokat maga a program osztja - sejtem hogy ez az SQL esetében, igencsak elavult, hiszen a hálózatról a 'sitnyik' jelszavával is bármit el lehet kavarni.

* Én egy indián vagyok. Minden indián hazudik.

Miért kellene az, hogy egy adatbázis-kezelőben, ahol több program egyszerre tárol adatokat, bárki tudjon adatbázist létrehozni? A MySQL-ben sincs így, szerencsére.

-----
"Egy jó kapcsolatban a társunkat az ő dolgában kell támogatni, nem a miénkben."
rand() a lelke mindennek! :)

A postgresql-ből egy rendszeren több verzió is megfér. Debian alatt legalábbis így van, de gondolom a többi is hasonló.

Egy verzión belül több instance-od lehet, amik külön-külön portokon figyelnek. Ezeknek a konfig állományaik az /etc/postgresql/_instance_ könyvtárban találhatók. Alapesetben a "main" instance-hoz kapcsolódsz (psql -l pl. kilistázza az adatbázisokat). Ez az 5432 porton figyel (postgresql.conf).

A pg_hba.conf szabályozza az instance-ra csatlakozást úgy helyileg (local) mint hálózaton keresztül. Játszadozz egy kicsit az állománnyal, illetve nézd meg a postgresql.org-on a doksit. Amit feljebb említettél az innen szépen be lehet állítani hogy menjen egy bizonyos felhasználó számára.

pgadmin3->Servers->teServered->Login Roles->New Login Role->Role privileges->Can create database

vagy már létező role esetén:

ALTER ROLE rolename CREATEDB;
ALTER ROLE rolename NOCREATEDB;

Pár napja írtam egy kollégámnak:

"PostgreSQL-ben egy plusz lépés kell az adatbázis létrehozásához. Nézd hogy csinálnék usert:

CREATE ROLE database_admin
NOSUPERUSER NOINHERIT CREATEDB CREATEROLE REPLICATION;

CREATE ROLE bela LOGIN
ENCRYPTED PASSWORD 'xxx'
NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;

GRANT database_admin TO bela;

Ez a postgresql-nél azt jelenti, hogy ha belépsz bela-ként simán, akkor NEM tudsz user-t (role-t) meg db-t menedzselni, hanem ilyeneket tudsz csinálni:

SET ROLE database_admin;
CREATE DATABSE test;
DROP DATABASE test;
SET ROLE bela;

Azaz külön kérned kell, hogy a database_admin role nevében szeretnél eljárni."

Igen! Ezt nagyon szépen köszönöm! Ezt tekinteném a javasolt használatnak - ezt kerestem a dokumentációkban - azaz hogy gondolták ők, hogy kéne a rendeltetés szerűen használni. De ők úgy tűnik elintézik azzal, hogy a "role" típusú koncepciót választották, implementálták.

Igen, valóban kilehet olvasni a dokumentációból, de nekem az SQL egy eszköz a sok közül és ha megkönnyítik a dolgom azt köszönöm!

"akkor NEM tudsz user-t (role-t) meg db-t menedzselni, hanem ..."
A db menedzselés alatt azt érted, hogy mondjuk table kreálni, vagy adatot módosítani?
(A "Zizi" kicsit zavaró - ez az anyósom beceneve :)

* Én egy indián vagyok. Minden indián hazudik.

"ha belépsz bela-ként simán, akkor NEM tudsz user-t (role-t) meg db-t menedzselni"

de ha kiadod a SET ROLE database_admin; parancsot, akkor már igen, tudsz.

Ez az egész role-os móka amire utalnak arról szól, hogy vannak role-ok, és ahhoz jogosultságok, pl.:
- be tud lépni
- tud csinálni adatbázist
- tud csinálni táblát

A belépési joggal rendelkező role-okat login role-oknak nevezik. Ilyen pl. a bela a fenti példában, aki be tud lépni meg tud táblát csinálni, de nem tud adatbázist csinálni.

A belépési joggal nem rendelkező role-okat group role-oknak szokták hívni. Ilyen pl. a database_admin role, aki nem tud belépni, de tud pl. táblát és adatbázist is csinálni.

A mechanizmus nem egészen ez, de úgy képzeld el, hogy a login role-okat bele tudod rakni a group role-okba. Ha egy login role benne van egy group role-ban, akkor nem biztos, hogy annak jogosultságait rögtön meg is örökli, viszont fel van jogosítva arra, hogy átváltson a group role-ra és annak a nevében járjon el. A példában ezt csinálja a SET ROLE.

A dologban annyi még két trükk van:
- egyrészt, hogy a login role-ok és a group role-ok nem különülnek el egymástól ilyen élesen, valójában csak simán role-ok vannak
- másrészt meg van lehetőség arra is, hogy egy group role egy joga öröklődjön (ne kelljen set role) a group gyerekeire és arra is, hogy ne öröklődjön, KIVÉVE a CREATE DATABASE jogot, mert az sosem örökíthető.

Jó kis rendszer ez :-D

"Jó kis rendszer ez :-D" - egyszerű és átlátható - az idő múlásával szövevényes, zavaros dolgok alakulhatnak ki, különösen, hogy nincs hozzá egy jól áttekinthető (GUI?) felület, amin le lehet ezt követni.
Még jó hogy a CREATE DATABASE nem örökölhető - kezdem felfogni.

* Én egy indián vagyok. Minden indián hazudik.

Tényleg jó ám, csak nem arra találták ki, amiokr Józsi meg Béla a két felhasználó és kész. Használható role rendszert (ezt most akár postgresql-től függetlenül) pl. úgy lehet csinálni, hogy egy ilyen hierarchiát alakítasz ki:

- user --> ezek a létező személyeket reprezentáló entitások és csoportokba lehet rakni őket (pl. Béla)
- group --> ezek csoportok a létező személyekből (pl. fejlesztők, üzemeltetők, hálózatosok stb.)
- role --> ezek a szerepkörök, amelyeket el kell látni és jogosultságuk van valamire vagy valamikre (pl. hardver rendszergazdák, akiknek joga van újraindítani gépeket)
- object --> ezek azok a dolgok, amelyekre lehet jogosultságokat kérni/adni

A gyakorlatban pl. lehet olyat csinálni vele, hogy Józsi és Béla üzemeltetők, Károly fejlesztő. Kétféle szerepkört kell ellátni, az egyik arra jogosít, hogy újraindítsd a szervert, a másik, hogy újraindítsd az apache-ot. A szerver újraindítására csak az üzemeltetők csoportjának van joga, az apache újraindítására meg az üzemeltetők csoportjának is és a fejlesztők csoportjának is.

Ekkora példán ez finoman szólva túlbonyolítottnak látszik, de képzelj el egy szervezetet 300 üzemeltetővel és 1000 fejleszővel, cégtől való távozással, új emberekkel, cégen belüli mozgásokkal, stb. Ennél egyszerűbb rendszerrel nem igazán tudnád követhetően lefedni az igényeket, ha meg mégis, akkor nem lenne a kész rendszer ilyen "egyszerű" és áttekinthető.

Jó ez tényleg...

Nem vitatkozni akartam, csak arra utaltam, hogy ezzel a rendszerrel hatalmas zavarokat is lehet támasztani - azaz komolyan kell venni a jogosultságok osztását.
Abban is igazad van, hogy az egy-két felhasználó az smafu, az ereje ezeknek a dolgoknak a 2-300 felhasználó mellet kezd látszani.
Csak visszautalnék arra, hogy a felhasználók, zömében a programokon keresztül látják ezeket a dolgokat - ott semmiképp NEM javasolnám 2-300 felhasználó bekonfigurálását, SQL szerver szinten - SQL tábla, ami az adott programhoz való hozzáféaséri jogosultságokat tartalmazza, jelszavakkal és felhasználó névvel, míg a program 2-3 (a jogosultságoknak megfelelő) felhasználó és jelszó párossal dolgozna. Nekem ez tűnik ésszerűnek.
Mindegy, tartok tőle, hogy ez olyan parttalan vita lenne mint az oop és funkcionális programozás közötti vita - se vége se hossza, mindenkinek van mellette/ellene jó érve.
Azért nem ártana, ha a PostgreSQ team, vagy valamely felhasználói/programozói team közre adna egy, vagy több "sablont". Így az olyan buták is mint én, a helyes irányba tudnak elindulni, arra koncentrálni ami a feladatuk és nem a jövőbeni, ki rudja hová burjánzó jogosultsági problémákkal foglalkozni.
Nem nyafogásnak szántam, csak javaslatnak, és nem neked címezve.
Köszönöm a segitséget, és kérek belőle még :)

* Én egy indián vagyok. Minden indián hazudik.

szerintem nem kell neked az a jogosultsag.
en ugy szoktam csinalni, hogy vagyok en a superuser es letrehozok egy sima usert createrole es createdb jogok nelkul.
utana letrehozom az adatbazist, "createdb adatbazisnev -O dbusernev"...
igy az adatbazist en hoztam letre de az o tulajdonaba kerult, igy az o adatbazisaban azt csinal amit akar. (eldobni mar nem tudja, mert azt csak azon kivul lehet, de benne ... )

Nagyon úgy tűnik. Végső fokon, a pg_dumpall -t használhatom akár mint postgres felhasználó (a crontab ott is működik) fejleszteni meg mint gyalog kell, CREATE TABLE, DROP TABLE stb. jogosultságokkal - a felhasználóknak meg az sem - INSERT INTO TABLE, UPDATE és esetleg DELETE.
Aztán a fentieknek megfelelően "keep it simple" - mert pár év múlva eber nem lesz aki a jogosultságok öröklődő mátrixán kiismerné magát :(

* Én egy indián vagyok. Minden indián hazudik.