Skip to content

Latest commit

 

History

History
668 lines (458 loc) · 16.5 KB

VYS14.md

File metadata and controls

668 lines (458 loc) · 16.5 KB

BSM211 Veritabanı Yönetim Sistemleri - Celal ÇEKEN, İsmail ÖZTEL, Veysel Harun ŞAHİN

Veritabanı Güvenliği, Yetkilendirme

psql Kullanımı

psql, postgresql sunucuya bağlanıp işlemler yapmamızı sağlayan konsol uygulamasıdır.

psql Uygulamasını Çalıştırma

psql -U postgres -h localhost

psql -U ayse -d pagila -h localhost
psql -U postgres

VTYS_Comp:~ vtys$ psql -U postgres
Password for user postgres:
psql (9.5.4)
Type "help" for help.

postgres=#

psql ile veritabanlarını görüntüleme

postgres=# \l
                                       List of databases
         Name         |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
----------------------+----------+----------+-------------+-------------+-----------------------
 AlisVerisUygulamasi  | postgres | UTF8     | tr_TR.UTF-8 | tr_TR.UTF-8 | 
 Musteri              | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 Northwind            | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 OgrenciBilgiSistemi  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 

psql ile veritabanına bağlanma

postgres=# \c Northwind
psql (10.3, server 12.1)
WARNING: psql major version 10, server major version 12.
         Some psql features might not work.
You are now connected to database "Northwind" as user "postgres".

psql ile tabloları görüntüleme

Northwind=# \d+
                                     List of relations
 Schema |              Name               |   Type   |  Owner   |    Size    | Description 
--------+---------------------------------+----------+----------+------------+-------------
 public | CustomersContactName            | table    | postgres | 16 kB      | 
 public | Musteriler                      | table    | postgres | 0 bytes    | 
 public | Musteriler_musteriNo_seq        | sequence | postgres | 8192 bytes | 
 public | OrderCustomerEmployee           | view     | postgres | 0 bytes    | 
 public | OrderCustomerEmployee1          | view     | postgres | 0 bytes    | 
 public | OrderCustomerEmployee3          | view     | postgres | 0 bytes    | 
 public | OrderCustomerEmployee4          | view     | postgres | 0 bytes    | 
 public | SiparisMusteriSatisTemsilcisi   | view     | postgres | 0 bytes    | 
 public | UrunDegisikligiIzle             | table    | postgres | 8192 bytes | 
 public | UrunDegisikligiIzle_kayitNo_seq | sequence | postgres | 8192 bytes | 
 public | categories                      | table    | postgres | 16 kB      | 
 public | customercustomerdemo            | table    | postgres | 8192 bytes | 
 public | customerdemographics            | table    | postgres | 8192 bytes | 
 public | customers                       | table    | postgres | 56 kB      | 
 public | employees                       | table    | postgres | 16 kB      | 
 public | employeeterritories             | table    | postgres | 8192 bytes | 
 public | order_details                   | table    | postgres | 120 kB     | 
 public | orders                          | table    | postgres | 144 kB     | 
 public | products                        | table    | postgres | 8192 bytes | 

psql ile sql sorgusu çalıştırma

Northwind=# select "ProductID", "ProductName"  from products;
 ProductID |           ProductName            
-----------+----------------------------------
         5 | Chef Anton's Gumbo Mix
         7 | Uncle Bob's Organic Dried Pears
        12 | Queso Manchego La Pastora
        13 | Konbu

psql - Kullanıcıları/Rolleri Listeleme

postgres=# \du
                                   List of roles
                                   
 Role name |                         Attributes                         | Member of
 
-----------+------------------------------------------------------------+-----------

 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 
 testk1    |                                                            | {}

psql Çıkış Örneği

postgres=# \q
postgres=#
VTYS_Comp:~ vtys$

Yetki/Yetkilendirme

  • Nesnelerle ilgili sahip olunan haklara yetki denir.
  • Kullanıcıların/rollerin, veritabanı yönetim sistemi ve veritabanı nesneleri (tablo, görünüm, fonksiyon vb.) üzerinde hangi haklara sahip olacağının belirlenmesine yetkilendirme adı verilir.
  • İki tür yetki vardır:
    • Temel yetkiler (rol özellikleri)
    • Nesne yetkileri

