Oracle Data Redaction

Ahmet Parpucu
7 min readFeb 20, 2023

--

Merhaba arkadaşlar, bu yazımda sizlere veritabanında saklanan hassas bilgilerin gizlenmesi için geliştirilen Oracle Data Redaction kullanımını anlatacağım.

Oracle Data Redaction, veritabanı üzerinde döndürülen verileri maskelemenize olanak tanır. Bu özellik ile veriler istenilen şekilde maskelenebilir ve veri ihlallerinin önüne geçilebilir. Örneğin, bir şirketin veritabanında saklanan personele ait ücret bilgileri, sosyal güvenlik numaraları veya diğer hassas verilerin diğer kullanıcılar tarafından görüntülenmemesi gerekiyor olabilir. Bu hassas bilgileri filtrelemek veya maskelemek için kullanılır.

Oracle Data Redaction, veri maskelemesini fiziksel olarak yapmaz. Şifreleme “DBMS REDACT” paketine bağlı olarak hazırlanan kurallar dahilinde ve kullanıcı özelinde yapılır. Veri çağrıldığında DMBS_REDACT paketi devreye girerek belirlenen yöntemlerde veriyi sunar.

NOT:
SYSDBA ve DBA yetkilerine sahip kullanıcılar bu kurallardan etkilenmezler. Çünkü DBA rolü, EXEMPT REDACTION POLICY sistem ayrıcalığı verilen EXP_FULL_DATABASE rolünü içerir. Diğer bir unutulmaması gereken husus policy eklenen tablo içinde insert, update, delete gibi DML yetkilerine sahip olan kullanıcıların maskeleme sebebiyle verileri göremediğinden bu işlemleri doğru yapamamasına neden olur.

Data Redaction kullanımı için 4 farklı yöntem bulunmaktadır.

KULLANIM YÖNTEMLERİ

1-FULL REDACTION
Seçilen sütunun tüm karakterlerini maskelemek için kullanılır. Default olarak belirtilen alan numerik değer olduğunda kullanıcılar alanı “0” olarak, varchar2 gibi karakter bazlı bir alansa boşluk “ ” olarak görürler.

BEGIN
DBMS_REDACT.ADD_POLICY (object_schema => 'HR',
object_name => 'EMPLOYEES',
column_name => 'SALARY',
policy_name => 'salary_rdc',
function_type => DBMS_REDACT.full,
expression => '1=1');
END;
/

NOT:
ADD_POLICY parametresi ile yeni policy eklenebildiği gibi ALTER_POLICY ile bir tabloya birden fazla redaction eklenebilir.

BEGIN
DBMS_REDACT.ALTER_POLICY (object_schema => 'HR',
object_name => 'EMPLOYEES',
column_name => 'FIRST_NAME',
policy_name => 'salary_rdc',
function_type => DBMS_REDACT.full,
expression => '1=1');
END;
/

NOT:
Varsayılan değerler dışında istenilen değerler set edilebilir. Değiştirilmek istenen veri tipi ve değer girilir. Sonrasında veritabanının kapatılıp açılması gerekir.

SELECT NUMBER_VALUE FROM REDACTION_VALUES_FOR_TYPE_FULL;
EXEC DBMS_REDACT.UPDATE_FULL_REDACTION_VALUES (number_val => 7);

2-PARTIAL REDACTION
Seçilen sütunun belirlenen belli bir kısmını maskelemeye olanak tanır. Örnek kullanımı aşağıdaki gibidir. Kullanılmak istenen format function_parameters kısmına yazılır. Formatın girilen sütun data type ile uyumlu olması gerekir. Örnek kullanım aşağıdaki gibidir.

BEGIN
DBMS_REDACT.ADD_POLICY (object_schema => 'HR',
object_name => 'EMPLOYEES',
column_name => 'SALARY',
policy_name => 'salary_rdc',
function_type => DBMS_REDACT.PARTIAL,
function_parameters => DBMS_REDACT.REDACT_US_SSN_F5,
expression => '1=1');
END;
/

