Oracle TDE (Transparent Data Encryption)
- Alperen ÜLKÜ
- 27 Tem 2022
- 5 dakikada okunur

Oracle'ın en önemli güvenlik çözümleri arasında yer alan TDE teknolojisini Oracle 19c versiyonunda inceleyeceğiz. TDE nedir, nasıl entegre edilir ve yönetilir gibi soruları Auto-Login Wallet konfigürasyonu ile uygulamalı şekilde cevaplayacağız. Keyifli okumalar dilerim...
TDE Nedir ?
Bir Oracle veritabanında datafile'lar basit işletim sistemi komutları ile okunarak veri hakkında bilgi edinilebilir. Bu durum Oracle'ın disk katmanında zaafiyeti önlemek amacıyla TDE'yi geliştirmesine sebep olmuştur. TDE, verilerin datafile'lar üzerinde şifreli olarak tutulmasını sağlar ve bu sayede ilgili anahtara sahip olmayan kullanıcıların veriye erişmesi engellenmiş olur. Yazılan her veri şifrelenerek saklanır ve okunmak istenen her veri şifresi çözülerek okunur.

TDE sayesinde hassas veriler tablespace bazında veya kolon bazında şifrelenebilir. Yetkili kullanıcılar tarafından şifrelenmiş veri okunmak istendiğinde şeffaf (transparent) olarak şifre çözülür, veri görüntülenir. Burada anlatılmak istenen şey, bir kullanıcının veya bir uygulamanın şifrelenmiş veriyi görüntülemesi için ekstra bir işleme ihtiyaç duymayacağıdır yani encrypt & decrypt işlemlerinin tamamı veritabanı katmanında otomatize şekilde çalışmaktadır.
TDE'nin kullanılabilmesi için wallet'lara ihtiyaç duyulur. TDE şifreleri bu wallet'larda saklanır. Veritabanın backup'ı alındığında wallet'ında yedeği alınmalıdır çünkü backup restore edildiğinde wallet olmadan veriye erişilemez. TDE aktif edildiğinden itibaren bu wallet şifresi güvenli bir kasada saklanmalı ve kaybedilmemelidir. Uygulaması nispeten kolay olan TDE teknolojisinin yönetimsel anlamda iyi kurgulanması gerekmektedir. Yapılacak yönetimsel hatalar sonucunda veriyi kurtaramak mümkün olmayabilir.
TDE'nin Faydaları
Datafile'ların bulunduğu medya ve disk çalındığı zaman hassas veriye ulaşılamaz.
Uygulama veya kullanıcılar hassas veriyi görmek için ekstra bir konfigürasyona ihtiyaç duymaz.
Kullanıcıların TDE master encryption key'i yönetmesine gerek yoktur, veritabanı bunu kendi otomatize eder.
Table Redefinition ile Zero Downtime kolon şifreleme yapılabilir.
Wallet şifresi sadece güvenlik DBA'inde bulunur ve diğer DBA'ler giriş yapmak için buna ihtiyaç duymaz.
Compatible Parametresi
TDE kullanabilmek için veritabanının Compatible versiyonu en az 11.2.0.0 olmalıdır. Bu versiyondan itibaren;
- Software keystore'dan Hardware Keystore'a geçiş mümkün olur.
- Master Encryption Key, reset ve rotate işlemleri mümkün olur.
- Şifreleme derecesine göre 4 tip şifreleme algoritması kullanılabilir.
3DES168
AES128
AES192
AES256
- Saldırganlara karşı ekstra koruma sağlayan 3 tip entegrasyon algoritması kullanılabilir.
MD5
SHA-1
SHA-2
NOMAC (Entegrasyon algoritması kullanma)
- SALT veya NO SALT opsiyonları kullanılabilir. SALT işlemi veri şifrelenmeden önce başına rastgele 16 byte ekleyerek güvenliği artırmaya yarar.
! NOMAC ve NO SALT opsiyonları güvenlik derecesini azaltırken, performans ve disk kullanımına olumlu yönde etki edecektir. Burada performans/güvenlik eğrisini her kullanıcı kendi verisine, işlem kabiliyetine ve yoğunluğuna göre belirlemelidir.
TDE Tablespace Encryption
Bir tablespace'deki verilerin tamamını şifrelemeye yarar. Tüm okuma ve yazma işlemlerini şifreler ve çözer. Tablolarınızda birden fazla hassas kolon bulunuyorsa bu opsiyonu tercih etmeniz daha doğru olacaktır. Ayrıca bulk insert işlemlerinde tablespace şifreleme daha performanslı çalışacaktır. Var olan tablespace'ler kesintisiz (online) olarak şifrelenebilir. Import & Export işlemleri Data Pump ile yapılabilir.

