Sayfalar

25 Ocak 2013 Cuma

Veri Sözlüğü ve Kullanıcı Erişim Hakları

Merhaba Arkadaşlar!

Biliyoruz ki Oracle RDBMS; güvenli oluşuyla tercih edilen bir sistemdir. Zaten veritabanına bağlandığınız andan itibaren size verilen yetkilerle hareket etmek durumundasınız. Tabiri caizse bir başkasının şemasında at koşturmanıza izin verilmez :) Her kullanıcı kendi şemasında çeşitli haklara sahip olduğu gibi başkalarının şemalarında da bazı ayrıcalıklara sahiptir. Tahmin edeceğiniz gibi bu hakları veritabanı yöneticileri belirler. Bazen de yetkili olan kullanıcılar kendi şemalarında diğer kullanıcıların neler yapabileceğini belirleyebilirler. Bugün tüm bunların nasıl yapılacağını öğreneceğiz.

Tüm bu hak verme işlemleri PL/SQL ile sağlanır. Veritabanı yöneticileri, kullanıcıyı daha oluştururken bu hakları belirlerler. Kullanıcı aktif olup, veritabanına bağlandığı andan itibaren, bu haklar devreye girerler. Yani DBA sizin ne kadar özgür olmanızı istiyorsa o kadar özgürsünüz demektir :) Bu sınırların ötesine geçemezsiniz.

Takdir edersiniz ki bu hakların verilmesi büyük önem arz eder. Bir kullanıcıya yanlışlıkla maaşların tutulduğu tabloya yazma hakkı verirseniz ve bu kullanıcı da muzur çıkar ve biraz da SQL biliyorsa, tüm şirketi ters yüz edebilir. Bazen öyle durumlar olur ki DBA bile bazı tablolar üzerinde tam yetkili olamaz.Bu açıdan bakıldığında bu konunun önemli olduğunu anlıyoruz. Şimdi; SQL konuları boyunca sürekli veri sözlüğü olarak bahsettiğimiz alan hakkında bilgi vererek konuya başlayalım. Zira bu konu bugünkü konu ile de yakından ilgili.


Veri Sözlüğü(Data Dictionary)
Oracle'da pek çok veritabanı yönetim sisteminde olduğu gibi; veritabanına ait bilgiler yine veritabanında tablolar halinde saklanırlar. Ayrıca bu tabloların okunabilirliğini artırmak adına bu tablolardan görüntüler oluşturulur ve kullanıcıların hizmetine sunulurlar. Yani veri sözlüğü tablolardan ve kullanıcı erişimli görüntülerden oluşur. İşte tüm bu bilgiler (kullanıcılar, kullanıcılara verilen haklar, tablolar üzerindeki kısıtlar, kullanıcıların sahip olduğu tablolar, veritabanı nesneleri v.b.) veri sözlüğü denilen ve tablolar ve görüntülerden oluşan bu alanda tutulurlar. Tüm bu olmazsa olmaz bilgiler Oracle'ın bel kemiğini oluşturur ve SQL ile bu bilgileri görüntüleyebilirsiniz.

Veri Sözlüğü alanının yönetimi tamamen Oracle sunucusu tarafından otomatik olarak yapılır ve kullanıcının müdahale etmesine gerek kalmaz. Daha veritabanı kurulurken veri sözlüğü de oluşturulur ve sonradan yapılan tüm işlemler (tablo oluşturma, sütun isminin değişmesi, sütun eklenmesi gibi) otomatik olarak veri sözlüğüne yansıtılır.

İşin en önemli yanı ise kullanıcıların Veri Sözlüğü tablolarına müdahale edememeleridir. Eğer aksi olsaydı zaten tüm kullanıcılar istedikleri haklarla oynayarak kendilerini en yetkili konuma getirebilirlerdi. Kullanıcılar veri sözlüğüne ekleme yapamaz, kayıt silemez, değiştirme yapamaz. Sadece ve sadece bu bilgileri okuma hakları vardır.

Veri sözlüğündeki tablolar hakkında bilgi edinmek için ilgili komutu çalıştıralım. Komutun çıktısına bakarsak tablonun ismi ve tablonun içeriği hakkındaki yorum bilgisinin saklandığını görürüz.
DESCRIBE DICTIONARY;

Name                           Null     Type
------------------------------ -------- -------------------------
TABLE_NAME                              VARCHAR2(30)
COMMENTS                                VARCHAR2(4000)

2 rows selecte

