Hurriyet

9 Ocak 2014 Perşembe

Oracle Veritabani: Oracle Virtual Private Database(VPD)

Oracle Virtual Private Database Nedir?

Oracle Virtual Private Database(VPD) ile kendimize güvenlik politikalari oluşturulabiliriz. Burada güvenlik politikalariyla database'e erişimi satır ve sütun bazında kısıtlayabiliriz. Oracle VPD aynı zamanda ilgili view'a
synoynm'e veya tablo'ya gelen sorgulara dinamik bir 'where' ifadesi atar.


Oracle VPD ile güvenlik seviyesini en alt seviyeye kadar indirebiliriz. Bu şekilde istediğimiz nesneler üzerinde select, insert, update ve delete gibi ifadeleri ve işlemleri engelleyebiliriz. Bu işlemleri aynı zamanda trigger ile de yapabiliriz.


VPD oluşturulmasi icin ilk önce bir fonksiyon oluşturulması gereklidir. Bu fonksiyon ile ilgili objectler üzerine gelen ifadelere bir where ifadesi atariz. Bir de fonksiyonumuzu atayabileceğimiz bir policy'mizin olmasi gerekir.


VPD Örnek Durum:

Örneğin 3 insan kaynakları direktörümüz olsun. Bunlar Mert, Ali ve Metin olsun. Mert bütün maaşları görebilirken, Ali 2000 den küçük maaşları görebilmektedir. Metin ise 1000 den küçük maaşları görebilmektedir.


Policy Yaratılması:

İlk aşamada VPD için bir Policy yaratılması gereklidir.


 BEGIN  
   
 SYS.DBMS_RLS.CREATE_POLICY_GROUP  
   
 (  
   
 object_schema => 'SCOTT'  
   
 ,object_name => 'EMP'  
   
 ,policy_group => 'COMPANY_POLICIES'  
   
 );  
   
 END;  

Buradaki policy_group adını biz kendimiz belirlemekteyiz. Bizim girdiğimiz diğer parametreler ise veritabanında üzerine policy yaratacağımız nesnenin adı ve schemasıdır. Bunları da girip policy'i yaratırız.

Ertesinde Policy ile ilgili fonksiyonumuzu yaratırız.

Policy Fonksiyonunun Yaratilmasi:

Yaratacağımız olan fonksiyon'da gerekli değerlendirme şartlarını içeren bir algoritma kurarız. Bu algoritma mutlaka varchar2 bir değer geri döndürmelidir.

 CREATE OR REPLACE FUNCTION auth_emps (  
   
 schema_var IN VARCHAR2, --required  
   
 table_var IN VARCHAR2 --required  
   
 )  
   
 RETURN VARCHAR2  
   
 IS  
   
 return_val VARCHAR2 (400);  
   
 BEGIN  
   
 return_val :=  
   
 CASE USER  
   
 WHEN 'USER10'  
   
 THEN 'DEPTNO = 10'  
   
 WHEN 'USER20'  
   
 THEN 'DEPTNO = 20'  
   
 WHEN 'USER30'  
   
 THEN 'DEPTNO = 30'  
   
 ELSE NULL  
   
 END;  
   
 RETURN return_val;  
   
 END auth_emps; 

Burada belirlediğimiz fonksiyonda kullanıcının adınıa göre görünteleyebileceği departmanlar belirlenir.

Fonksiyonun Policy'e attach edilmesi:

Yukarıdaki gibi fonksiyon yarattıktan sonra bu fonksiyonu yarattığımız policy'e ekleyerek etkinleştiririz.  Burada fonksiyonun neleri değiştireceği ve hangi ifadeler üzerinde etkin olacağı gösterilir. Aşağıdaki örneğimizde bu fonksiyonun etkin olabileceği durumu "Select" olarak belirtmekteyiz.

 BEGIN  
   
 SYS.DBMS_RLS.ADD_GROUPED_POLICY  
   
 (  
   
 Object_schema => 'SCOTT'  
   
 ,Object_name => 'EMP'  
   
 ,policy_group => 'EMP_POLICIES'  
   
 ,policy_name => 'SCOTT_EMPS'  
   
 ,function_schema => 'SCOTT'  
   
 ,policy_function => 'AUTH_EMPS'  
   
 ,statement_types => 'SELECT '  
   
 ,policy_type => dbms_rls.dynamic  
   
 ,long_predicate => FALSE  
   
 ,sec_relevant_cols => 'EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO'  
   
 ,sec_relevant_cols_opt => NULL  
   
 ,update_check => FALSE  
   
 ,enable => TRUE  
   
 );  
   
 END;


Özetle aşamalarımız:

1- Policy'nin genel hatlarıyla yaratılması

2- Policy'nin kullanacağı fonksiyonun yaratılması

3- Policy ile fonksiyonun eşleştirilmesi

Policy'lerle İlgili Diğer Opsiyonlar:

DBMS_RLS.ADD_POLICY - Policy bir tablo, view veya synoym'e atılır.
DBMS_RLS.ENABLE_POLICY - Policy'nin aktifleştirilmesi veya deaktifleştirilmesini sağlar.
DBMS_RLS.DROP_POLICY - Policy'nin silinmesi
Bu policy'lerle ilgili parametreleri görmek için veritabanında paket adını yazıp F4'e basabiliriz.

Policy Tabloları:


 ALL_POLICIES  
 USER_POLICIES  
 ALL_POLICY_GROUPS  
 USER_POLICY_GROUPS  
 ALL_POLICY_CONTEXTS  
 USER_POLICY_CONTEXTS 

Sonuç olarak:

VPD ile sonuç olarak  silinecek, görüntülenecek veya değiştirilecek dataları düzenleyebiliriz. Kullanıcıya uğraşacağı data kümesini küçülterek verebiliriz. Trigger'lar da benzeri bir işlev görür; ancak farklı bir anlamda kullanılırlar.

Hiç yorum yok:

Yorum Gönder