Postgresql’de role, group role, user, schema gibi kavramları daha kolay anlayabilmek adına önce Postresql’de nesne hiyerarşisini bir resim ile kısaca göstermek istedim.

Postgresql-ROLE-USER-SCHEMA

Resimden de anlaşılacağı gibi; initdb yaptımız noktadan itibaren veritabanı clusterımız oluşur,  veritabanı cluster’ın altında ise roller, veritabanları ve tablespaceler vardır. Veritabanı le tablo,index, sequence vb objelerin arasında ise schema diye bir katman vardır.

İlk dikkat etmemiz gereken nokta roller ve tablespacelerin veritabanı ile aynı seviyede olması, yani hemen veritabanı cluster’ın altında olması. Bunun nedeni bir kullanıcı ve tablespace oluşturduğumuzda bu nesnelerin veritabanına ait olmaması yada bir diğer deyişle bu nesneleri globel nesne olması. Buradan şunuda anlayabiliriz roller ve tablespaceleri birden fazla veritabanında kullanabileceğimiz.

İkinci dikkat etmemiz gerekn nokta ise schema kavramı bu kavramı başka bir yazıda detaylıca anlatacağım ama kavram karmaşası olmaması adına kısaca değinmek istiyorum. Öncelikle bir veritabanında bir veya daha fazla schema olabilir, hatta aynı nesne ismi aynı veritabanında farklı schemalarda kullanılabilir. Veritabanlarından farklı olarak schemalar katı bir şekilde ayrılmaz: bir kullanıcı, yetkileri varsa, bağlı oldukları veritabanındaki schemaların herhangi birindeki nesnelere erişebilir. Schemaları  kullanmak istemenin birkaç nedeni vardır:

  • Birçok kullanıcının birbirine müdahale etmeden bir veritabanını kullanmasına izin vermek için.
  • Veritabanı nesnelerini daha yönetilebilir hale getirmek için mantıksal gruplar halinde düzenlemek.
  • Üçüncü taraf uygulamalar, diğer nesnelerin adlarıyla çakışmaması için ayrı schemalara yerleştirilebilir.
  • Schemalar, işletim sistemi düzeyindeki dizinlere benzer, ancak schemalar iç içe olamaz.

PostgreSQL’de ROL Kavramı

Gelelim bugünkü asıl konumuz olan rol kavramına; PostgreSQL, roller kavramını kullanarak veritabanı erişim izinlerini yönetir. Bir rol, rolün nasıl ayarlandığına bağlı olarak bir veritabanı kullanıcısı veya bir veritabanı kullanıcısı grubu olarak düşünülebilir.  Bu koyu yazdığım yer işin can alıcı noktası, Postgresql’de user diye bir kavram yoktur user dediğimiz nesne, rolün LOGIN yetkili halidir. Bu dediğimin anlaşılabilmesi adına 3 farklı nesne oluşturacağım ve daha sonra \du  komutu veya pg_user/pg_roles sistem viewleri ile bu nesnelere bakacağız;

NOT : Rol kavramı, “user” ve ” groups ” kavramlarını kapsar. 8.1’den önceki PostgreSQL sürümlerinde, user ve groups farklı türde varlıklardı, ancak şimdi yalnızca roller var. Herhangi bir rol bir kullanıcı, bir grup veya her ikisi olarak hareket edebilir.

Postgresql-ROLE-USER-SCHEMA

  • Şimdi ilk dikkat etmemiz gereken konu “test1user” rolünün LOGIN yetkisinin bulunmadığı.
  • İkinci dikkat etmemiz gereken konu “create user”  komutu çalıştırdığımda dahi “create role” çıktısı geldi çünkü user dediğimiz şey aslında rol dür.
  • Üçüncü dikkat etmemiz gereken konu ise “create user” oluştururken herhangi bir yetki vermeme rağmen “testuser3” için “Cannot login” yazmıyor, işte bunun sebebi ise user create edilirken otomatikmen role LOGIN yetkisininde verilmesi.
  • Dördüncü dikkat etmemiz gereken nokta “test2user” adında rol oluşturdum ve buna LOGIN yetkisi verdim yani postgresql veri tabanında yaratılan bir role ile user gibi veri tabanına login olabilmek mümkündür.