! BFILE gibi tablespace dışarısında saklanan veriler bu opsiyonda şifrelenmez. Ancak DBMS_CRYPTO paketi ile manual olarak şifrelenebilir.
! Join ve Sort işlemleri sırasında veri temp tablespace'inde korunur hatta şifrelenmiş verinin redo ve undo'larıda şifreli olarak korunur.
TDE Tablespace Encryption Varsayılan Şifreleme Opsiyonları
AES128
SALT (Zorunlu)
SHA-1
! Güvenlik sebepleri gerekçesiyle TDE Tablespace NO SALT opsiyonu ile kullanılamaz.
TDE Tablespace Encryption Uygulaması
TDE tablespace encryption uygulamasını Oracle 19c versiyonunda non-pluggable ve Oracle Linux 7.8 işletim sistemi üzerinde yapacağız. Öncelikle wallet dizini oluşturulur ve spfile'da bu dizin set edilir, ve instance tutarlı kapatılır.
12c versiyonunda WALLET_ROOT dizini sqlnet.ora dosyasında belirtilirken 19c ve sonrasında veritabanı içerisinde saklanır.
$ mkdir -p /u01/app/oracle/admin/orcl/wallet/tde
$ sqlplus / as sysdba
SQL> alter system set WALLET_ROOT="/u01/app/oracle/admin/orcl/wallet/" scope=spfile;
SQL> shutdown immediate

Veritabanı açılarak tde konfigürasyon parametresi set edilir.
SQL> startup
SQL> alter system set TDE_CONFIGURATION="KEYSTORE_CONFIGURATION=FILE";

Keystore, belirlenen şifre ile oluşturulur.
SQL> administer key management create keystore identified by Password;

Keystore auto-login olarak konfigüre edilir. Auto-login opsiyonu ile veritabanına bağlanacak kullanıcıların her bağlantıda şifre girmesi önlenmiş olur. Diğer opsiyon olan Local Auto-Login kullanılırsa keystore sadece oluşturulduğu lokal sunucu üzerinde kullanılabilir, harici bir sunucuda login olmayacaktır. Bu uygulamada daha kullanışlı olan auto-login'i kullanacağız.
SQL> administer key management create auto_login keystore from keystore '/u01/app/oracle/admin/orcl/wallet/tde' identified by Password;

TDE Master Encryption Key set edilir.
SQL> select * from v$encryption_wallet;
SQL> administer key management set key using tag 'orcl_Tablespace_TDE' force keystore identified by Password with backup using 'TDE_backup';
SQL> select * from v$encryption_wallet;

Oluşturulan key v$encryption_keys view'inde görülmektedir.
SQL> selecy key_id, tag, keystore_type, creation_time from v$encryption_keys;

Hassas verimizi tutacağımız tablespace'i önce standart bir tablespace olarak oluşturuyoruz. Daha sonra normal bir table oluşturarak içerisine bir satırlık veri ekliyoruz.
SQL> create tablespace sensitive_data datafile '/u01/app/oracle/oradata/ORCL/normal_tbs.dbf' size 50M;
SQL> select * from v$tablespace;
SQL> create table test (id number, txt varchar2(20)) tablespace sensitive_data;
SQL> insert into test (1,'deneme');
SQL> commit;