2a-SABİT KARAKTER FORMATLARI
Posta kodları, kredi kartları için kullanılabilecek parametre kısayollarını içeren hazır formatlardır.

  • 2a/1-DBMS_REDACT.REDACT_US_SSN_F5
    Varchar2 tipindeki sütunların ilk 7 hanesini kendi formatında maskeler.
    (Formatı XXX-XX-… şeklindedir. Ör: Jennifer >> XXX-XX-r)
  • 2a/2-DBMS_REDACT.REDACT_US_SSN_L4
    Varchar2 tipindeki sütunların baştan 7 hane ve sonrasındaki 4 hanesini kendi formatında maskeler. Kelime 11 karakterden fazlaysa diğerlerini yok sayar.
    (Formatı …-..-XXXX şeklindedir. Ör: MichealTayler >> Mic-ea-XXXX)
  • 2a/3-DBMS_REDACT.REDACT_US_SSN_ENTIRE
    Varchar2 tipindeki sütunları karakter sayısına bağlı olarak aşağıdaki formatta maskeler. 11 karakterden fazlaysa diğerlerini yok sayar.
    (Formatı XXX-XX-XXXX şeklindedir. Ör: Micheal >> XXX-XX-)
  • 2a/4-DBMS_REDACT.REDACT_NUM_US_SSN_F5
    Number tipindeki sütunların ilk 5 hanesini maskeler.
  • 2a/5-DBMS_REDACT.REDACT_NUM_US_SSN_L4
    Number tipindeki sütunların son 4 hanesini maskeler.
  • 2a/6-DBMS_REDACT.REDACT_NUM_US_SSN_ENTIRE
    Number tipindeki sütunların ilk 9 hanesini maskeler.
  • 2a/7-DBMS_REDACT.REDACT_ZIP_CODE
    Varchar2 tipindeki sütunları karakter uzunluğu farketmeksizin XXXXX formatında maskeler.
  • 2a/8-DBMS_REDACT.REDACT_NUM_ZIP_CODE
    Number tipindeki sütunların ilk 5 hanesini maskeler.
  • 2a/9-DBMS_REDACT.REDACT_DATE_MILLENNIUM
    Date tipindeki sütunları 01-JAN-00 olarak maskeler.
  • 2a/10-DBMS_REDACT.REDACT_DATE_EPOCH
    Date tipindeki sütunları 01-JAN-70 olarak maskeler.
  • 2a/11-DBMS_REDACT.REDACT_CCN16_F12

2b-KARAKTER VERİ TİPLERİYLE MASKELEME
Varchar2 tipindeki sütunlarda kullanılabilir. Karakter veri tipleriyle maskeleme yapmak için istenilen fonksiyonun belirli kurallara göre oluşturulması gerekir.
Örneğin;

function_parameters  => 'VVVVFVVVVFVVVVFVVVV,VVVV-VVVV-VVVV-VVVV,*,1,12'

bu formata göre, V ve F harflerinin her biri bir karakteri temsil etmektedir. Bu ifadeye göre 1’den 12’ye kadar olan V ile belirtilen alanlar “*” simgesi, F ile belirtilen alanlar ise “-” simgesiyle maskelenmektedir. Buna dayalı olarak format istenilen şekilde biçimlendirilebilir.

2c-NUMARA VERİ TİPLERİYLE MASKELEME
Number tipindeki sütunlarda kullanılabilir. Numara veri tipleriyle maskeleme yapmak için istenilen fonksiyonun belirli kurallara göre oluşturulması gerekir.
Örneğin;

function_parameters  => '5,1,5'

bu formata göre seçilen tablo sütununun 1’den 5’inci karaktere kadar olan kısmı “5” sayısıyla maskelenmektedir. Buna dayalı olarak format istenilen şekilde biçimlendirilebilir.

2d-TARİH-SAAT VERİ TİPLERİYLE MASKELEME
Date tipindeki sütunlarda kullanılabilir. Tarih-saat veri tipleriyle maskeleme yapmak için istenilen fonksiyonun belirli kurallara göre oluşturulması gerekir.
Örneğin;

function_parameters => 'm01d2y2015HMS'