Temel Yetkiler (Rol Özellikleri)

  • Kullanıcıların/rollerin veritabanı yönetim sistemi üzerindeki haklarını ifade eder.

    • SUPERUSER, CREATEDB, CREATEROLE, CREATEUSER, INHERIT, LOGIN, REPLICATION, BYPASSRLS, NOSUPERUSER, NOCREATEDB, NOCREATEROLE, NOCREATEUSER, NOINHERIT, NOLOGIN, NOREPLICATION, NOBYPASSRLS

Nesne Yetkileri

  • Kullanıcıların/rollerin veritabanı nesneleri (tablo, görünüm, fonksiyon vb.) üzerindeki haklarını ifade eder.
  • Nesnelerin türüne göre (tablo, görünüm, fonksiyon) aşağıdaki yetkiler verilir.
    • SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER,
    • CREATE, CONNECT, TEMPORARY, EXECUTE, USAGE ...

Kullanıcı/Rol Katalogları

  • Oturum yetkilendirmesini postgres rolü olarak ayarla (Bu işlemin yapılabilmesi için superuser yetkisi gereklidir).
  • Böylelikle işlemler, postgres rolünün yetkileriyle yapılabilecektir.
SET SESSION AUTHORIZATION "postgres";
  • pg_authid ve pg_roles kataloğunu sorgula.
  • Bu kataloglarda roller hakkında bilgi mevcuttur.
SELECT * FROM "pg_authid";
SELECT * FROM "pg_roles";
  • pg_user kataloğunu sorgula.
SELECT * FROM "pg_user";

Kullanıcı/Rol Oluşturma/Değiştirme İşlemleri

  • Hiç bir yetkisi olmayan rol oluştur.
  • Rolün aynı zamanda şifesi de mevcut değildir.
CREATE ROLE "rol1";
  • SUPERUSER yetkisi olan rol oluştur.
  • SUPERUSER, nesnelerle ilgili herseyi yapma yetkisine sahiptir.
CREATE ROLE "rol2" WITH SUPERUSER;
  • Roller oluşturulduktan sonra düzenlenebilir.
ALTER ROLE "rol1" WITH SUPERUSER CREATEDB;
ALTER ROLE "rol1" WITH NOSUPERUSER;
ALTER ROLE "rol1" WITH LOGIN;
ALTER ROLE "rol1" WITH NOLOGIN;
  • abc şifresine sahip "kullanici1" adında bir kullanıcı oluştur.
  • abc şifresi MD5 algoritması ile kodlanır (Kullanılacak algoritma postgresql.conf içerisinde değiştirilebilir).
CREATE USER "kullanici1" WITH PASSWORD 'abc';
  • CREATE USER, CREATE ROLE ifadesinin bir takma isimdir.

  • Aralarındaki fark LOGIN seçeneğidir.

  • CREATE USER ifadesi varsayılan olarak LOGIN yetkili rol oluşturur.

  • CREATE ROLE ifadesi varsayılan olarak LOGIN yetkisi olmayan rol oluşturur.

  • 8.1 ile birlikte user ve group kavramı yerine rol kavramı getirildi.

  • Bir rol, user olabilir, group olabilir veya ikisi birden olabilir.

CREATE ROLE "rol3" WITH PASSWORD 'abc' LOGIN;
  • Şifre kodlanarak saklanır.
  • Şifrenin son geçerlilik tarihi de belirtilir.
CREATE ROLE "kullanici4" WITH PASSWORD 'abc' VALID UNTIL '2020-01-01';

psql - Kullanıcı/Rol Oluşturma/Değiştirme İşlemleri

  • Örnek
postgres=# CREATE USER testk1 WITH PASSWORD '111111';

CREATE ROLE

postgres=#

postgres=# \du

                                   List of roles
                                   
 Role name |                         Attributes                         | Member of
 
-----------+------------------------------------------------------------+-----------

 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 
 testk1    |                                                            | {}

postgres=#

postgres=# CREATE ROLE testk2 WITH PASSWORD '111111';
CREATE ROLE
postgres=# \du
                                   List of roles
 Role name |                         Attributes                         | Member of
-----------+------------------------------------------------------------+-----------
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 testk1    |                                                            | {}
 testk2    | Cannot login                                               | {}

postgres=#
  • Örnek