Roller, veritabanı nesnelerine  sahip olabilir ve kimin hangi nesnelere erişimi olduğunu kontrol etmek için bu nesneler üzerindeki diğer rollere ayrıcalıklar atayabilir. Ayrıca, bir rolde başka bir role üyelik vermek, böylece üye rolünün başka bir role atanan ayrıcalıkları kullanmasına izin vermek mümkündür. Bu parağrafı aslında şöyle özetlersek daha anlaşılır olacak Postgresql veri tabanı ve objelere erişim haklarını kontrol edebilmek için rol yapısını kullanmaktadır.

Yeni bir role yaratabilmek için aşağıdaki komut kullanılır.

 CREATE ROLE role_name;

Mevcut rolü silmek için aşağıdaki komut kullanılır.

DROP ROLE role_name; 

Yeni kurulmuş database cluster  her zaman önceden tanımlanmış bir rol içerir. Bu rol her zaman bir “superuser” ve varsayılan olarak (initdb çalıştırılırken değiştirilmediği sürece) veritabanı clusterı başlatan işletim sistemi kullanıcısı ile aynı ada sahip olacaktır. Geleneksel olarak, bu rol postgres olarak adlandırılır. Daha fazla rol oluşturmak için önce bu ilk rol olarak bağlanmanız gerekir.

Veritabanı sunucusuna her bağlantı belirli bir rolün adı kullanılarak yapılır ve bu rol, o bağlantıda verilen komutlar için ilk erişim ayrıcalıklarını belirler. Belirli bir veritabanı bağlantısı için kullanılacak rol adı, bağlantı isteğini uygulamaya özel bir şekilde başlatan client tarafından belirtilir. Örneğin, psql programı bağlanılacak rolü belirtmek için -U komut satırı seçeneğini kullanır. Birçok uygulama varsayılan olarak mevcut işletim sistemi kullanıcısının adını alır (createuser ve psql dahil).

psql -U postgres1 

ROL Özellikleri

Rolleri oluştururken bir takım özellikler verebiliyoruz.

login privilege : Yalnızca LOGIN özelliğine sahip roller, veritabanı bağlantısı kullanılabilir. LOGIN özelliğine sahip bir rol, “user” ile aynı kabul edilebilir. login yetkisine sahip bir rol oluşturmak için aşağıdakilerden birini kullanırız;

CREATE ROLE name LOGIN;
CREATE USER name; 

superuser : Veritabanı “superuser” , LOGIN hakkı dışında tüm izin kontrollerini atlar. Bu tehlikeli bir yetkidir ve dikkatsizce kullanılmamalıdır; İşinizin çoğunu süper kullanıcı olmayan bir rol olarak yapmak en iyisidir. Yeni bir veritabanı süper kullanıcısı oluşturmak için, SUPERUSER ROLE adını oluşturun. Bunu zaten süper kullanıcı olan bir rol olarak yapmalısınız.

create role name SUPERUSER; 

createdb : Bir role, veritabanları oluşturmak için izin verilmelidir (süper kullanıcılar hariç, çünkü bunlar tüm izin denetimlerini atlar).

 create role name createdb;

CREATEROLE : Bir role daha fazla rol oluşturmak için izin verilmelidir.CREATEROLE ayrıcalığına sahip bir rol, diğer rolleri de değiştirebilir ve kaldırabilir, ayrıca bunlara üyeliği verebilir veya iptal edebilir. Ancak, bir süper kullanıcı rolü oluşturmak, değiştirmek, üyeliği iptal etmek veya değiştirmek için süper kullanıcı durumu gereklidir;

REPLICATION LOGIN : Bir role, streaming replication başlatmak için izin verilmelidir. Akış çoğaltması için kullanılan bir rolün de LOGIN iznine sahip olması gerekir.

create role name REPLICATION LOGIN; 

password : Kullanıcının veritabanına bağlanırken bir parola sağlamasını gerektiriyorsa önemlidir. Password ve md5 kimlik doğrulama yöntemleri parolaları kullanır.

CREATE ROLE name WITH LOGIN PASSWORD 'name_password'; 

