Oracle Virtual Private Database

Posted by | Aralık 03, 2013 | Database, Security | No Comments

Virtual Private Database (VPD), ilk kez Oracle 8i ile hayatımıza giren, Oracle Database 11g Enterprise Edition’un en öne çıkan güvenlik çözümü özelliklerinden biridir.Nesne hakları ve veritabanı rolleri ile ilişkili uygulamaların yetersiz güvenlik sorunlarının giderilmesinde kullanılır.İhtiyaçlara göre; çok basit kurallardan (çalışma saatleri dışında veriye erişimin engellenmesi ) en komplike yapılara ( satır seviyesinde güvenliğin sağlanması ) kadar geniş bir yelpazede çalışma imkanı sunar.Kullanıcının veriye hangi yolla eriştiğine bakmaksızın ( uygulama,web arayüzü, sql plus vb.) geniş ve esnek bir  yapı sunar.

Şimdi bu özelliği bir örnek yardımıyla anlamaya çalışalım. Öncelikle makinemizde Oracle Database11gR2 kurulu olmalıdır. Ayrıca örneğimizde kullanacağımız vpd_groups.zip  dosyasını indiriniz ve uygun bir yere açınız. Bunları tamamladıktan sonar çalışmamıza başlayabiliriz. APP_Server kullanıcısının yaratılması Öncelikle bir browser yardımıyla Enterprise Manager’a erişelim.

image002

Anasayfadaki  Server Tabına tıklayalım.

image003

Security bölümünde Users linkine tıklayalım.

image004

Create butonuna tıklayalım.

image005

Gelen ekranda General sekmesinde aşağıdaki bilgileri girelim ve/veya seçelim.
Name : app_server
Profile : DEFAULT
Authentication : Password
Enter Password :  Welcome1
Confirm Password : Welcome1
Default Tablespace  : EXAMPLE
Temporary Tablespace  : TEMP
Status : Unlock
Girişleri tamamladığımızda ekranımız aşağıdaki şekilde olacaktır. Daha sonra System Privileges sekmesine tıklayalım.

image006

Edit List butonuna tıklayalım.

image007

Sol taraftaki yetkilerden kaydırma çubuğu yardımıyla CREATE TABLE yetkisini verelim.

image008

Quotas tabına tıklayalım.

image009

EXAMPLE tablespace için Unlimited seçelim.

image010

OK butonuna tıklayarak kullanıcımızı yaratalım.

image011

Aşağıdaki mesajı aldığınızda kullanıcınız başarıyla oluşturulmuş demektir.

image012

SEC_ADMIN kullanıcısının yaratılması

Bir önceki adımda yarattığımız gibi aşağıdaki bilgilerle ve sec_admin ismiyle yeni bir kullanıcı yaratacağız.
Name : sec_admin
Profile : DEFAULT
Authentication : Password
Enter Password :  Welcome1
Confirm Password : Welcome1
Default Tablespace  : EXAMPLE
Temporary Tablespace  : TEMP
Status : Unlock

image013

System Privileges sekmesinden  CREATE ANY CONTEXT ,CREATE PROCEDURE ve SELECT ANY DICTIONARY yetkilerini verelim ve OK butonuna tıklayarak kullanıcıyı oluşturalım.

image014

SYS kullanıcısı ile Enterprise Manager’a tekrar bağlanalım.

image015

Anasayfadan Server sekmesine tıklayalım.

image016

Security bölümünde Users’a tıklayalım.

image017

Object Name alanına sec_admin yazalım ve Go butonuna tıklayalım.

image018

Edit butonuna tıklayalım.

image019

Object Privileges sekmesine tıklayalım.

image020

Select Object Type menüsünde Package seçelim ve Add butonuna tıklayalım.

image021

Select Package Objects alanına SYS.DBMS_RLS yazalım ve Available Privileges bölümündeki EXECUTE yetkisini seçelim.

image022

Apply butonuna tıklayalım.

image023

İşlem tamamlandığında aşağıdaki mesajı alacaksınız.

image024

SQL *Plus’a APP_SERVER kullanıcısı ile bağlanalım.

image025

