Temel Veritabanı İşlemleri
Düzeltme Öner

PostgreSQL Kullanıcı Yönetimi

PostgreSQL her veritabanı üzerinde bir sistem kataloğu tutar ve tablo, kullanıcı vb bilgileri burada saklar. Sisteme bağlanacak kullanıcı kısıtlamaları da bir ayar dosyasında tutulur.

Mevcut kullanıcıları listeleme:

postgres=# \du
                            List of roles
  Role name  |             Attributes              | Member of
-------------+-------------------------------------+-----------
 alfresco    |                                     | {}
 bilgemyte |                                     | {}
 postgres    | Superuser, Create role, Create DB,  | {}
                          Replication, Bypass RLS
 roundcube   |                                     | {}
 zabbix      |                                     | {}

CREATE USER: varsayılan olarak login yetkisi olan bir kullanıcı oluşturur.

CREATE ROLE: nologin bir kullanıcı oluşturur.

postgres=# CREATE ROLE yildirim;
CREATE ROLE
postgres=# CREATE USER bilgem;
CREATE ROLE
postgres=# \du
                            List of roles
  Role name  |             Attributes              | Member of
-------------+-------------------------------------+-----------
 yildirim        | Cannot login                        | {}
 bilgem       |                                     | {}
 postgres    | Superuser, Create role, Create DB,  | {}
                          Replication, Bypass RLS

Kullanıcı oluşturulurken attribute da belirtilir:

postgres=# CREATE ROLE deploy SUPERUSER LOGIN;
CREATE ROLE

Kullanılabilecek attribute’lar:

LOGIN
SUPERUSER
CREATEDB
CREATEROLE
REPLICATION LOGIN
PASSWORD

Ya da sonradan değiştirilir:

postgres=# ALTER ROLE deploy NOSUPERUSER CREATEDB;
ALTER ROLE

SUPERUSER tam yetkili rol, örn: postgres kullanıcısının varsayılan olarak parolası yoktur. Tam yetkili olması tüm kısıtlamaları baypas etmesi demek değildir.

DROP ROLE bilgem;

Silinmek istenen rol kullanımda ise önce her bir veritabanında bu rolün sahiplendiği nesneler başka rollere devredilir ya da silinir, sonra rol silinir

REASSIGN OWNED BY bilgem TO yte;
DROP OWNED BY bilgem;

Grup rolleri de tekil roller gibi oluşturulur. Başka roller bu rollere eklenir ya da çıkarılır.

CREATE ROLE admin NOLOGIN;
GRANT admin TO bilgem;
REVOKE admin FROM bilgem;

INHERIT/NOINHERIT ile bir rolün üyesi olduğu grupların yetkilerini direk kullanıp kullanamayacağı belirtilir. INHERIT ile üye olunan grubun yetkileri direk kullanılabilir. NOINHERIT ile üye olunan grubun yetkileri sadece SET ROLE komutu ardından kullanılabilir.

CREATE ROLE developer LOGIN INHERIT;
CREATE ROLE admin NOINHERIT;
CREATE ROLE wheel NOINHERIT;
GRANT admin TO developer;
GRANT wheel TO admin;

Bir kullanıcıya başka bir kullanıcının hakları da GRANT ile aktarılır.

GRANT  yildirim TO dba;

Superuser hakları aktarılamaz sonra alter user yapılması gerekir.

ALTER USER dba WITH SUPERUSER;

Örnek olarak; dbadmin isimli bir grup rolü oluşturalım. Bu role CREATEDB hakkı verelim. Kendi adımızla ve 123abc parolasıyla bir login rolü oluşturalım. tubitak isimli bir login rolü oluşturalım, buna dbadmin rolünü atayalım.


postgres=# CREATE ROLE dbadmin NOLOGIN;
CREATE ROLE

postgres=# ALTER ROLE dbadmin CREATEDB;
ALTER ROLE

postgres=# CREATE ROLE bilgem LOGIN PASSWORD '123abc';
CREATE ROLE

postgres=# CREATE ROLE tubitak LOGIN;
CREATE ROLE

postgres=# GRANT dbadmin TO tubitak;
GRANT ROLE

postgres=# \du
                           List of roles
 Role name |               Attributes              | Member of
-----------+---------------------------------------+-----------
 bilgem      |                                       | {}
 dbadmin   | Create DB, Cannot login               | {}
 tubitak      |                                       | {dbadmin}
 postgres  | Superuser, Create role, Create DB,    | {}
                          Replication, Bypass RLS

dbadmin grubu üyesi tubitak ile login olalım:

# psql -h 127.0.0.1 -U tubitak -d postgres
psql (11.5)
Type "help" for help.

postgres=>

dbadmin rolünün haklarını alalım ve veritabanı yaratalım:

postgres=> CREATE DATABASE pagila;
ERROR:  permission denied to create database
postgres=> SET ROLE dbadmin;
SET
postgres=> CREATE DATABASE pagila;
CREATE DATABASE
postgres=> RESET ROLE;
RESET