Oracle Veritabanı Sıkılaştırma Teknikleri ve Güvenlik - Turkhackteam.org/net - Cyber Security Platform
Veri güvenliği, verinin bozulmaması ve veriye doğru kişinin eriştiğinden emin olunmakla birlikte gizliliği konusunu da kapsar. Veri'nin güvenliğinin sağlanması için gizlilik ,erişilebilirlik ve bütünlük kırılımları göz önünde bulundurulmalıdır. Doğru veriye gerektiğinde sadece yetkilendirilmiş kişilerin güvenli yöntemlerle erişiyor olması sağlanmalıdır.
Bu yazıda, verinin saklandığı veritabanı sistemlerinden biri olan Oracle üzerinde uygulanabilecek sıkılaştırma tekniklerinden madde madde bahsedilecektir.
Şifresi Zayıf ve Varsayılan (default) Olarak Kalmış Kullanıcıların Kontrol Edilmesi
Kurulumla gelen varsayılan (default) kullanıcılardan şifresi varsayılan kalmış kullanıcının var olup olmadığı kontrol edilmelidir. Versiyon kontrolü yapmak için aşağıdaki sorgu kullanılabilir.
Sorgunun çıktısı ise aşağıdaki gibidir;
Şifre Versiyonlarının Kontol Edilmesi
Oracle 10g'de parola yapısı büyük/küçük harf duyarlı (case-sensitive) olmadığından, örnek parolanın Sevim123 olduğunu varsayarsak "Sevim123" ile "sevim123" için özet değerleri birbirinin aynısı idi. Fakat bu durum 11g de değişti. 11g büyük/küçük harf duyarlı olduğundan "Sevim123" ile "sevim123" özet değerleri birbirinden farklı olacaktır. 11g'de özet değerler SYS.USER$ tablosunda parola kolonu altında tutuluyor .
Özet olarak 10g de;
Büyük küçük harf duyarlı değildir. Test123 parolasını kullanan kişi, test123 şifresini kullanan kişinin hesabına girebilir. Bir kullanıcı belli hakları varsa başkasının şifresini kendi şifresi olarak ayarlayabilir (Impersonate another user).
Özet olarak 11g ;
Büyük küçük harf duyarlıdır. Tuzlama(Salting) metodu kullanılır . Parolaya rastgele ifade eklenerek saklanır. Böylece farklı kişilerin şifresi aynı olsa bile özetleri farklı olur. Dolayısı ile 11g de parolaların tutuluş şekli daha güvenlidir.
Şekil -1 11g SYS.USER$ tablosunun çıktısı
Şekil -2 11g dba_users tablosunun çıktısı
Parola versiyonlarını kontrol etmek için aşağıdaki sorguyu kullanılmalıdır;
select username,şparola_versions from dba_users;
Network Trafiğinin Şifrelendiğinin Kontrol Edilmesi
Mümkünse eğer, Oracle ASO (Oracle Advanced Security) istemci, veritabanı ve uygulama sunucuları ile arasındaki network trafiğinin şifreleniyor olması gerekmektedir.
Bu konu hassas verilerin yetkisiz kişiler tarafından ele geçirilmemesi bakımından büyük önem arz etmektedir.
Şifre Politikası Kontrolü
Oracle üzerinde yaratılan her kullanıcı için şifre politikası parametrelerinin her birinin ayrı ayrı tanımlanması gerekmektedir. Aşağıdaki şifre politikasında kullanılan parametrelerin tanımları ve varsayılan değerleri yer almaktadır.
Şifre Politikası parametreleri ve varsayılan değerleri aşağıdaki gibidir.
FAILED_LOGIN_ATTEMPTS: Bir Oracle kullanıcı hesabının kilitlenmesi için gerekli maksimum başarısız oturum açma girişimi sayısını belirler. Bu değeri belirlemezsek , bağlanmak isteyen kullanıcılar sürekli deneme yanılma yöntemi uygulayabilirler. Bu parametrenin varsayılan değeri "10" dur.
PAROLA_LIFE_TIME: Bir parolanın geçerli sayılacağı maksimum zamanı gün olarak belirler. Bu parametrenin varsayılan değeri "180"dir.
PAROLA_GRACE_TIME: PAROLA_LIFE_TIME parametresi ile belirtilen süre dolduğunda kullanıcıya parolasını değiştirmesi için tanınan ek süreyi tanımlar. Bu parametrenin varsayılan değeri "7"dir.
PAROLA_REUSE_MAX: Bir parolanın tekrar kullanılabilmesi için tanımlanması gereken minimum farklı parola sayısını belirler. Bu parametrenin varsayılan değeri "Unlimited"dır.
PAROLA_REUSE_TIME: Bir parolanın tekrar kullanılabilmesi için geçmesi gereken minimum süreyi belirler. Parametrenin varsayılan değeri "Unlimited"dır.
PAROLA_LOCK_TIME: Maksimum sayıdaki başarısız oturum açma girişimlerinden sonra, hesabın ne kadar süreyle kilitli kalacağını belirtir. Bu parametrenin varsayılan değeri "1"dir.
Oracle üzerinde tanımlı her bir kullanıcı için bu parametrelerin ayrı ayrı tanımlanması yerine profil tanımlaması yapıp, bu profillere kullanıcıları bağlamak daha mantıklı olacaktır. Örnek olarak kadrolu yazılımcılar için ayrı bir profil, dış kaynaklı (outsource) yazılımcılar için ayrı bir profil, uygulama kullanıcıları için ayrı bir profil tanımlanabilir. Kullanıcıya profil içerisinde yapılan tanımlamalarda gerekli olan sınırlamalar tanımlanmalıdır.
Profil yaratmak için aşağıdaki sorgu kullanılabilir.
create profile sec_prof limit
Mevcut sistemde tanımlı profilleri listelemek için aşağıdaki sorgu kullanılabilir;
Select distinct profile from sys.dba_profiles;
Parametrelere atanmış değerleri listelemek için ise aşağıdaki sorgu kullanılabilir;
select * from  sys.dba_profiles order by profile;
Hiçbir profile atanmamış kullanıcılar için bu parametre değerlerini görüntülemek için aşağıdaki sorgu kullanılabilir;
select * from user_şparola_limits;
Sorgunun çıktısı ise aşağıdaki gibi olacaktır(Şekil-3);
Kullanıcı Kaynak Limitlerinin Kontrol Edilmesi
Kullanıcı kaynaklarının kontrol edilmesi güvenlik açısından çok önemlidir.
Limit parametrelerini kontrol etmek için aşağıdaki sorgu kullanılmalıdır.
Sorgunun çıktısı aşağıdaki gibidir(Şekil-4);
Parametrelerin tanımları aşağıdaki gibidir;
CPU_PER_SESSION: Bir kullanıcı oturumunun kullanabileceği maksimum Cpu zamanını belirler.
CPU_PER_CALL: Bir kullanıcının yarattığı call (parse, execute, ya da fetch) için maksimum Cpu değerini belirler.
CONNECT_TİME: Bir oturum için dakika olarak maksimum açık kalma zamanını belirler.
IDLE_TIME: Bir oturumun maksimum pasif kalma süresini dakika olarak belirler.
SESSIONS_PER_USER: Kullanıcının eş zamanlı açabileceği oturum sayısını kısıtlamak için kullanılır.
PRIVATE_SGA: Bu limit sadece "shared server" modunda çalışan veritabanları için geçerlidir. Bir oturumun SGA içerisinde "Shared Pool"da kendine ayırabileceği maksimum bellek alanını belirler.
LOGICAL_READS_PER_SESSION: Bir oturumda okunabilecek maksimum data blok sayısını belirler.
LOGICAL_READS_PER_CALL: Bir kullanıcının yarattığı call için okunabilecek maksimum data blok sayısını belirler.
TableSpace Kotaları'nın Kontrol Edilmesi
Üretim (production) veritabanlarında data insert'leri yalnızca uygulama şemaları altında gerçekleşiyor olması gerekmektedir. Bazı istisnai durumlarda bu yetkiler yazılımcılara da verilebilmektedir. Bu durumun sürekli olarak kontrol ediliyor olması gerekmektedir. Kullanıcı bazında şema kotlarının kontrolleri aşağıdaki sorgu ile yapılabilir.
Sorgunun çıktısı aşağıdaki gibidir(Şekil-5);
Tüm Kullanıcı ve Rollerin Yetkilerinin Kontrol Edilmesi
Oracle veritabanı üzerinde tanımlı kullanıcılar ve rollerin yetkilerinin sorgulanması güvenlik açısından büyük önem arz etmektedir. Aşağıdaki sorgu ile kullanıcıların ve rollerin yetkilerini admin(yönetici) option ile beraber tek bir sorgu görüntüleyebilirsiniz.
Tüm sistem kullanıcıları ve rolleri için ayrıcalıklı haklar ile beraber admin(yönetici) seçeneğini görüntülemek için ;
lpad('>', level, '-') ||
' N/A' admin_option
from sys.dba_role_ privs
from sys.dba_sys_ privs)
connect by grantee = priorgranted_role
Sorgunun çıktısı aşağıdaki gibidir(Şekil- 6);
Spesifik Olarak Belirtilen Bir Hakkın Kontrol Edilmesi
Bir önceki maddede tüm kullanıcı ve rollerin yetkileri sorgulanmıştı. Fakat spesifik olarak bir kişinin rollerini yada bir role kimin atandığını sorgulamak istediğimizde aşağıdaki sorgu kullanılabilir. Burada "where" kriterine kritik olarak belirlediğimiz yada denetçi tarafından talep edilen rol isimleri yazılarak detaylı sorgulama yapılabilir.
Örneğin kimlerin DBA' hakkına sahip olduğunu listelemek için aşağıdaki sorgu kullanılabilir;
select * from dba_role_privs where  granted_role ='DBA';
Sorgunun çıktısı aşağıdaki gibidir(Şekil-7);
Yada tüm atanmış rolleri listelemek için aşağıdaki sorgu kullanılabilir;
Yaratılmış DB Link'lerin Kontrol Edilmesi
Oracle veritabanından farklı bir Oracle veritabanına bağlanmak istediğimizde bu veritabanlarının birbiriyle konuşabilmesi için araya kurulan köprüye DB Link denir. Bu linkler yaratılma şekillerine göre güvenlik açığı yaratabilmektedir. Linkler Private ve Public olarak iki farklı şekilde yaratabilir. Public olarak yaratılan Linkler denetimlerde bulgu konusu olmakta ve güvenlik açığı teşkil etmektedir.
Public linkleri görüntülemek için aşağıdaki sorguyu kullanabiliriz;
select * from  sys.dba_db_links where owner = 'PUBLIC';
Tanımlı tüm linkleri görüntülemek için ise aşağıdaki sorguyu kullanabiliriz;
select * from  sys.dba_db_links;
Oracle Versiyon Kontrol Edilmesi
Üretici tarafından yayınlanan service pack ve yamaların kontrollü olarak uygulanması gerekmektedir. Sisteme şimdiye kadar hangi yamaların uygulanıp uygulanmadığını kontrol etmek için aşağıdaki sorgu kullanılmalıdır. Sorgu Oracle sürüm numarasından yama seviyesine kadar versiyon bilgisi verir.
Sorgunun çıktısı aşağıdaki gibidir(Şekil-8);