====== PostgreSQL szerepkörök ======
===== Általános tulajdonságok =====
PostgreSQL az adatbázis-hozzáférési jogosultságokat a szerepkörök (role) alapján kezeli. Egy szerepkör felfogható adatbázis-felhasználóként vagy adatbázis-felhasználók csoportjaként, attól függően, hogyan van beállítva. A szerepkörök birtokolhatnak adatbázis-objektumokat (például táblákat és függvényeket), és jogosultságokat adhatnak ezekre az objektumokra más szerepköröknek annak szabályozására, hogy ki mely objektumokhoz férhet hozzá. Emellett lehetőség van arra is, hogy egy szerepkör tagságát egy másik szerepkörnek adjuk, így a tag szerepkör használhatja egy másik szerepkörhöz rendelt jogosultságokat.
A szerepkörök fogalma magába foglalja a „felhasználók” és „csoportok” korábbi fogalmait. A PostgreSQL 8.1 előtti verzióiban a felhasználók és csoportok különálló entitások voltak, de ma már csak szerepkörök léteznek. Bármely szerepkör működhet felhasználóként, csoportként, vagy akár mindkettőként.
PostgreSQL szerverben.
===== Gyakorlati példák =====
Egyszerű „felhasználó” szerepkör létrehozása. Felhasználónak az a szerepkör tekinthető, amelynek van ''LOGIN'' tulajdonsága. A szerepkör létrehozása többféle módszerrel történhet.
[root@gepnev ~]# su - postgres
[postgres@gepnev ~]$ psql -c '\du'
List of roles
Role name | Attributes
-----------+------------------------------------------------------------
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS
[postgres@gepnev ~]$ createuser test
[postgres@gepnev ~]$ psql -c '\du'
List of roles
Role name | Attributes
-----------+------------------------------------------------------------
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS
test |
[postgres@gepnev ~]$ dropuser test
[postgres@gepnev ~]$ psql -c '\du'
List of roles
Role name | Attributes
-----------+------------------------------------------------------------
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS
Másik módszerrel ugyanez
[root@gepnev ~]# su - postgres
[postgres@gepnev ~]$ psql -c '\du'
List of roles
Role name | Attributes
-----------+------------------------------------------------------------
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS
[postgres@gepnev ~]$ psql -c 'CREATE ROLE test LOGIN'
CREATE ROLE
[postgres@gepnev ~]$ psql -c '\du'
List of roles
Role name | Attributes
-----------+------------------------------------------------------------
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS
test |
[postgres@gepnev ~]$ psql -c 'DROP ROLE test'
DROP ROLE
[postgres@gepnev ~]$ psql -c '\du'
List of roles
Role name | Attributes
-----------+------------------------------------------------------------
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS
A ''CREATE USER name'' megegyezik a ''CREATE ROLE name LOGIN'' paranccsal, azzal a különbséggel, hogy automatikusan tartalmazza a LOGIN attribútumot.
[postgres@gepnev ~]$ psql -c "CREATE ROLE test LOGIN PASSWORD 'test'"
CREATE ROLE
[postgres@gepnev ~]$ psql -c '\du'
List of roles
Role name | Attributes
-----------+------------------------------------------------------------
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS
test |
[postgres@gepnev ~]$ psql -c "SELECT * FROM pg_roles WHERE rolname = 'test'"
rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolconnlimit | rolpassword | rolvaliduntil | rolbypassrls | rolconfig | oid
---------+----------+------------+---------------+-------------+-------------+----------------+--------------+-------------+---------------+--------------+-----------+-------
test | f | t | f | f | t | f | -1 | ******** | | f | | 16390
(1 row)
[postgres@gepnev data]$ cat ${PGDATA}/pg_hba.conf
# TYPE DATABASE USER ADDRESS METHOD
local all all trust
host all all 127.0.0.1/32 trust
host all all ::1/128 trust
local replication all peer
host replication all 127.0.0.1/32 ident
host replication all ::1/128 ident
[postgres@gepnev ~]$ psql -U test -d postgres -c "SELECT 'z' < 'á'"
?column?
----------
f
(1 row)
[postgres@gepnev data]$ cat ${PGDATA}/pg_hba.conf
# TYPE DATABASE USER ADDRESS METHOD
local all test md5
local all all trust
host all all 127.0.0.1/32 trust
host all all ::1/128 trust
local replication all peer
host replication all 127.0.0.1/32 ident
host replication all ::1/128 ident
[postgres@gepnev data]$ pg_ctl reload
server signaled
[postgres@gepnev data]$ psql -U test -d postgres -c "SELECT 'z' < 'á'"
Password for user test: xxx
psql: error: connection to server on socket "/run/postgresql/.s.PGSQL.5432" failed: FATAL: password authentication failed for user "test"
[postgres@gepnev data]$ psql -U test -d postgres -c "SELECT 'z' < 'á'"
Password for user test:
?column?
----------
f
(1 row)
[postgres@gepnev data]$ psql -c 'DROP ROLE test'
DROP ROLE
[postgres@gepnev data]$ psql -c '\du'
List of roles
Role name | Attributes
-----------+------------------------------------------------------------
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS
===== Szerepkör hierarchia =====
==== Szerepkörök létrehozása ====
[postgres@gepnev data]$ psql -c '\du'
List of roles
Role name | Attributes
-----------+------------------------------------------------------------
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS
[postgres@gepnev data]$ psql -c 'CREATE ROLE db_read'
CREATE ROLE
[postgres@gepnev data]$ psql -c 'CREATE ROLE db_write'
CREATE ROLE
[postgres@gepnev data]$ psql -c 'CREATE ROLE db_admin'
CREATE ROLE
[postgres@gepnev data]$ psql -c '\du'
List of roles
Role name | Attributes
-----------+------------------------------------------------------------
db_admin | Cannot login
db_read | Cannot login
db_write | Cannot login
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS
==== Jogosultságok hozzáadása ====
[postgres@gepnev data]$ psql -c "GRANT SELECT ON ALL TABLES IN SCHEMA public TO db_read"
GRANT
[postgres@gepnev data]$ psql -c "GRANT INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO db_write"
GRANT
[postgres@gepnev data]$ psql -c "GRANT USAGE, CREATE ON SCHEMA public TO db_admin"
GRANT
[postgres@gepnev data]$ psql -c "GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO db_admin"
GRANT
[postgres@gepnev data]$ psql -c "GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO db_read"
GRANT
[postgres@gepnev data]$ psql -c "GRANT USAGE, SELECT, UPDATE ON ALL SEQUENCES IN SCHEMA public TO db_write"
GRANT
[postgres@gepnev data]$ psql -c "GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO db_admin"
GRANT
[postgres@gepnev data]$ psql -c "ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO db_read"
ALTER DEFAULT PRIVILEGES
[postgres@gepnev data]$ psql -c "ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT INSERT, UPDATE, DELETE ON TABLES TO db_write"
ALTER DEFAULT PRIVILEGES
[postgres@gepnev data]$ psql -c "ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL PRIVILEGES ON TABLES TO db_admin"
ALTER DEFAULT PRIVILEGES
[postgres@gepnev data]$ psql -c "ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT USAGE, SELECT ON SEQUENCES TO db_read"
ALTER DEFAULT PRIVILEGES
[postgres@gepnev data]$ psql -c "ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT USAGE, SELECT, UPDATE ON SEQUENCES TO db_write"
ALTER DEFAULT PRIVILEGES
[postgres@gepnev data]$ psql -c "ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL PRIVILEGES ON SEQUENCES TO db_admin"
ALTER DEFAULT PRIVILEGES
==== Szerepkörök egymásba ágyazása ====
[postgres@gepnev data]$ psql -c "GRANT db_read TO db_write"
GRANT ROLE
[postgres@gepnev data]$ psql -c "GRANT db_write TO db_admin"
GRANT ROLE
==== Felhasználók szerepkörei ====
[postgres@gepnev data]$ psql -c "GRANT db_read TO db_write"
GRANT ROLE
[postgres@gepnev data]$ psql -c "GRANT db_write TO db_admin"
GRANT ROLE
[postgres@gepnev data]$ psql -c "CREATE ROLE admin LOGIN"
CREATE ROLE
[postgres@gepnev data]$ psql -c "GRANT db_admin TO admin"
GRANT ROLE
[postgres@gepnev data]$ psql -c "CREATE ROLE developer LOGIN"
CREATE ROLE
[postgres@gepnev data]$ psql -c "GRANT db_write TO developer"
GRANT ROLE
[postgres@gepnev data]$ psql -c "CREATE ROLE monitor LOGIN"
CREATE ROLE
[postgres@gepnev data]$ psql -c "GRANT db_read TO monitor"
GRANT ROLE
[postgres@note02 data]$ psql -c "\du"
List of roles
Role name | Attributes
-----------+------------------------------------------------------------
admin |
db_admin | Cannot login
db_read | Cannot login
db_write | Cannot login
developer |
monitor |
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS
==== Teszteles ====
[postgres@gepnev data]$ psql -U admin -d postgres -c "\dt"
Did not find any tables.
[postgres@gepnev data]$ psql -U admin -d postgres -c "CREATE TABLE users (id SERIAL PRIMARY KEY, name TEXT)"
CREATE TABLE
[postgres@gepnev data]$ psql -U admin -d postgres -c "\dt"
List of tables
Schema | Name | Type | Owner
--------+-------+-------+-------
public | users | table | admin
(1 row)
[postgres@gepnev data]$ psql -U admin -d postgres -c "DROP TABLE users"
DROP TABLE
[postgres@gepnev data]$ psql -U admin -d postgres -c "\dt"
Did not find any tables.
[postgres@gepnev data]$ psql -U developer -d postgres -c "CREATE TABLE users (id SERIAL PRIMARY KEY, name TEXT)"
ERROR: permission denied for schema public
LINE 1: CREATE TABLE users (id SERIAL PRIMARY KEY, name TEXT)
^
[postgres@gepnev data]$ psql -U monitor -d postgres -c "CREATE TABLE users (id SERIAL PRIMARY KEY, name TEXT)"
ERROR: permission denied for schema public
LINE 1: CREATE TABLE users (id SERIAL PRIMARY KEY, name TEXT)
^