Veritabanı Kullanıcı Oluşturma
testdb=# create user kullanici_ismi ; postgres@srv1:~$ psql -U kullanici_ismi ; # role testdb=# create role role_ismi ; postgres@srv1:~$ psql -U role_ismi ; psql: error: FATAL: role “bir_role” is not permitted to log in # Bu rol grup olarak kullanılabilir. # login parametresi verilirse VT’ye login olabilir. postgres=# CREATE ROLE dataera LOGIN PASSWORD ‘sifre’; postgres=# \q postgres@srv1:~$ psql -U dataera -W
Veritabanına bağlanıp işlem yapabilmek için kullanıcı hesabına ve kimlik doğrulama
yöntemine ihtiyaç vardır.
Not: İşletim sistemindeki kullanıcılar ile veritabanındaki kullanıcılar farklıdır. Örneğin
postgres veritabanının üzerinde koştuğu linux işletim sistemindeki postgres
kullanıcısı, işletim sistemi kullanıcısıdır. ssh ile bağlantı yaparak işletim sistemini
yönetmek için kullanılır. Ama psql ile veritabanına bağlandığınız postgres kullanıcısı,
veritabanı kullanıcısıdır.
- role : Veritabanına erişirken hakları yönetmek için kullanılır.
Role kavramı kullanıcı ve grup kavramlarını kapsar.
8.1’den önceki sürümlerde user ve grup farklı objelerdi. Artık bir role, user, grup ve her
ikisi gibi de kullanılabiliyor. - Oluşturulurken kullanılan parametrelere göre kullanıcı ya da gruptur diyebiliriz.
“create user” ile “create role” aynı işi yapar, tek fark “create user” login
hakkını da içerir. - Roller globaldir, cluster’daki tüm veritabanlarında kullanılabilir.
- Rollerin kendilerine ait veritabanı objeleri (tablo, index, fonksiyon) olabilir ve diğer rollere erişim hakkı verebilir.
- Roller arası üyelikler verilerek erişim hakları kolaylaştırılabilir.
- Örneğin aynı projede çalışan yazılım geliştiriciler için bir rol oluşturulur, haklar bu role verilir yazılımcılar da bu role üye (member) yapılır. Böylece her yazılımcıya tek tek hak vermekle zaman kaybedilmez.
# role (grup) oluşturulur. testdb=# create role JavaYazGel_Role ; # Örnek tablolar oluşturulur. testdb=# CREATE TABLE OrnekTablo1 ( testdb(# id serial4 NOT NULL, testdb(# “name” text NULL testdb(# ); testdb=# CREATE TABLE OrnekTablo2 ( testdb(# id serial4 NOT NULL, testdb(# “name” text NULL testdb(# ); # Örnek veri girişi testdb=# INSERT INTO OrnekTablo1 (name) SELECT ‘Dataera’ FROM generate_series(1, 5); testdb=# INSERT INTO OrnekTablo2 (name) SELECT ‘Dataera’ FROM generate_series(1, 5); # JavaYazGel_Role grubuna select hakkı verilir testdb=# grant select on OrnekTablo1 to JavaYazGel_Role ; testdb=# grant select on OrnekTablo2 to JavaYazGel_Role ; # Kullanıcılar oluşturulur. testdb=# CREATE ROLE kul1 LOGIN PASSWORD ‘sifre’; testdb=# CREATE ROLE kul2 LOGIN PASSWORD ‘sifre’; testdb=# CREATE ROLE kul3 LOGIN PASSWORD ‘sifre’; # Kullanıcılara grup üyeliği verilir. testdb=# grant JavaYazGel_Role to kul1 ; testdb=# grant JavaYazGel_Role to kul2 ; testdb=# grant JavaYazGel_Role to kul3 ; testdb=# \q # kul1 ile bağlantı postgres@srv1:~$ psql -d testdb -U kul1 -W # sorgu testdb=> select * from OrnekTablo1 ; id | name ----+--------- 1 | Dataera 2 | Dataera 3 | Dataera 4 | Dataera 5 | Dataera
Üyelik geri alındığında erişim hakkı hatası verir.
postgres@srv1:~$ psql -d testdb testdb=# revoke JavaYazGel_Role from kul1 ; testdb=# \q postgres@srv1:~$ psql -d testdb -U kul1 testdb=> select * from OrnekTablo1 ; ERROR: permission denied for table ornektablo1
Rol Silmek
drop role role_ismi; # Önce sahip olunan tablolar varsa bunların sahipliğini başkasına aktarmak lazım. alter table tablo_ismi owner to baska_bir_role; # veya haklar başka bir role devredilir. REASSIGN OWNED BY silinecek_role TO baska_bir_role; DROP OWNED BY silinecek_role; DROP ROLE silinecek_role;
Rolleri görmek için pg_roles sorgulanabilir
postgres=# SELECT rolname FROM pg_roles;
# veya
postgres=# \du
List of roles
Role name | Attributes | Member of
--------------------------------------------------------------
DVDRental_Role | CreateDB,Cannotlogin | {}
Rental | | {DVDRental_Role}
ahmed | | {ik_role,erp_role}
auditor | | {}
dataera | | {}
Postgresql Rol Listesi
create role rol_ismi login ; create user kullanıcı_ismi ; create role rol_ismi superuser ; alter user kul1 superuser ; create role rol_ismi createdb ; alter user rol_ismi createdb ; create role rol_ismi replication login ; alter user rol_ismi replication login ; create role rol_ismi password ‘şifre’ ; alter user rol_ismi password ‘şifre’ ;
login : Sadece login hakkı verilen roller veribanına bağlantı yapabilir. Login hakkı
verilmiş rol, kullanıcı olarak düşünülebilir.
superuser : En yetkili kullanıcıdır. Tüm kullanıcı hakkı kontrollerinden beridir.
Tehlikeli bir haktır.
Ancak superuser hakkı olan bir kullanıcı bir superuser oluşturabilir ya da bir kullanıcıya
superuser hakkı verebilir.
createdb : Veritabanı oluşturabilme hakkıdır.
replication : Vertiabanları arasında replikasyon yapabilmek için gereklidir. Role
login ile birlikte verilmesi gerekir.
password : Bağlantı sırasında şifre gereken yerlerde kullanılır . md5, scram-sha-256
gibi şifreleme methodları kullanılabilir. (Daha güçlü bir şifreleme için scram-sha-256
önerilir. 12 versiyonundan itibaren defaulttur.)
Önerilen, rutin veritabanı yönetimi için createdb ve createrole haklarına sahip
bir role/user kullanılmasıdır. Bu kullanıcı superuser hakkına sahip olmadığı için geri
dönüşü olmayan kazaların önüne geçilmiş olur.
inherit : Rol inherit seçeneği ile oluşturuldu ise sahip olduğu haklar üyelerine
miras olarak geçer, yani üyeleri de aynı haklara sahip olur. Default değerdir. (noinherit
rollerin hakları üyelere geçmez)
Default Roller
Aşağıda listesi verilen default roller, grant cümlesi ile diğer rollere ve kullanıcılara verilebilir.
| ROLE | ERİŞİM HAKLARI |
| pg_read_all_settings | Konfigurasyon dosyalarını okuyabilme. |
| pg_read_all_stats | pg_stat* viewleri okuyabilme. |
| pg_stat_scan_tables | access share lock lara erişen fonksiyonları çalıştırabilme. |
| pg_monitor | Monitoring viewlerini okuyabilme fonksiyonlarını çalıştırabilme. |
| pg_signal_backend | Backend prosesleri sonlandırmak için sinyal gönderebilme. |
| pg_read_server_files | Server dosyalarını okuyabilme (copy vb. fonksiyonlar ile) |
| pg_write_server_files | Server dosyalarına yazabilme (copy vb. fonksiyonlar ile) |
| pg_execute_server_program | Programları çalıştırabilme (copy vb. fonksiyonlar) |
grant pg_read_all_settings to role_ismi ;#Rollerin haklarını görmek için
postgres=# \dg
#Tablo üzerindeki hakları görmek
postgres=# \dp+ Tablo1
testdb=# \dp+ OrnekTablo1
Access privileges
Schema |Name |Type| Access privileges |Column priv | Policies
--------+-----+-------+-----------------+------------+---------------+
public |tablo1 |table| postgres=arwdDxt/postgres +| |
| | javayazgel_role=r/postgres | |
postgres=# SELECT * FROM pg_roles;
#Rollerin haklarını görmek için
postgres=# \dg
Role name | Attributes | Member of
--------------+---------------------------------------------------------
bir_role | Cannot login | {}
bir_user | | {}
dataera | | {}
ik_role | No inheritance, Cannot login | {}
javayazgel_r | Cannot login | {}
kul1 | Superuser,CreateDB,Replication | {pg_read_all_settings}
kul2 | | {javayazgel_role}
postgres | Superuser,Crrole,CrDB,Rep,... | {}