Daha önce download ettiğiniz vpd_groups.zip dosyası içindeki cr_rfid_data.sql  scriptini çalıştıralım.

image026

VPD Kural Gruplarının Yaratılması : 

sec_admin kullanısıyla Enterprise Manager’a bağlanalım.

image027

Server tabına tıklayalım.

image028

Security bölümündeki Virtual Private Database’e tıklayalım.

image029

Advanced tabına tıklayalım.

image030

Create butonuna tıklayalım ve yeni bir VPD policy group tanımlayalım.

image031

Aşağıdaki değerleri ilgili alanlara girelim ve OK butonuna tıklayalım.
Policy Group Name : provider_a_group
Object Name : APP_SERVER_RFID_DATA

image032

İşlem tamamlandığında aşağıdaki mesajı alacaksınız.

image033

Aynı  şekilde provider_b_group ismiyle ikinci bir grup yaratalım. İşlem tamamlandığında aşağıdaki mesajı alacaksınız.

image034

Kural Foksiyonunun Yaratılması :

Enterprise Manager anasayfada Schema tabına tıklayalım.

image035

Programs bölümünde Functions’a tıklayalım.

image036

Create tuşuna tıklayalım.

image037

Aşağıdaki bilgileri ilgili alanlara girelim ve OK butonuna tıklayalım.
Name : f_hide_cols
Schema : SEC_ADMIN
Source : (schema in varchar2, tab in varchar2) return varchar2 as predicate                      varchar2(8) default ‘1=2’; begin return predicate; end;

image038

İşlem tamamlandığında aşağıdaki mesajı alacaksınız.

image039

Kuralların Gruplara uygulanması :

Anasayfada Server tabına tıklayalım.

image040

Security kısmında Virtual Private Database’e tıklayalım.

image041

Advanced tabını seçelim.

image042

PROVIDER_A_GROUP’u seçelim ve Manage butonuna tıklayalım.

image043

Manage Group Policies bölümünde Add butonuna tıklayalım.

image044

Policy Name alanına hide_cols_b_from_a yazalım ve Policy Type kısmında SHARED_CONTEXT_SENSITIVE seçelim. Enabled kısmının seçili olduğundan
emin olalım. Policy Function kısmına SEC_ADMIN.F_HIDE_COLS yazalım.

image045

Enforcements kısmında SELECT kutucuğunu , Security Relevant Columns kısmında Enable Column Masking Behavior kutucuğunu işaretleyelim ve Add butonuna tıklayalım.

image046

STORAGE_B ve DATE_B kutucuklarını işaretleyelim ve Select butonuna tıklayalım.

image047

Add Policy sayfasına döndüğünüzde Continue butonuna tıklayalım.

image048

Manage Policy Group: PROVIDER_A_GROUP sayfasında OK butonuna tıklayalım.

image049

Aynı işlemi  PROVIDER_B_GROUP için de yapalım.  PROVIDER_B_GROUP
seçelim ve Manage butonuna tıklayalım.

image050

Manage Group Policies bölümünde Add butonuna tıklayalım.

image051

Policy Name alanına hide_cols_a_from_b yazalım ve Policy Type kısmında SHARED_CONTEXT_SENSITIVE seçelim. Enabled kısmının seçili olduğundan emin olalım. Policy Function kısmına SEC_ADMIN.F_HIDE_COLS yazalım.

image052

Enforcements kısmında SELECT kutucuğunu , Security Relevant Columns kısmında Enable Column Masking Behavior kutucuğunu işaretleyelim ve Add butonuna tıklayalım.

image046

STORAGE_A ve DATE_A seçelim ve Select butonuna tıklayalım.

image053

Add Policy sayfasına döndüğünüzde Continue butonuna tıklayın.

image054

Manage Policy Group: PROVIDER_B_GROUP sayfasında OK butonuna tıklayalım.

image055

İşlem tamamlandığında aşağıdaki mesajı alacaksınız.

image056

Paketin Oluşturulması   :

Enterprise Manager Anasayfada  Schema tabına tıklayalım.

image057

Programs bölümünde Packages’a tıklayalım.

image058

Create butonuna tıklayalım.

image059

