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.
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.
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.
Ö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ı:
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.
İ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