Selamlar arkadaşlar bu yazımda sizlere PostgreSql’de User Management hakkında bilgi vereceğim.
PostgreSql her bir veritabanı için sistem kataloğu tutmaktadır ve içerisindeki objeleri, kullanıcıların bilgilerini vs. Burada saklar. Sistem üzerinde değişiklik yapabilecek kullanıcıların izin bilgilerinide ayrıca bir dosya üzerinden saklamaktadır.
Kullanıcıları listelemek için ise şekildeki örnekler gibi aşağıdaki kodları kullanabilirsiniz.
> \du
> \du+
> SELECT * FROM pg_catalog.pg_user;
> SELECT usename FROM pg_user;
> SELECT * FROM pg_shadow;
Kullanıcı oluşturma işleminde ise eğer Create User ile kullanıcı oluşturursanız varsayılan olarak login yetkisi olan bir kullanıcı oluşturmuş oluyorsunuz. Create Role ile bir kullanıcı oluşturmanız durumunda nologin bir kullanıcı oluşturmuş oluyorsunuz.
> CREATE ROLE role_semih
> CREATE USER user_semih
Kullanıcınızı oluştururken Password’de belirleyebilirsiniz.
> CREATE ROLE role_semih WITH LOGIN PASSWORD 'sistemdostu';
Attribute’ler ile kullanıcınızı oluştururken özelleştirebilirsiniz;
> CREATE ROLE role_semih2 REPLICATION;
Bunun yanı sıra aşağıdaki Attribute’larıda ekleyebilirsiniz.
LOGIN
SUPERUSER
CREATEDB
CREATEROLE
REPLICATION
PASSWORD
Eklediğiniz bu Attribute’ları değiştirmek isterseniz ise önüne NO koymanız yeterli olacaktır. Aşağıdaki şekildeki gibi sizde değişiklik yapabilirsiniz.
> ALTER ROLE role_semih NOREPLICATION SUPERUSER;
USER’a DB oluşturma yetkisi vermek için aşağıdaki kodu kullanabilirsiniz;
> ALTER USER username CREATEDB;
Bir kullanıcıyı SUPERUSER yapmak için aşağıdaki kodu kullanabilirsiniz;
> ALTER USER myuser WITH SUPERUSER;
Bir kullanıcıdan SUPERUSER yetkisini almak aşağıdaki kodu kullanabilirsiniz;
> ALTER USER username WITH NOSUPERUSER;
Bir kullanıcınıza ALTER DEFAULT ayarlarını uygulamak isterseniz aşağıdaki kodu kullanabilirsiniz;
> ALTER DEFAULT PRIVILEGES FOR USER adminsemih IN SCHEMA sistemdostu GRANT SELECT,INSERT,UPDATE,DELETE ON TABLES TO adminsemih;
Koddaki adminsemih kullanıcı adımızdır. Sistemdostu schema adıdır ve o şemada select, insert, update, delete gibi işlemler için yetki verilmiştir.
Aşağıdaki komut ile sistemde olan tablolarınızın hepsine Select yetkisini adminsemih için vermiş olursunuz; Ancak bu kod sonrasında oluşturulacak olan Table’lara bu izin atanmayacaktır. Adminsemih yeribe oluşturduğunuz Role’u de yazabilir ve grubada yetki verebilirsiniz.
> ALTER DEFAULT PRIVILEGES IN SCHEMA sistemdostu GRANT SELECT ON TABLES TO adminsemih;
Kullanıcıları silme işleminde ise aşağıdaki kodları kullanarak bir kullanıcı ya da , (virgül) ile ayırarak birden fazla kullanıcıyı silebilirsiniz.
> DROP ROLE role_semih;
> DROP ROLE user_semih, semihtest;
Eğer silmek istediğiniz Role kullanımda ise; her bir DB’de bağlı olduğu yetkiler başka kullanıcılara atanmalı ya da silinmelidir. Sonrasında Role’u silebileceksiniz.
> REASSIGN OWNED BY role_semih2 TO role_semih;
Kodu ile role ataması yapabilirsiniz;
> DROP OWNED BY role_semih2;
Kodu yardımı ile de role_semih2’ye ait olan OWNER’lıkları silebilirsiniz. Ardından Drop Role çalıştırabilirsiniz.
Grup Role’leride tekil roller gibi oluşturulur ve sonrasında başka role’lere üye yapılabilir.
> CREATE ROLE admin SUPERUSER LOGIN;
> CREATE ROLE semih;
> GRANT semih TO admin;
> REVOKE semih FROM admin;
INHERIT/NOINHERIT ile ROLE’lerden birinin üyesi olduğu ROLE’e ait izin haklarını kullanıp, kullanmamasını belirtmek adına yazılır. INHERIT ile yetkileri direk kullanırken, NOINHERIT ile ise üye olunan grubun yetkilerini SET ROLE komutu ardından kullanabilir.
> CREATE ROLE admin SUPERUSER LOGIN INHERIT;
> CREATE ROLE semih NOINHERIT;
> CREATE ROLE sistemdostu NOINHERIT;
> GRANT semih TO admin;
> GRANT sistemdostu TO admin;
Database’e erişim yetkisi vermek istiyorsanız aşağıdaki kodu kullanmalısınız.
> GRANT CONNECT ON DATABASE database_name TO username;
ÖR : GRANT CONNECT ON DATABASE testdb TO sistemdostu;
PostgreSql’de bulunan Privileges Name’ler; ALL, SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER, CREATE, CONNECT, TEMPORARY, EXECUTE, USAGE, SET, ALTER SYSTEM
Schema’daki tablolara izin vermek istiyorsanız;
> GRANT [privilege_name_or_ALL] ON ALL TABLES IN SCHEMA [schema_name] TO [role_name];
> GRANT [privilege_name_or_ALL] ON SCHEMA [schema_name] TO [role_name];
ÖR : GRANT SELECT,INSERT ON ALL TABLES IN SCHEMA test TO sistemdostu ;
GRANT USAGE ON SCHEMA test TO sistemdostu ;
Tabloya izin vermek istiyorsanız;
> GRANT [privilege_name_or_ALL] ON [table_name] TO [role_name];
ÖR : GRANT SELECT ON TABLE testtable TO sistemdostu ;
SEQUENCES’lara izin verirken;
SEQUENCE ise belirlenen aralıklarda kendiliğinden artan değerleri belirlediğimiz alanlardır. Tablolardan bağımsızda oluşturulur ve bu sayede birden fazla tabloda da kullanılabilir. Unique ve Primary alanlarda kullanılır bu değer.
> GRANT [privilege_name_or_ALL] ON SEQUENCES IN SCHEMA [sequences_name] TO [role_name];
ÖR : GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA deneme TO sistemdostu;
Diğer Örnekler :
> GRANT ALL PRIVILEGES ON DATABASE testdb TO sistemdostu;
> GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA test TO sistemdostu;
> GRANT USAGE ON ALL SEQUENCES IN SCHEMA test TO sistemdostu;
Yetkileri geri almak için ise REVOKE kelimesi kullanılır;
> REVOKE sistemdostu FROM postgres ;
Kodu sayesinde postgres’in memberlarından sistemdostunu çıkartmış olduk.
> REVOKE INSERT ON testtable FROM PUBLIC;
Kodu ile testtable’da ekleme yetkisini Public şeması için kaldırıyoruz.
> REVOKE ALL PRIVILEGES ON testtable FROM sistemdostu ;
Sistemdostu kullanıcısının testtable üzerindeki tüm yetkilerini geri alıyoruz.
Kullanıcıların izinlerini görmek için ise aşağıdaki kodları kullanabilirsiniz;
> SELECT r.rolname,ARRAY(SELECT b.rolname FROM pg_catalog.pg_auth_members m JOIN pg_catalog.pg_roles b ON (m.roleid = b.oid) WHERE m.member = r.oid) as memberof FROM pg_catalog.pg_roles r WHERE r.rolname NOT IN ('pg_signal_backend','rds_iam','rds_replication','rds_superuser','rdsadmin','rdsrepladmin') ORDER BY 1;
> select usesysid as "Id of User", usename as "User Name",usesuper as "Whether User Is SuperUser", passwd as "Md5 Encrypted Password", valuntil as "Expiry of Password" from pg_shadow order by usename;
Şimdi Ufak bir örnek çalışma yaparak kullanıcımız ile bağlanalım ve verdiğimiz izinler ile Database oluşturalım.
> CREATE ROLE DB_Admin NOLOGIN CREATEDB;
> \du
> CREATE ROLE semih LOGIN PASSWORD 'sistemdostu';
> GRANT db_admin TO semih;
> \du
> exit
> psql -h 127.0.0.1 -U semih -d postgres
> SET ROLE db_admin;
> CREATE DATABASE deneme;
> \l
> RESET ROLE;
> CREATE DATABASE deneme1;
//Burada INHERIT bir kullanıcı oluşturmadığımız için DB’ye bağlandıktan sonra SET ROLE komudu ile db_admin Role’ünün yetkilerini aldık ve database oluşturduk. Ardından RESET ROLE komudu yardımıyla Role’leri bırakarak tekrar oluşturmaya çalıştık ve oluşturamadığımızı gördük arkadaşlar.
Bir yazımın daha sonuna geldik arkadaşlar. Umarım yararlı bir yazı olmuştur. Destekleriniz için Youtube kanalıma bekliyorum arkadaşlar. Herkese kolay gelsin.