TDE ile korunmayan bir tablespace içerisinde bulunan veriler "strings" komutu ile basitçe görüntülebilir, işte tam olarak bahsettiğimiz güvenlik zaafiyeti de bu.
SQL> !strings /u01/app/oracle/oradata/ORCL/normal_tbs.dbf | grep deneme
Veriyi insert ettikten sonra commit edilmesine rağmen "strings" komutu null döndü. Eğer sizde benim gibi test ortamında çalışıyorsanız muhtemelen aynı durumla karşılaşacaksınız :)
Henüz checkpoint gelmediği için redolog'daki veriler datafile'a yazılmadı. Checkpoint tetiklendikten sonra datafile "strings" komutu ile okutulduğunda veriyi apaçık görmüş olacağız.
SQL> alter system checkpoint;
SQL> !strings /u01/app/oracle/oradata/ORCL/normal_tbs.dbf | grep deneme
Hassas verinin bulunduğu tablespace'i AES192 şifreleme algoritması ile online (kesintisiz) olarak şifreliyoruz. Aynı zamanda file_name_convert parametresi ile datafile ismini de değiştirebiliriz.
SQL> alter tablespace sensitive_data encryption online using 'AES192' encrypt file_name_convert=('/u01/app/oracle/oradata/ORCL/normal_tbs.dbf','/u01/app/oracle/oradata/ORCL/tde_tbs.dbf');
SQL> !strings /u01/app/oracle/oradata/ORCL/tde_tbs.dbf | grep deneme

Örnekte de görüleceği üzere artık bu tablespace üzerindeki hiçbir veri disk katmanında okunamayacak dolayısıyla güvenlidir. Yapılan bu uygulama ile TDE Tablespace Encryption'ın sonuna geldik.
TDE Column Encryption
Bir tablodaki kolonlardan bir veya birden fazlasını şifreleme işlemine Column Encryption denir. Eğer elinizdeki veri setinde spesifik hassas kolonlar bulunuyorsa bu opsiyonu tercih edebilirsiniz. Column Encryption beraberinde önemli kısıtlamalar ile gelmektedir ve yönetimsel açıdan Tablespace Encryption'a göre daha karmaşıktır.

TDE Column Encryption Varsayılan Şifreleme Opsiyonları
AES192
SALT
SHA-1
TDE Column Encryption Kullanılmaması Gereken Durumlar
B-Tree dışında index tipi kullanılacaksa
Index Range Scan kullanılacaksa
Transportable (Taşınabilir) Tablespace'lerde
TDE Column Encryption Kısıtlamaları
Index'li bir kolon sadece NO SALT ile şifrelenebilir.
Index Range Scan kullanılamaz.
Foreign Key alanı şifrelenemez.
Bir tabloda birden fazla kolon şifrelenecekse entegrasyon ve şifreleme algoritmaları aynı düzeyde olmalıdır. Fakat SALT opsiyonu diğer kolonlardan bağımsızdır.
Var olan bir tabloda kolon şifrelemek için table lock'lanır. Ancak table redefinition ile kesintisiz (Zero Downtime) şifreleme yapılabilir.
Sadece desteklenen veri tipleri, tip boyutlarını aşmayacak şekilde kullanılabilir :
binary_double
binary_float
char
date
interval day to second
intercal year to month
nchar
number
nvachar2
raw
timestamp
varchar2
TDE Column Encryption Uygulaması
Test kullanıcısı oluşturalım ve şifreli olmayan bir tablespace'de şifreli kolon içerecek test tablosu oluşturalım. Kolonu AES256 ile şifreleyelim, entegrasyon algoritması ve salt opsiyonu belirtmediğimiz için varsayılan değerler olan SHA-1 ve SALT ile oluşacaktır.
SQL> create user test identified by test;
SQL> create table test.deneme2 (
ad varchar2(128),
soyad varchar2(128),
numara number(6) ENCRYPT USING 'AES256' )
tablespace users;