postgres=# CREATE ROLE testk3 WITH PASSWORD '111111' LOGIN;
CREATE ROLE
postgres=# \du
                                   List of roles
 Role name |                         Attributes                         | Member of
-----------+------------------------------------------------------------+-----------
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 testk1    |                                                            | {}
 testk2    | Cannot login                                               | {}
 testk3    |                                                            | {}

postgres=#
  • Örnek
postgres=# CREATE ROLE testk4 WITH PASSWORD '111111' LOGIN CREATEDB;
CREATE ROLE
postgres=# \du
                                   List of roles
 Role name |                         Attributes                         | Member of
-----------+------------------------------------------------------------+-----------
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 testk1    |                                                            | {}
 testk2    | Cannot login                                               | {}
 testk3    |                                                            | {}
 testk4    | Create DB                                                  | {}

postgres=#
  • Örnek
postgres=# ALTER ROLE testk2 WITH LOGIN;
ALTER ROLE
postgres=# \du
                                   List of roles
 Role name |                         Attributes                         | Member of
-----------+------------------------------------------------------------+-----------
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 testk1    |                                                            | {}
 testk2    |                                                            | {}
 testk3    |                                                            | {}
 testk4    | Create DB                                                  | {}

postgres=#
  • Örnek
postgres=# DROP ROLE testk2;
DROP ROLE
postgres=# \du
                                   List of roles
 Role name |                         Attributes                         | Member of
-----------+------------------------------------------------------------+-----------
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 testk1    |                                                            | {}
 testk3    |                                                            | {}
 testk4    | Create DB                                                  | {}

postgres=#

Kullanıcı/Rol Silme İşlemleri

DROP USER "kullanici1";
DROP ROLE "rol1";
  • Nesne oluşturulurken, CREATE komutunu çalıştıran rol, bu nesnenin sahibi olarak belirlenir.
  • Nesne sahibi (ya da SUPERUSER) nesne üzerindeki tüm haklara sahiptir.
  • Veritabanı sahibi olan bir rolü silmeden önce veritabanı sahipliğini başka bir role aktarmalıyız.
  • Bu işlemi ALTER DATABASE ile yapabiliriz.
CREATE ROLE "rol1";
ALTER DATABASE "NorthWind" OWNER TO "rol1";
DROP ROLE "rol1";

-- Kernel error: ERROR:  role "rol1" cannot be dropped because some objects depend on it DETAIL: owner of database NorthWind
ALTER DATABASE "NorthWind" OWNER TO "postgres";
DROP ROLE "rol1";
  • Veritabanı sahibi olan bir rolü silmeden önce veritabanı sahipliğini başka bir role aktarmalıyız.
  • Bu işlemi REASSIGN ile de yapabiliriz.
CREATE ROLE "rol1";
ALTER DATABASE "NorthWind" OWNER TO "rol1";
DROP ROLE "rol1";

-- Kernel error: ERROR:  role "rol1" cannot be dropped because some objects depend on it DETAIL:  owner of database NorthWind
  • "rol1" in sahibi olduğu tüm nesnelerin yeni sahibini "postgres" olarak belirle.
REASSIGN OWNED BY "rol1" TO "postgres";
DROP ROLE "rol1";
  • Bir rolü grup gibi kullanabiliriz.
  • Diğer rollerin bu rolden yetkilerini kalıtım olarak almasını temin edebiliriz.
CREATE ROLE "gruprol";
CREATE ROLE "rol1";
  • rol1 isimli rolün yetkilerine gruprol isimli rolün yetkilerini de ekle.
  • Temel yetkiler kalıtım olarak alınmaz. Yalnızca grubun nesneler üzerindeki yetkileri kalıtım olarak alınır.
GRANT "gruprol" TO "rol1";
  • Bunun yapılabilmesi için rol1 isimli rolün kalıtım alma özelliğine sahip olması gerekir. (Postgresql in yeni sürümlerinde rol oluşturulduğunda INHERIT yetkisi veriliyor)
  • Diğer bir deyişle INHERIT yetkisine sahip olması gerekir.
  • Bu yetki yoksa, yetkiler kalıtım alınmaz.
ALTER ROLE "rol1" WITH INHERIT;  
CREATE ROLE "rol2" WITH INHERIT;
GRANT "gruprol" TO "rol2";
  • rol1 isimli role verilmiş yetkilerin (gruprol yetkileri) geri alınması.
