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.

ROLEERİŞİM HAKLARI
pg_read_all_settingsKonfigurasyon dosyalarını okuyabilme.
pg_read_all_statspg_stat* viewleri okuyabilme.
pg_stat_scan_tablesaccess share lock lara erişen fonksiyonları çalıştırabilme.
pg_monitorMonitoring viewlerini okuyabilme fonksiyonlarını çalıştırabilme.
pg_signal_backendBackend prosesleri sonlandırmak için sinyal gönderebilme.
pg_read_server_filesServer dosyalarını okuyabilme (copy vb. fonksiyonlar ile)
pg_write_server_filesServer dosyalarına yazabilme (copy vb. fonksiyonlar ile)
pg_execute_server_programProgramları ç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,...  | {}

Kategori seçin...