bu formata göre seçilen tablo sütunundaki tüm tarihler mount 01, day 02, year 2015 yani “02-JAN-15” şeklinde maskelenmektedir. Buna dayalı olarak format istenilen şekilde biçimlendirilebilir.

3-REGULAR EXPRESSION-BASED REDACTION
Yalnızca karakter veri tipleri için düzenlenmiştir. Değişken karakter uzunluklarına sahip verilerin tek tipte maskelenmesine olanak tanır. Örneğin mail adreslerinin bulunduğu bir kolonun @ işaretine kadar olan kısmı maskelenebilir. Gerekli olan parametreler şunlardır;

regexp_pattern: Hangi türde maskelenme yapılacağının belirtildiği kısımdır. Bir eşleşme bulursa, regexp_replace_string ayarında belirtilen şekilde verileri maskeler.

regexp_replace_string: Veriler bu kısımda belirtilen şekilde maskelenir.

regexp_position: Maskeleme yapmaya hangi karakterden yapılmaya başlanacağı belirtilir. Default olarak 1 veya RE_BEGINNING yani ilk karakterden itibaren maskeleme yapar. İstenilen n pozitif tam sayı değerleri verilebilir.

regexp_occurrence: Eşleşme bulunduktan sonra hangi karakterlerin maskeleneceği belirlenir. Default olarak 0 veya RE_ALL yani eşleşme bulunduktan sonra patternin eşleşme sağladığı type’a ait tüm karakterlere maskeleme yapar. RE_FIRST parametresi kullanılırsa eşleşme bulunduktan sonraki ilk karaktere maskeleme uygulanır. İstenilen n pozitif tam sayı değerler verilebilir ve sadece eşleşen n’inci karakter maskelenir.

regexp_match_parameter: Varsayılan eşleştirme davranışını değiştirmeye izin verir. Örneğin, eşleşen büyük/küçük harfe duyarsız hale getirmek için, “i” karakterini veya RE_MATCH_CASE_INSENSITIVE parametresi kullanılır.
Örnek kullanımı aşağıdaki gibidir.

BEGIN
DBMS_REDACT.ADD_POLICY (object_schema => 'HR',
object_name => 'EMPLOYEES',
column_name => 'SALARY',
policy_name => 'salary_rdc',
function_type => DBMS_REDACT.full,
expression => '1=1');
regexp_pattern => DBMS_REDACT.RE_PATTERN_ANY_DIGIT,
regexp_replace_string => DBMS_REDACT.RE_REDACT_WITH_SINGLE_X,
regexp_position => DBMS_REDACT.RE_BEGINNING,
regexp_occurrence => DBMS_REDACT.RE_ALL,
regexp_match_parameter => 'i');
END;
/

4-REGEXP PATTERNS

4a-DBMS_REDACT.RE_PATTERN_ANY_DIGIT
Maskeleme yapması için herhangi bir rakam olması gereklidir. regexp_replace_string olarak 2 farklı parametreyle kullanılabilir.

Eşleşme olduğunda istenilen karakteri “X” karakteri ile maskeler.

regexp_pattern        => DBMS_REDACT.RE_PATTERN_ANY_DIGIT,
regexp_replace_string => DBMS_REDACT.RE_REDACT_WITH_SINGLE_X

Eşleşme olduğunda istenilen karakteri “1” karakteri ile maskeler.

regexp_pattern        => DBMS_REDACT.RE_PATTERN_ANY_DIGIT,
regexp_replace_string => DBMS_REDACT.RE_REDACT_WITH_SINGLE_1

4b-DBMS_REDACT.RE_PATTERN_EMAIL_ADDRESS
regexp_replace_string parametresi tarafından belirtilen karakterlere sahip herhangi bir e-posta adresini arar ve “X” karakteri ile maskeler. regexp_replace_string uygun olarak 3 farklı parametreyle kullanılabilir.

Herhangi bir e-posta adresini bulur ve @…com’dan öncesini içeren kullanıcı adını maskeler.

regexp_pattern        => DBMS_REDACT.RE_PATTERN_EMAIL_ADDRESS,
regexp_replace_string => DBMS_REDACT.RE_REDACT_EMAIL_NAME