Aşağıdaki bilgileri ilgili alanlara girelim ve OK butonuna tıklayalım.
Name : provider_package
Schema : SEC_ADMIN
Source :  as procedure set_provider_context; end;

image060

İşlem tamamlandığında aşağıdaki mesajı alacaksınız.

image061

Object Type menüsünden Package Body seçelim ve Create butonuna tıklayalım.

image062

Aşağıdaki bilgileri ilgili alanlara girelim ve OK butonuna tıklayalım.
Name : provider_package
Schema : SEC_ADMIN
Source :  AS procedure set_provider_context IS begin CASE                                                       lower(sys_context(‘userenv’,’client_identifier’)) WHEN ‘provider_a’                   then dbms_session.set_context (‘provider_ctx’, ‘policy_group’,                             ‘PROVIDER_A_GROUP’); WHEN ‘provider_b’ then dbms_session.                         set_context (‘provider_ctx’, ‘policy_group’ , ‘PROVIDER_B_GROUP’);                 END CASE; end set_provider_context; end;

image063

İşlem tamamlandığında aşağıdaki mesajı alacaksınız. Database tabına tıklayarak anasayfaya geri dönelim.

image064

Application Context’lerin  Yaratılması :

Server tabına tıklayalım.

image065

Security bölümünde Application Context ‘e tıklayalım.

image066

Create’e tıklayalım.

image067

Namespace alanına PROVIDER_CTX, Package Name alanına SEC_ADMIN.PROVIDER_PACKAGE yazalım ve Type bölümünde Secure session based – Accessed Locally seçeneğini işaretleyelim.

image068

Driving Context bölümünde Add butonuna tıklayalım.

image069

Object Name alanına  APP_SERVER.RFID_DATAAttribute alanına ise policy_group yazalım ve Continue butonuna tıklayalım.

image070

Create Application Contexts sayfasına döndüğünüzde OK butonuna tıklayalım.

image071

İşlem tamamlandığında aşağıdaki mesajı alacaksınız.

image072

Pakete işletme yetkisinin verilmesi :

Enterprise Manager anasayfada Server sekmesine tıklayalım.

image073

Security bölümünde Users’a tıklayalım.

image074

APP_SERVER kullanıcısını seçelim ve Edit butonuna tıklayalım.

image075

Object Privileges sekmesine tıklayalım.

image076

Select Object Type bölümünde Package seçelim ve Add butonuna tıklayalım.

image077

Select Package Objects bölümüne  sec_admin.provider_package yazalım ve Availible Privileges altındaki EXECUTE yetkisini verelim.

image078

OK butonuna tıklayalım.

image079

Apply butonuna tıklayalım.

image080

İşlem tamamlandığında aşağıdaki mesajı alacaksınız.

image081

Bu noktada gerekli tüm altyapımızı tamamlamış bulunuyoruz. Uygulamamızı kontrol edebilmemiz amacıyla; APP_SERVER kullanıcısı ile SQL*Plus’a bağlanalım.

image082

Çalışmamızın başında indirdiğimiz zip dosyası içindeki exec_pkg_a.sql scriptini çalıştıralım.
Bu script contextleri provider_a’ya döndürmekte ve grup tabanlı kural içeriklerini düzenlemek için PROVIDER_PACKAGE.SET_PROVIDER_CONTEXT
prosüdürünü çalıştırmaktadır. Sorgu sonucunda RFID_DATA tablosu sorgulanmakta ve provider_a kullanıcısı sadece kendisine izin verilen kayıtları, STORAGE_A ve DATE_A kolonlarındaki kayıtları görebilmektedir.

image083

exec_pkg_b.sql scriptini çalıştıralım. Bu script contextleri provider_b’ye döndürmekte ve grup tabanlı kural içeriklerini düzenlemek için PROVIDER_PACKAGE.SET_PROVIDER_CONTEXT prosüdürünü çalıştırmaktadır. Sorgu sonucunda RFID_DATA tablosu sorgulanmakta ve provider_b kullanıcısı sadece kendisine izin verilen kayıtları, STORAGE_B ve DATE_B kolonlarındaki kayıtları görebilmektedir.

image084

 

Leave a comment

Your email address will not be published. Required fields are marked.