Daha önceki yazımızda Data Redaction konusuna giriş yaparak bir verinin nasıl maskelenebileceğini teorik olarak anlatmıştık. Bugün teorik bilgilerimizi Oracle Database 19C üzerinde pratiğe dökeceğiz.
Önemli : Oracle Data Redaction , ayrı lisanslama ( Oracle Advanced Security ) ile gelmektedir. Lisansınız olmadan kullanmamanız gerekir.
Ben çalışmalarımı Oracle Database ile gelen örnek şemalardan ” HR ” ile yapacağım. Siz farklı bir şema üzerindeki tabloda çalışabilir yada aşağıdaki işlemler ile ” HR ” kullanıcısını yükleyebilirsiniz.
- HR kullanıcısı için bir parola belirletin
- HR kullanıcısı için tablespace belirleyin, boş geçerseniz default tablespace alır
- HR kullanıcısı temp tablespace belirleyin, boş geçerseniz default temp tablespace alır.
- Boş geçin
- HR kullanıcısı için Log lokasyonu belirlerleyin, boş geçerseniz default lokasyonu alır.
$ sqlplus / as sysdba
SQL> @?/demo/schema/human_resources/hr_main.sql
specify password for HR as parameter 1:
Enter value for 1:
specify default tablespace for HR as parameter 2:
Enter value for 2:
specify temporary tablespace for HR as parameter 3:
Enter value for 3:
specify password for SYS as parameter 4:
Enter value for 4:
specify log path as parameter 5:
Enter value for 5:
PL/SQL procedure successfully completed.
User created.
.
.
.
.
.
.
PL/SQL procedure successfully completed.
Kullanacımız oluştuğuna göre artık pratiğe başlayabiliriz. Çalışmamı HR kullanıcısında EMPLOYEES tablosu üzerinde yapacağım. Bu tablo personel bilgilerini ve özellikle maaş alanını tutuyor.
Klasik bir sorgu ile bütün tabloyu alanları ile birlikte bir görelim.
SQL> SELECT * FROM HR.EMPLOYEES
İlk bölümde anlattığım sıraya göre işlemleri yapacağım.
İlk olarak Full Redaction ile başlıyoruz. Öncelike SALARY alanı için işlem yapacağım. Aşağıdaki kod bloğu çalıştığında HR kullanıcısı bu alanı olması gerektiği gibi görürken, diğer kullanıcılar burayı ” 0 ” olarak görecekler.
BEGIN
DBMS_REDACT.add_policy (object_schema => 'HR',
object_name => 'EMPLOYEES',
column_name => 'SALARY',
policy_name => 'SALARY_KOLONO_ICIN_REDACTION',
function_type => DBMS_REDACT.full,
expression => '1=1');
END;
/
HR kullanıcım ile tabloya sorgu atıyorum. Resimde görüldüğü üzere herşey düzgün.
SQL> SELECT * FROM HR.EMPLOYEES
Şimdi farklı bir kullanıcı ile aynı sorguyu çalıştırıyorum. Diğer kullanıcılar görüldüğü üzere Data Redaction işlemine takıldığı için ” 0 ” olarak görüyor.
SQL> SELECT * FROM HR.EMPLOYEES
İlk bölümde anlattığımız üzere tekrar hatırlatmakta fayda gördüğüm bir bilgi var.
- Full Redaction default değeri ” 0 ” dır. Sütunda bulunan veri tipi NUMBER olarak görünüyorsa , ” 0 ” karakter bir veri türü görünüyorsa boşluk ile değiştirilir.
- SYSDBA ve DBA yetkilerine sahip kullanıcılar bu kurallardan etkilenmezler.
Peki biz aynı kod bloğunu örneğin FIRST_NAME alanı için yaparsak ne olur ?
BEGIN
DBMS_REDACT.alter_policy (object_schema => 'HR',
object_name => 'HR.EMPLOYEES',
column_name => 'FIRST_NAME',
policy_name => 'SALARY_KOLONO_ICIN_REDACTION',
function_type => DBMS_REDACT.full,
expression => '1=1');
END;
/
Görüldüğü gibi NUMBER değere sahip olan SALARY alanı ” 0 ” olurken, VARHCAR olaran ” FIRST_NAME ” alanı boş geldi.
SQL> SELECT * FROM HR.EMPLOYEES
Diğer bir modelimizde Partial. Bu redaction ile soldan sağa olacak şekilde rakam bastırabiliyoruz. Örneğin 6 haneli bir maaşın ilk üç hanesini ” 1 ” yapalım.
BEGIN
DBMS_REDACT.alter_policy (object_schema => 'HR',
object_name => 'EMPLOYEES',
policy_name => 'SALARY_KOLONO_ICIN_REDACTION',
action => DBMS_REDACT.modify_column,
column_name => 'SALARY',
function_type => DBMS_REDACT.partial,
function_parameters => '1,1,3');
END;
/
HR kullanıcımız ile herşey normal. Birde farklı bir kullanıcı ile deneyelim.
SQL> SELECT * FROM HR.EMPLOYEES
Görüldüğü gibi diğer kullanıcılar ilk üç haneyi ” 1 ” olarak kalan haneleri normal görüyorlar.
SQL> SELECT * FROM HR.EMPLOYEES
Şimdi Random Redaction özelliğine bir bakalım. Bu sefer bir değişiklik yapıp, PHONE_NUMBER alanında çalışacağız. Örnek kod bloğumuz aşağıdaki gibi.
BEGIN
DBMS_REDACT.alter_policy (object_schema => 'HR',
object_name => 'EMPLOYEES',
policy_name => 'SALARY_KOLONO_ICIN_REDACTION',
action => DBMS_REDACT.add_column,
column_name => 'PHONE_NUMBER',
function_type => DBMS_REDACT.RANDOM);
END;
/
HR kullanıcımla bir bakıyorum. Herşey normal
SQL> SELECT * FROM HR.EMPLOYEES
Farklı bir kullanıcı ile aynı sorguyu tekrar çalıştırıyorum. Görüldüğü gibi PHONE_NUMBER alanı random karakter ile geldi.
SQL> SELECT * FROM HR.EMPLOYEES
Oracle Data Redaction konumuzun sonuna geldik. Görüldüğü gibi gayet basit ve en önemlisi veri tabanımız için ek yük getirmeyen bir özellik.
Diğer yazılarımızda görüşmek dileğiyle,
Kaynak;
https://docs.oracle.com/cd/E11882_01/network.112/e40393/redaction.htm#ASOAG594