SYS Kullanıcısı: Veritabanı oluşturulurken otomatik otomatik olarak oluşturulan kullanıcılardan birisi de SYS'dir ve veri sözlüğü tablo ve görüntüleri bu kullanıcının şemasındadır. Diğer kullanıcılar sadece kendilerine verilen haklar kadar veri sözlüğü görüntülerine erişebilirler. Tablolarına erişime izin verilmez. Ayrıca görüntülerin de sadece bir yada birkaçının erişimine izin verilir. SYS tüm nesneleri oluşturabilir ve diğer tüm kullanıcıların nesnelerine erişebilir. Bir de SYSTEM var ki o da veri sözlüğüne erişme hakkına sahiptir. Önemli nesneleri oluşturabilir.

Veri Sözlüğü Görüntüleri: Eğer SQL Developer'ı açar ve SYS isimli kullanıcının şema nesnelerinden görüntüleri expand(genişletirseniz) ederseniz büyük bir dünya ile karşı karşıya kalırsınız. Sayamayacağınız kadar görüntü vardır burada. Bu görüntü isimlerinin genel olarak 3 şekilde başladığını görürsünüz. (Farklı olan yapılar da vardır ama daha çok bu üç tip göze çarpar):

  • USER ile başlayan görüntüler: Veritabanına o anda bağlı olan kullanıcıların sahip olduğu nesneler ve ilgili görüntülerdir. Kullnıcı bu görüntülerden şemasında ne var ne yok görebilir. Şemanızdaki tüm nesnelerin isimlerini, tiplerini, oluşturulma tarihlerini ve diğer faydalı meta verileri buradan takip edersiniz.
    • USER_TABLES: Kullanıcıların sahip olduğu tabloların yapısını gösteren görüntüler.
    • USER_SEQUENCES: Kullanıcıların sahip olduğu sequence'lar.
    • USER_VIEWS: Kullanıcıların sahip olduğu görüntü nesneleri.
  • ALL ile başlayan görüntüler: Veritabanına o anda bağlı olan kullanıcıların sahip olduğu ve kendilerine ait olmayan, yani diğer kullanıcılara ait olan nesnelere erişim haklarının tutulduğu görüntülerdir. Yani kullanıcılar erişim haklarının olduğu nesneleri buradan takip ederler.
    • ALL_OBJECTS: Kullanıcının erişebileceği bütün nesneler hakkında bilgiler burada bulunur.
  • DBA ile başlayan görüntüler: DBA veya DBA kadar yetkili olan kullanıcıların görebileceği görüntülerdir. Veritabanındaki kullanıcıların şemalarında neler var neler yok buradan görülebilir.
    • DBA_USERS: Veritabanındaki kullanıcılar hakkında bilgi saklayan görüntüdür.
    • DBA_TABLESPACES: Veritabanındaki bütün tablo uzayları hakkında bilgileri içeren görüntüdür.
  • V$: Performans ile ilgili görüntülerdir. 
Mesela HR kullanıcısı sahip olduğu bütün nesneleri görmek isterse;
SELECT * FROM user_objects;
36 rows selected.
Sahibi olduğu tabloları görmek isterse;
SELECT TABLE_NAME FROM user_tables;
7 rows selected.
İndeksler ile ilgili bilgileri görmek isterse;
SELECT INDEX_NAME,TABLE_NAME,TABLESPACE_NAME FROM ALL_INDEXES;
126 rows selected.