Bu tabloya yeni bir şifreli kolon eklemeyi deneyelim. Aynı tabloya AES192 ile şifrelenmiş bir kolon eklemeye çalıştığımızda hata alacağız. (ORA-28340) Yukarıda anlattığımız gibi bir tabloda birden fazla kolon varsa şifreleme ve entegrasyon algoritmalarının düzeyi aynı olmalıdır.
SQL> alter table test.deneme2 add (text varchar2(100) encrypt using 'AES256' NO SALT);

Bu tabloda var olan bir kolonu modify ederek şifrelemeye ve şifresini çözmeye çalışalım. Yine diğer şifreli kolon varsayılan SHA-1 algoritması ile oluşturulduğu için bu tablodaki hiçbir kolonu NOMAC ile şifreleyemiyoruz. (ORA-28379)
SQL> alter table test.deneme2 modify (soyad ENCRYPT);
SQL> alter table test.deneme2 modify (soyad DECRYPT);

DBA_ENCRYPTED_COLUMNS view'inden şifrelenmiş kolonlar hakkında bilgi edinebiliriz.
Şifrelenmiş bir kolon üzerine index oluşturmayı deneyelim. Örnekte görüldüğü gibi SALT ile şifrelenmiş bir kolona index oluşturamıyoruz. (ORA-28338)
SQL> select * from dba_encrypted_columns;
SQL> create index ind on test.deneme2 (text);

Rekey komutu ile bir tablodaki şifreleme algoritmasını değiştirebiliriz.
SQL> alter table test.deneme2 rekey using 'AES192';
SQL> select * from dba_encrypted_columns;

Test kullanıcısına insert yapabilmesi için gerekli yetkiler verilir. Test verisi insert edilip checkpoint alınır. Checkpoint tetiklendikten sonra dirty bufferlar datafile'lara yazılmış olur.
Not: Kayıt insert edildikten sonra commit edilmese de checkpoint tetiklendikten sonra datafile'a yazılmış olur. Bu andan itibaren rollback komutu çalıştırılırsa veri tabloda görülmez, fakat datafile'da ezilene kadar görülmeye devam eder. Şifrelenmiş bir kolondaki veri silinse dahi datafile'da bulunabilir fakat şifreli olacağı için güvenlik zaafiyeti oluşturmayacaktır.
SQL> grant connect, resource to test;
SQL> alter user test quota unlimited on users;
SQL> insert into test.deneme2 values ('alperen','ulku','123456','sifreli');
SQL> alter system checkpoint;

Veri datafile'dan okunmak istendiğinde şifrelenmiş kolonlar görüntülenemez. Böylece kolon bazında şifrelemenin nasıl çalıştığını da görmüş oluyoruz.
SQL> !strings /u01/app/oracle/oradata/ORCL/users01.dbf | grep alperen
SQL> !strings /u01/app/oracle/oradata/ORCL/users01.dbf | grep ulku
SQL> !strings /u01/app/oracle/oradata/ORCL/users01.dbf | grep 123456
SQL> !strings /u01/app/oracle/oradata/ORCL/users01.dbf | grep sifreli

Böylece Oracle TDE hakkında yazdığım yazının sonuna gelmiş oluyorum. Bu yazımda TDE'nin Tablespace ve Kolon bazında kullanımlarına ilişkin detayları ele alarak uygulamalı şekilde anlatmaya çalıştım. Özellikle kolon bazında şifrelemenin kullanılacağı durumlarda karşılaşılabilecek hataları ve kısıtlamaları uygulamalı şekilde göstermek istedim. Umarım faydalı olmuştur.
Gelecek yazılarımızda görüşmek üzere, sağlıcakla kalın...
Comments