Herhangi bir e-posta adresini bulur ve …@’dan sonra hotmail gibi domain adreslerini içeren e-posta alanını maskeler.

regexp_pattern        => DBMS_REDACT.RE_PATTERN_EMAIL_ADDRESS,
regexp_replace_string => DBMS_REDACT.RE_REDACT_EMAIL_DOMAIN

Herhangi bir e-posta adresini bulur ve kullanıcı adı, domain kısmını maskeler.

regexp_pattern        => DBMS_REDACT.RE_PATTERN_EMAIL_ADDRESS,
regexp_replace_string => DBMS_REDACT.RE_REDACT_EMAIL_ENTIRE

4c-DBMS_REDACT.RE_PATTERN_IP_ADDRESS
regexp_replace_string parametresi tarafından belirtilen karakterlere sahip bir IP adresi arar ve IP adresinin son bloğunu “999” karakteri ile maskeler. regexp_replace_string uygun olarak DBMS_REDACT.RE_REDACT_IP_L3 parametresi ile kullanılır.

regexp_pattern        => DBMS_REDACT.RE_PATTERN_IP_ADDRESS,
regexp_replace_string => DBMS_REDACT.RE_REDACT_IP_L3

4d-RANDOM REDACTION
Sütunun veri türüne bağlı olarak, her görüntülendiğinde rasgele oluşturulmuş değerler şeklinde maskeleme uygular.

function_type    => DBMS_REDACT.RANDOM

KULLANICILARI MASKELEMEDEN MUAF TUTMA
İstenilen kullanıcılar yapılan tüm maskeleme işlemlerinden muaf tutulabilir.

GRANT EXEMPT REDACTION POLICY TO &USER;

TÜM MASKELEMELERİ GÖRÜNTÜLEME
Eklenen tüm maskelemeleri görüntülemek için;

SELECT
RC.OBJECT_OWNER,
RC.OBJECT_NAME,
RC.COLUMN_NAME,
RC.FUNCTION_TYPE,
RP.POLICY_NAME,
RP.ENABLE
FROM REDACTION_COLUMNS RC
INNER JOIN
REDACTION_POLICIES RP
ON
RC.OBJECT_NAME=RP.OBJECT_NAME;

DATA REDACTION POLICY - DEĞİŞİKLİK YAPMA
Maskeleme eklendikten sonra değişiklik yapmak mümkündür. Bunun için DBMS_REDACT.ALTER_POLICY ile birlikte action parametresi kullanılır.

BEGIN
DBMS_REDACT.ALTER_POLICY (object_schema => 'HR',
object_name => 'EMPLOYEES',
column_name => 'SALARY',
policy_name => 'salary_rdc',
function_type => DBMS_REDACT.full,
action => DBMS_REDACT.ADD_COLUMN,
column_name => 'hire_date',
function_type => DBMS_REDACT.PARTIAL,
function_parameters => DBMS_REDACT.REDACT_DATE_EPOCH);
END;
/

DATA REDACTION POLICY - DEVRE DIŞI BIRAKMA VE ETKİNLEŞTİRME
Eklenen maskelemeler devre dışı bırakılabilir ve etkinleştirilebilir.
Disable etmek için;

BEGIN
DBMS_REDACT.DISABLE_POLICY (object_schema => 'HR',
object_name => 'EMPLOYEES',
policy_name => 'salary_rdc');
END;
/

Enable etmek için;

BEGIN
DBMS_REDACT.ENABLE_POLICY (object_schema => 'HR',
object_name => 'EMPLOYEES',
policy_name => 'salary_rdc');
END;
/

DATA REDACTION POLICY - SİLME
Eklenen maskelemeler silinebilir.

BEGIN
DBMS_REDACT.DROP_POLICY (object_schema => 'HR',
object_name => 'EMPLOYEES',
policy_name => 'salary_rdc');
END;
/

Oracle Data Redaction ile ilgili yazımı burada bitiriyorum. Umarım sizler için faydalı bir kaynak olur. Bir daha ki yazıda görüşmek üzere.

--

--