Oracle Veritabanı Sıkılaştırma Teknikleri ve Güvenlik
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ımızda, verinin saklandığı veri tabanı sistemlerinden biri olan Oracle üzerinde uygulayabileceğimiz sıkılaştırma tekniklerinden madde madde bahsediyor olacağız;
1 – Ş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(default) kalmış kullanıcı’nın var olup olmadığı kontrol edilmelidir. Versiyon kontrolü yapmak için aşağıdaki sorgu kullanılabilir.
SELECT d.username, u.account_status
FROM DBA_USERS_WITH_DEFPWD d, DBA_USERS u
WHERE d.username = u.username
ORDER BY 2,1;
Sorgunun çıktısı ise aşağıdaki gibidir;
USERNAME ACCOUNT_STATUS
——— ———————–
SCOTT EXPIRED & LOCKED
2 –Network Trafiğinin Şifrelendiğinin Kontrol Edilmesi
Mümkünse eğer , Oracle ASO (Oracle Advanced Security) client , veritabanı ve uygulama sunucu ‘ları ile arasındaki network trafiğinin şifreleniyor olması gerekmektedir.
Bu konu hassas verilerin yetkisiz kişiler tarafından ele geçirilmemesi bakımandan büyük önem teşkil etmektedir.
Veri trafiğinin şifrelenmesi ile ilgili aşağıdaki makale yardımcı olacaktır;
http://www.bilgiguvenligi.gov.tr/veritabani-guvenligi/oracle-veritabani-nda-kimlik-dogrulama.html
3- Şifre Versiyonlarının Kontrol Edilmesi
Oracle 10g de parola yapısı case insensitive olduğundan, benim parola ‘umun Sevim123 olduğunu varsayarsak “Sevim123” ile “sevim123” ‘ün özet değerleri birbirinin aynısı idi. Fakat bu durum 11g de değişti. 11g case sensitive olduğundan “Sevim123” ile “sevim123” özet değerleri birbirinden farklı olacaktır. 11g’de özet değerler SYS.USER$ tablosunda password 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ı (Case sensitive)’dır. Tuzlama(Salting) methodu 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 parola’larin tutuluş şekli daha güvenlidir.
11g SYS.USER$ tablosunun çıktısı aşağıdaki gibidir(şekil –1);
Şekil –1
11g dba_users tablosunun çıktısı aşağıdaki gibidir(Şekil-2);
Şekil –2
parola versiyonlarını kontrol etmek için aşağıdaki sorguyu kullanılmalıdır;
select username, parola_versions from dba_users;
USERNAME PASSWORD_VERSIONS
——— ———————–
RON 10G 11G
JANE 11G
RONB 10G
4 – Şifre Politikası Kontrolü
Oracle üzerinde yaratılan her kullanıcı için şifre politası parametrelerinin her birinin ayrı ayrı tanımlanması gerekmektedir. Aşağıdaki şifre politasında kullanılan parametrelerin tanımları ve varsayılan (default )değerleri yer almaktadır.
Şifre Politası parametreleri ve varsayılan (default) 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 parametre’nin varsayılan (default) değeri “10” dur.
PASSWORD_LIFE_TIME: Bir parolanın geçerli sayılacağı maksimum zamanı gün olarak belirler. Bu parametre’nin varsayılan (default ) değeri “180” dir.
PASSWORD_GRACE_TIME: PASSWORD_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 parametre’nin varsayılan (default ) değeri “7” dir.
PASSWORD_REUSE_MAX: Bir parolanın tekrar kullanılabilmesi için tanımlanması gereken minimum farklı parola sayısını belirler. Bu parametre’nin varsayılan (default) değeri “unlimited” dir.
PASSWORD_REUSE_TIME: Bir parolanın tekrar kullanılabilmesi için geçmesi gereken minimum süreyi belirler. parametre’nin varsayılan (default ) değeri “unlimited” dir.
PASSWORD_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 parametre’nin varsayılan (default ) 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 kulllanıcıları bağlamak daha mantıklı olacaktır. Örnek olarak kadrolu yazılımcılar için ayrı bir profil, 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 query ‘yi kullanabilirsiniz.
create profile sec_prof limit
connect_time 240
idle_time 30
failed_login_attempts 5
password_life_time 60
password_reuse_time 60;
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 isterseniz aşağıdaki sorguyu kullanabilirsiniz;
select * from user_password_limits;
Sorgunun çıktısı ise aşağıdaki gibi olacaktır(şekil-3);
Şekil –3
5- 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.
select * from user_resource_limits;
Sorgunun çıktısı aşağıdaki gibidir(şekil-4);
Ş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 memory 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.
6- TableSpace Kotaları’nın Kontrol Edilmesi
Üretim (production) veritabanların da data insertleri yalnızca uygulma şemaları altında gerçekleşiyor olması gerekmektedir. Bazı istisnai durumlarda bu yetkiler yazılımcılarada verilebilmektedir. Bu durumun sürekli olrak kontrol ediliyor olması gerekmektedir. Kullanıcı bazında şema kotlarının kontrolleri aşağıdaki sorgu ile yapılabilir.
select * from dba_ts_quotas;
Sorgunun çıktısı aşağıdaki gibidir(şekil-5);
Şekil –5
7 – 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;
select
lpad(‘>’, level, ‘-‘) ||
granted_role “User/Role/Privilege”
from (
select
null grantee,
username granted_role,
‘ N/A’ admin_option
from sys.dba_users
UNION
select
grantee,
granted_role,
admin_option
from sys.dba_role_ privs
UNION
select
grantee,
privilege_granted_role,
admin_option
from sys.dba_sys_ privs)
start with grantee is null
connect by grantee = priorgranted_role
Sorgunun çıktısı aşağıdaki gibidir(şekil- 6);
Şekil –6
8 – Spesifik Olarak Belirtilen Bir Hakkın Kontrol Edilmesi
Bir önceki maddede tüm kullanıcı ve rollerin yetkilerini sorgulamıştık. 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 yâda 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);
Şekil –7
Yada tüm atanmış rolleri listelemek için aşağıdaki sorgu kullanılabilir;
select * from dba_role_privs;
9 –Yaratılmış DB Link’lerin Kontrol Edilmesi
Oracle veritabanı’ dan 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;
10 – Oracle Versiyon Kontrol Edilmesi
Üretici tarafından yayınlanan service pack ve yama’lar kontrollü olarak uygulanması gerekmektedir. Sisteme şimdiye kadar hangi yama’ların uygulanıp uygulanmadığını kontrol etmek için aşağıdaki sorgu kullanılmalıdır. Sorgu Oracle sürüm numarasindan yama seviyesine kadar versiyon bilgisi verir.
SELECT * FROM v$version;
Sorgunun çıktısı aşağıdaki gibidir(şekil-8);
Şekil -8
Referanslar;
http://www.databasesecurity.com/oracle/twp_security_checklist_db_database.pdf