INHERIT : Rol’un yetkilerini, rol’e dahil olan kullanıcılara miras bırakmasını sağlar.

BYPASSRLS : Row level security gerektiren şeyleri yetki kullanmadan görüntüleyebilmesini sağlar.

CONNECTION LIMIT : Kullanıcı için bağlantı sayısı limiti belirler.

CREATE ROLE name WITH VALID UNTIL '2019-10-03T23:10:10+03:00' ; 

VALID UNTIL : Kullanıcı için bir geçerlilik süresi belirler.

Bir rolün özellikleri, ALTER ROLE ile oluşturulduktan sonra değiştirilebilir.

Bir rol, run-time yapılandırma ayarlarının birçoğu için role özgü varsayılanlara da sahip olabilir. Örneğin, herhangi bir nedenle bağlandığınızda index taramalarını devre dışı bırakmak istiyorsanız  şunları yapabilirsiniz:

 ALTER ROLE myname SET enable_indexscan TO off;

Role özgü varsayılan bir ayarı kaldırmak için aşağıdaki komutu kullanabiliriz;

 ALTER ROLE rolename RESET varname ;

Yetkilerin yönetimini kolaylaştırmak için kullanıcıları bir arada gruplamak genellikle uygundur: bu şekilde, bir bütün olarak bir gruba ayrıcalıklar verilebilir veya bu gruptan kaldırılabilir. PostgreSQL’de bu, grubu temsil eden bir rol oluşturarak ve ardından grup rolünde bireysel kullanıcı rollerine üyelik vererek yapılır.

CREATE ROLE grp_dba;
grant grp_dba to mustafa;
revoke grp_dba from mustafa; 

Varsayılan Olarak gelen Roller

PostgreSQL, belirli, yaygın olarak ihtiyaç duyulan, ayrıcalıklı yeteneklere ve bilgilere erişim sağlayan bir dizi varsayılan rol sağlar. Yöneticiler, bu rolleri kullanıcılara ve / veya ortamlarındaki diğer rollere VEREBİLİR, bu kullanıcılara belirtilen yeteneklere ve bilgilere erişim sağlayabilir.

Rol Açıklama
pg_read_all_settings Normalde yalnızca süper kullanıcılar tarafından görülebilenler dahil tüm konfigürasyonları okur.
pg_read_all_stats g_stat_ * viewlerini ve bazı eklentileri kullanır.
pg_stat_scan_tables Patansiyel uzun sirecek sorguları tablolarda ACCESS SHARE locklarını görüntüleyebilecek foksiyonları çalıştırabilir.
pg_monitor Çeşitli monitoring view ve fonksiyonları okuyup çalıştırabilir.
pg_signal_backend Bir sorguyu iptal etmek veya oturumunu sonlandırmak için signal verebilme için gerekli rol.
pg_read_server_files COPY ve diğer dosya erişim işlevleriyle veritabanının sunucuda erişebileceği herhangi bir konumdan dosya okumaya izin verir.
pg_write_server_files COPY ve diğer dosya erişim işlevleriyle veritabanının sunucuda erişebileceği herhangi bir konumdan dosya yazmaya izin verir.
pg_execute_server_program COPY ve diğer dosya erişim işlevleriyle veritabanının sunucuda erişebileceği herhangi bir konumdan dosya çalıştırmaya izin verir.

Pg_monitor, pg_read_all_settings, pg_read_all_stats ve pg_stat_scan_tables rollerinin, yöneticilerin veritabanı sunucusunu izlemek amacıyla bir rolü kolayca yapılandırmasına izin vermesi amaçlanmıştır. Rolün çeşitli yararlı yapılandırma ayarlarını, istatistikleri ve normalde süper kullanıcılarla sınırlı olan diğer sistem bilgilerini okumasına izin veren bir dizi ortak ayrıcalık sağlarlar.

Mustafa Bektaş Tepe
İyi Çalışmalar

Referanslar
https://www.tutorialdba.com/p/postgresql-understanding-of-objects.html
https://blog.gunduzdanismanlik.com/
https://www.postgresql.org/docs/12/default-roles.html

 118 total views,  2 views today