REVOKE "gruprol" FROM "rol1";

Yetkilendirme İşlemleri

PUBLIC: Tüm roller / kullanıcılar.
kullaniciAdi: Tek bir kullanıcı.
ALL: Tüm yetkiler.

  • rol1 isimli role customers tablosu üzerinde seçim yapma yetkisi ver.
GRANT SELECT ON "customers" TO "rol1";
  • Tüm rollere customers tablosu üzerinde kayıt ekleme yetkisi ver.
GRANT INSERT ON "customers" TO PUBLIC;
  • rol1 isimli kullanıcıya customers tablosu üzerinde tüm yetkileri ver.
GRANT ALL ON "customers" TO "rol1";
  • rol1 isimli rolün customers tablosu üzerindeki güncelleme yetkisini geri al.
REVOKE UPDATE ON "customers" FROM "rol1";
  • rol1 isimli rolün customers tablosu üzerindeki tüm yetkilerini geri al.
REVOKE ALL ON "customers" FROM "rol1";
  • rol1 kullanicisinin Sema1 icerisindeki nesnelere ait tüm yetkileri geri alinir.
REVOKE ALL ON SCHEMA "Sema1" FROM "rol1";
  • Herhangi bir nesne üzerinde yetkiye sahip olan bir rolü silemeyiz.
CREATE ROLE "rol1";
GRANT SELECT ON "customers" TO "rol1";
DROP ROLE "rol1"; 

-- Kernel error: ERROR:  role "rol4" cannot be dropped because some objects depend on it DETAIL:  privileges for table customers
  • rol1 in sahibi olduğu tüm nesneleri sil (kısıtlar ihlal edilemez)
DROP OWNED BY "rol1";
DROP ROLE "rol1";

Örnek (Northwind Veri Tabanı)

CREATE ROLE "rol1";
SET SESSION AUTHORIZATION "rol1";
SELECT * FROM "customers"; 

-- Kernel error: ERROR:  permission denied for relation customer
  • rol1 seçme hakkına sahip olmadigi icin hata oluşur.
GRANT SELECT ON "customers" TO "rol1"; 
  • Yetkilendirme yapabilmek için oturum yetkilendirmesini "postgres" kullanıcısı şeklinde ayarla.
SET SESSION AUTHORIZATION "postgres";
  • rol1, kullanıcısına "customers" tablosu üzerinde seçme yetisi ver.
GRANT SELECT ON "customers" TO "rol1";
SET SESSION AUTHORIZATION "rol1";
  • Sorgu çalışır.
SELECT * FROM "customers";

Fonksiyonlar ve Yetkilendirme

CREATE OR REPLACE FUNCTION "milKMDonustur"(degerMil REAL, OUT degerKM REAL)
AS $$
BEGIN
    degerKM = degerMil * 1.6;
END;
$$
LANGUAGE plpgsql;
SET SESSION AUTHORIZATION "rol1";
SELECT * FROM "milKMDonustur"(3);
SET SESSION AUTHORIZATION "postgres";
REVOKE ALL ON FUNCTION "milKMDonustur"(REAL, OUT REAL) FROM "rol1";
  • Aşağıdaki ifade çalışır. Fonksiyonlar PUBLIC grubu için varsayılan olarak çalıştırılırlar.
SELECT * FROM milKMDonustur(3);
SET SESSION AUTHORIZATION "postgres";
REVOKE ALL ON FUNCTION "milKMDonustur"(REAL, OUT REAL) FROM PUBLIC;
SET SESSION AUTHORIZATION "rol1";
  • Aşağıdaki ifade çalışmaz.
SELECT * FROM milKMDonustur(3);

Şifreleme

  • Kullanici şifreleri ve gizli bilgiler açık olarak saklanmamalıdır.

  • Linux

sudo apt-get install postgresql-contrib
  • Kripto eklentisini oluştur.
CREATE EXTENSION "pgcrypto";
  • "sifrem" şifresini sha512 algoritması ile kodla.
SELECT ENCODE(DIGEST('sifrem', 'sha512'), 'hex');
  • "sifrem" şifresini md5 algoritması ile kodla ve sonucu "md5" ifadesi ile birleştir.
SELECT 'md5'|| MD5('sifrem');