Diğer nesneler de bu şekilde görülebilirler. Mesela SYS kullanıcısı için bakalım ne kadar nesneye sahip(SQL Developer'a SYS ile bağlanın):

SELECT * FROM USER_OBJECTS;

Normalde Run Script (F5) düğmesi ile çalıştırırsanız 5000 satır getirilir. Ancak Execute Statement (F9) ile çalıştırırsanız 30.929 gibi kocaman bir rakam ile karşılaşırsınız. Demek veri veri sözlüğü denen yer gerçekten devasa ve önemli bir yer. Şimdi erişim haklarına başlayalım:

Erişim Hakları/Ayrıcalıklar
  • Sistem Ayrıcalıkları 
  • Nesne Ayrıcalıkları 
Şimdi bu ayrıcalıkları inceleyelim:

1. Sistem Ayrıcalıkları
Veritabanı üzerindeki işlemleri yöneten ayrıcalıklardır. 100 üzerinde ayrıcalık özelliği içerir. Kullanıcı oluşturma, kullanıcı silme, tabloları silme, tabloları yedekleme gibi ayrıcalıklar bu gruptandır. Veritabanı yöneticisi temel olarak bu gibi ayrıcalıklara sahiptir. Kullanıcılara sistem ayrıcalıklarını DBA'ler kullanıcı oluşturduktan sonra verirler. 

Kullanıcılar veritabanı nesnelerinin sahipleridir. Nesneleri kullanıcılar oluşturur, siler ya da kullanırlar. Kullanıcı oluşturma hakkı DBA ve DBA haklarına eşit haklara sahip olan kullanıcılara verilir. Veritabanı ilk oluşturulduğunda kullanıcı oluşturma ve kullanıcıları yönetme izni SYS ve SYSTEM kullanıcılarındadır. Şimdi bir DBA olduğumuzu varsayalım ve HR kullanıcısı ile SQL Developer'da bir kullanıcı oluşturalım:
CREATE USER  deneme
IDENTIFIED BY deneme;
Error report:
SQL Error: ORA-01031: Yetkiler Yetersiz
01031. 00000 -  "insufficient privileges"
Elbette hata alırız. Çünkü HR kullanıcısı CREATE USER hakkına sahip değildir. Ancak eğer DBA, HR kullanıcısına bu hakkı verebilirse, bu kullanıcı da kullanıcı oluşturabilecektir. Aynı işlemi SYSTEM bağlantısı ile yapalım:
CREATE USER  deneme
IDENTIFIED BY deneme;
CREATE USER succeeded.
deneme ismindeki kullanıcı "deneme" şifresiyle sisteme giriş yapabilir demektir. Eğer deneme kullanıcısı arzu ederse DBA'in kendisi için verdiği bu şifreyi değiştirebilir:
ALTER USER deneme
IDENTIFIED BY yenisifre;
Artık oluşturduğumuz bu kullanıcıya bazı haklar vererek işe başlayabiliriz. Hak verme GRANT, hak silme de REVOKE işlemi ile sağlanır. Mesela HR kullanıcısına kullanıcı oluşturma izni verelim:
GRANT  create user
TO HR;
GRANT succeeded.
Artık HR de kullanıcı oluşturabilecektir. Bir DBA genel olarak; kullanıcı oluşturma, tablo kaldırma ve yedekleme, kullanıcı silme gibi yüksek sistem haklarına sahiptir. Aynı şekilde bir uygulama geliştiricisi de; oturum, tablo, prosedür, sekans, görüntü oluşturma sistem ayrıcalıklarına sahip olur. Mesela yeni oluşturduğumuz deneme kullanıcısını bir uygulama geliştiricisi yapalım:
GRANT  create session, create table, 
       create sequence, create view
TO     deneme;
GRANT succeeded.
HR'ye verdiğimi kullanıcı oluşturma hakkını geri alalım:
REVOKE create user
FROM HR;
REVOKE create succeeded.

Rol İşlemleri: Rol veritabanındaki ayrıcalıkların bir başlık altında toplanmış halidir. Örneğin bir veritabanı yöneticisinin sahip olması gereken tüm haklar bir rolü oluşturur. Böylece birden fazla DBA için sürekli hak verme ayrıntılarını düşünmekten kurtulursunuz ve ilgili rolü DBA'e verirsiniz. Aynı şekilde uygulama geliştiricileri ve normal kullanıcılar için de roller oluşturarak her defasında GRANT ile uzun uzun gerekli ayrıcalıkları vermekten kurtulursunuz. DBA'ler bu roller aracılığıyla veritabanı güvenliğini daha kolay sağlar ve kendisi için bir standart oluşturmuş olur. Kime ne hakkı vermiştim karmaşası da böylelikle engellenir. 

Oracle sisteme ilk kurulduğunda bir kaç rol ile birlikte gelir. Bunlardan birisi de SYSDBA rolüdür. SYS kullanıcısı bu rolü kullanmaktadır. Rol oluştururken;
CREATE ROLE rolismi;
şeklinde oluşturulur. Bir roldeki ayrıcalıkları ise şöyle belirlersiniz:
GRANT ayrıcaliklar TO rolismi;
Oluşturulan ve hakları tanımlanan bir rol kullanıcıya şöyle verilir:
GRANT rolismi TO kullaniciisimleri;
Şimdi az önce deneme kullanıcısına verdiğimiz hakları bir rol altında toplayalım:
CREATE ROLE appMan;
CREATE ROLE succeeded.
GRANT  create session, create table, 
       create sequence, create view
TO     appMan;
GRANT succeeded.
GRANT  appMan
TO     deneme;
GRANT succeeded.

2. Nesne Ayrıcalıkları
Sistem ayrıcalıklarını öğrendikten sonra nesne ayrıcalıklarına bakalım. Sistem ayrıcalıkları daha genel ve yüksek seviyedeki ayrıcalıklardır. Nesne ayrıcalıkları ise "bir nesne üzerinde kullanıcılar hangi haklara sahip olmalı? sorusunun yanıtıdır. Veritabanı nesneleri üzerinde değişim yapma ayrıcalıklarıdır. Bir nesnenin sahibi o nesne üzerindeki tüm haklara sahiptir. Genel sorgu yapısı aşağıdaki gibidir.
GRANT object_priv [(columns)]
ON object
TO {user|role|PUBLIC}
[WITH GRANT OPTION];

İlk satırda ayrıcalıkları belirlersiniz. SELECT, UPDATE, DELETE gibi... Daha sonra eğer dilerseniz ilgili ayrıcalığın yanına parantez açarak içerisine bu ayrıcalığın hangi sütunlarda geçerli olmasını istediğinizi belirtirsiniz. Eğer belirtmezseniz ayrıcalıklar tüm tablo üzerinde geçerli sayılır. İkinci satırda tablo veya ilgili nesne ismini verirsiniz. Üçüncü satırda bu işlemleri hangi kullanıcı veya rol için yaptığınızı belirtirsiniz. Eğer TO PUBLIC derseniz belirttiğiniz ayrıcalık veritabanındaki herkes tarafından kullanılabilir. Son satırı da isteğe bağlı olarak kullanmanız durumunda ilgili kullanıcı kendisine verilen bu hakkı istediği diğer kullanıcılara verme hakkını elde eder.

Şimdi deneme kullanıcımıza bazı nesne ayrıcalıkları verelim:

GRANT SELECT, UPDATE(first_name, last_name)
ON HR.employees
TO deneme, appMan
WITH GRANT OPTION;
GRANT SELECT succeeded.
Burada ne yaptık? Öncelikle belirtilen ayrıcalıklar hem deneme kullanıcısına işlenecek, hem de appMan rolü artık bu ayrıcalıklara sahip olacak. deneme ve appMan; employees tablosunu SELECT ile sorgulayabilecek ancak sadece first_name ve last_name sütunlarını güncelleyebilecekler. Ayrıca deneme ve appMan WITH GRANT OPTION seçeneği sayesinde bu tablo üzerindeki SELECT ve UPDATE haklarını diğer kullanıcılara verme yetkisine sahip olurlar.

Tüm kullanıcıların HR.countries tablosu üzerinde işlem yapabileceği bazı haklar tanımlayalım:
GRANT insert, select, update
ON HR.countries
TO PUBLIC;

Ayrıcalıkları Kaldırma:
Söz dizimi aşağıdaki gibidir:
REVOKE {ayricalik [, ayricalik...]|ALL}
ON nesneadi
FROM {kullaniciadi[, kullaniciadi...]|roladi|PUBLIC}
[CASCADE CONSTRAINTS];

İlk satırda kaldırılmak istenen ayrıcalıklar yada ALL ile hepsi seçilir. İkinci satırda bu ayrıcalıkların hangi nesne üzerinde olduğu bildirilir. Üçüncü satırda ayrıcalıkların hangi rollerden, hangi kullanıcılardan veya tamamından mı kaldırılacağı bildirilir. 

Şimdi deneme kullanıcısı ve appMan rolünden bazı hakları kaldıralım:
REVOKE SELECT, UPDATE
ON HR.employees
FROM deneme, appMan;
REVOKE SELECT, succeeded.
Burada UPDATE(first_name, last_name) olarak belirtemezsiniz. Çünkü bir hak kaldırıldığında tamamen kaldırılır.

Veri Sözlüğünde Ayrıcalık Görüntüleri
Son olarak işlenen bu haklar veri sözlüğünde hangi görüntülerde tutuluyor maddeler halinde bakalım:
  • ROLE_TAB_PRIVS: Rollere verilen tablo hakları
  • ROLE_SYS_PRIVS: Rollere verilen sistem hakları
  • USER_ROLE_PRIVS: Kullanıcıların erişebildiği roller
  • USER_SYS_PRIVS: Kullanıcılara verilen sistem hakları
  • USER_TAB_PRIVS_MADE: Kullanıcı nesnelerine verilen nesne ayrıcalıkları
  • USER_TAB_PRIVS_RECD: Kullanıcıya verilen nesne ayrıcalıkları
  • USER_COL_PROVS_MADE: Sütun bazında nesne ayrıcalıkları
  • USER_COL_PROVS_RECD: Sütun bazında kullanıcıya verilen nesne ayrıcalıkları.
Kolay gelsin! :)

Hiç yorum yok:

Yorum Gönder