Kullanıcı, Parola Ve Kimlik Doğrulama Güvenliği
Oracle veritabanı içerisinde gerek kurulumla gelen kulanıcılar, gerekse sonradan ihtiyaç dahilinde yaratılan kullanıcılar için hem yetki hem de güvenli parola kontrollerinin yapılması önemli bir güvenlik adımıdır.
1 – Kurulumla Gelen Kullanıcılar
Oracle kurulumu esnasında bazı kullanıcılar otomatik olarak yaratılır. Bunlardan en önemlileri SYSTEM ve SYS kullanıcılarıdır. SYS kullanıcısı Oracle veritabanlarında en üst düzey yetkiye sahip kullanıcıdır. Oracle konfigürasyon bilgilerini tutan veri kütüphanesinin (data dictionary) tüm tablo ve view’larının sahibidir. SYSTEM ise yine yüksek seviyede yetkilere sahip bir yönetici hesabıdır.
Bu kullanıcılardan bir diğeri ise SYSMAN kullanıcısıdır. Bu hesap Enterprise Manager süper yönetici hesabı olarak bilinir. DBSNMP kullanıcısı da yine Enterprise Manager tarafından veritabanını yönetmek amaçlı kullanılır.
Yukarıda belirtilen kullanıcılar dışında yine kurulumla gelen ve kimisi kullanılabilir, kimisi kilitli olmak üzere Oracle’ın çeşitli amaçlarla kullandığı kullanıcılar bulunmaktadır. Aşağıda yeni kurulan bir veritabanında kurulumla gelen kullanıcıları ve durumlarını görebilirsiniz.
SQL> select username, ACCOUNT_STATUS from dba_users;
USERNAME ACCOUNT_STATUS
------------------------------ --------------------------------
MGMT_VIEW OPEN
SYS OPEN
SYSTEM OPEN
DBSNMP OPEN
SYSMAN OPEN
OUTLN EXPIRED & LOCKED
MDSYS EXPIRED & LOCKED
ORDSYS EXPIRED & LOCKED
EXFSYS EXPIRED & LOCKED
DMSYS EXPIRED & LOCKED
WMSYS EXPIRED & LOCKED
CTXSYS EXPIRED & LOCKED
ANONYMOUS EXPIRED & LOCKED
XDB EXPIRED & LOCKED
ORDPLUGINS EXPIRED & LOCKED
OLAPSYS EXPIRED & LOCKED
SCOTT EXPIRED & LOCKED
TSMSYS EXPIRED & LOCKED
BI EXPIRED & LOCKED
PM EXPIRED & LOCKED
MDDATA EXPIRED & LOCKED
IX EXPIRED & LOCKED
SH EXPIRED & LOCKED
DIP EXPIRED & LOCKED
OE EXPIRED & LOCKED
HR EXPIRED & LOCKED
Buradaki HR, SCOTT, PM, IX, SH ve OE kullanıcıları ise Oracle kurulumunda yaratılması opsiyonel olarak sunulan örnek kullanıcılardı. Bu kullanıcılar test amaçlı kullanılmak üzere çeşitli objelere sahiptirler.
Yukarıdaki kullanıcılardan EXPIRED&LOCKED; olarak belirtilenler veritabanında bir yönetici kullanıcı tarafından açılmadıkları sürece kullanılamazlar. Güvenlik açısından önemli tehlikeyi ise yüksek yetkilerle donatılmış ve erişilebilir durumda olan diğer kullanıcıların basit şifrelere sahip olmaları yaratır. Bu kullanıcılara zor şifreler verilerek güvenli hale getirilmeleri çok önemlidir.
Oracle veritabanı kullanıcı ismi ile kullanıcıya verilen parolayı hash’leyerek dahili tablolarında tutar. Bu değerler kullanılarak parolanın çözülmesi ise normal şartlarda mümkün değildir. Çünkü hash fonksiyonları tek yönlü fonksiyonlardır. Hash fonksiyonu sonucunda çıkan değerlere örnek aşağıdaki gibidir.
SQL> select username, password from dba_users;
USERNAME PASSWORD
------------------------------ ----------------------
MGMT_VIEW 6DE82A30FD768CDD
SYS 8A8F025737A9097A
SYSTEM 2D594E86F93B17A1
DBSNMP FFF45BB2C0C327EC
SYSMAN 2CA614501F09FCCC
GAZIDM 4F45CFF16B044F5D
DMUSER 95FA124E330F0DB8
OUTLN 4A3BA55E08595C81
MDSYS 72979A94BAD2AF80
ORDSYS 7EFA02EC7EA6B86F
EXFSYS 66F4EF5650C20355
Ancak daha önce yapılan çeşitli çalışmalarla SYS, SYSTEM, SYSMAN gibi yetkili kullanıcıların oracle, change_on_install vs. gibi kolay şifreler aldıklarında ortaya çıkan hash değerleri incelenmiş ve bu değerler birçok olası parola varyasyonu için belirlenerek kayıt altına alınmıştır. Sonuç olarak sözkonusu bu kullanıcıların eğer kolay birer şifreleri varsa bu şifrelerin ne olduklarını hash fonksiyonlarına bakarak belirlemek mümkündür.
Sonuç olarak veritabanımızda önemli yetkilere sahip bu kullanıcılara tahmin edilmesi güç, zor şifreler vererek veritabanımızı güvenli tutmamız gerekmektedir.
2 – Profil Kullanımı
Oracle’da Profil, bir kullanıcının kullanabileceği kaynakların kısıtlanması amacıyla kullanılır. Profil’i “CREATE PROFİLE” komutu ile ya da enterprise manager üzerinden yaratabilir, “ALTER USER … PROFİLE” komutu ile bir kullanıcıya uygulayabiliriz. Aşağıda enterprise manger üzerinden bir profil yaratmak istenildiğinde karşımıza çıkan ekran görüntüleri bulunmaktadır.
Üstteki ekran görüntülerinde de görülebileceği gibi Profil’ler “genel” ve “parola” olmak üzere iki bölüm altında parametreler içerir. “genel” bölümünde, kullanıcının kullanabileceği kaynakları kısıtlamak amaçlı parametreler bulunurken, parola bölümünde kullanıcının parola güvenilirliğini belirleyebileceğimiz parametreler vardır.
Genel Parametreler:
CPU_PER_SESSION: Bir kullanıcı oturumunun kullanabileceği maksimum cpu zamanını belirler. Bu değer aşıldığında oturum ORA-02392 hatası ile sonlanır.
CPU_PER_CALL: Bir kullanıcının yarattığı call (parse, execute, ya da fetch) için maksimum cpu zamanını belirler. Bu değer aşıldığında oturum ORA-02393 hatası ile sonlanır.
CONNECT_TİME: Bir oturum için dakika olarak maksimum açık kalma zamanını belirler. Bir kullanıcı oturumu bu zamanı aştığında, oturum ORA-02399 hatası ile sonlanır.
IDLE_TIME: Bir oturumun maksimum inaktif kalma süresini dakika olarak belirler. Bu parametrede belirtilen süre kadar inaktif kalan bir kullanıcı oturumu ORA-02396 hatası ile sonlandırılır.
SESSIONS_PER_USER: Kullanıcının eş zamanlı açabileceği oturum sayısını kısıtlamak için kullanılır. Bu parametre ile belirtilen sayıda otur
um açan kullanıcı bir oturum daha açmak istediğinde ORA-02391 hatasını alır.
LOGICAL_READS_PER_SESSION: Bir oturumda okunabilecek maksimum data block sayısını belirler. Limit aşıldığında ORA-02394 hatası ile oturum sonlandırılır.
LOGICAL_READS_PER_CALL: Bir kullanıcının yarattığı call için okunabilecek maksimum data block sayısını belirler. Limit aşıldığında ORA-02395 hatası ile oturum sonlandırı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.
Parola Parametreleri:
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.
PASSWORD_LIFE_TIME: Bir parolanın geçerli sayılacağı maksimum zamanı gün olarak belirler.
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.
PASSWORD_REUSE_MAX: Bir parolanın tekrar kullanılabilmesi için tanımlanması gereken minimum farklı parola sayısını belirler.
PASSWORD_REUSE_TIME: Bir parolanın tekrar kullanılabilmesi için geçmesi gereken minimum süreyi belirler.
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. Genellikle “UNLIMITED” olarak tanımlanır.
PASSWORD_VERIFY_FUNCTION: Kullanılacak “Parola Doğrulama Fonsiyonu”nun ismi belirtilir. Parola Doğrulama Fonksiyonları bir sonraki konuda işlenecektir.
3 – Parola Güvenilirliği
Parola Doğrulama Fonksiyonları (Password Verify Function) kullanılarak, kullanıcılara verilecek parolaların belirli bir zorluk seviyesinde olması garanti edilebilir. Örneğin parolanın en az bir harf, bir rakam ve bir sembol içermesini, kullanıcı adı ile aynı olmamasını, en az 8 karakter uzunluğunda olmasını, daha önce verilen 3 paroladan farklı olmasını bu fonksiyonlar sayesinde isteyebiliriz. Oracle kurulumunda böyle bir fonksiyon gelmez, ancak varsayılan bir Parola Doğrulama Fonksiyonu oluşturmak için gerekli script $ORACLE_HOME/rdbms/admin dizini altında utlpwdmg.sql ismiyle bulunabilir. Bu SQL scriptini çalıştırarak varsayılan bir Parola Doğrulama Fonksiyonu oluşturabiliriz. Ayrıca SQL scripti içerisinde istediğimiz değişiklikleri yaparak da kendi güvenlik seviyemize uygun bir doğrulama fonksiyonu üretebiliriz.
4 – SYSDBA Bağlantısını Kısıtlama
Oracle veritabanının bulunduğu işletim sisteminde, dba grubundaki işletim sistemi kullanıcıları varsayılan olarak aşağıdaki komutla veritabanına şifresiz ve sys kullanıcısı olarak bağlantı kurabilmektedir.
sqlplus / as sysdba<br />
Bu şekilde bağlantı kurabiliyor olmak hiç güvenli sayılmaz. Çünkü dba grubundaki herhangi bir kullanıcının kötü niyetli kişilerin eline geçmesi demek, veritabanında her türlü yetki ile donatılmış sys kullanıcısının da kırılmış olması anlamına gelir. Bu nedenle güvenlik açısından veritabanına sözkonusu şekilde şifresiz bağlantıyı geçersiz kılmak gerekmektedir. Aşağıdaki satırın $ORACLE_HOME/network/admin dizini altındaki SQLNET.ORA dosyasında eklenmesi bunu gerçekleştirir.
SQLNET.AUTHENTICATION_SERVICES=(NONE)
5 – İşletim Sistemi Kullanıcı Doğrulamasının Sınırlandırılması
SQL> create user ops$emre identified externally; SQL> show parameter os_authent_prefix os_authent_prefix=ops$
Yukarıdaki ifade ile bir oracle kullanıcısı yaratıldığını ve os_authent_prefix parametresinin değerinin ops$ olduğunu düşünelim. Eğer işletim sisteminde “emre” isimli bir kullanıcı varsa, bu kullanıcının veritabanına bağlanırken herhangi bir kimlik doğrulama adımından geçmesine gerek kalmayacaktır. Aşağıdaki komut ile “emre” kullanıcısı veritabanına ops$emre kullanıcısı olarak bağlanabilecektir.
$sqlplus /
Şimdi ise os_authent_prefix parametresinin değerinin “”(boş) olduğunu düşünelim. İşletim sisteminde yaratılacak “system” isimli bir kullanıcı veritabanına “system” kullanıcısı olarak bağlanabilecektir. Bu tür bir güvenlik açığı vermemek için parametrenin değeri kontrol edilmeli, gerekirse değiştirilmelidir.
Aşağıdaki komutlarla parametre değeri sorgulanabilir ve değiştirilebilir.
SQL> select value from v$parameter where name = 'os_authent_prefix'; SQL> alter system set os_authent_prefix = ops$ scope=spfile;
(Değişikliğin etkili olması için veritabanını kapatıp tekrar başlatmak gerekir)
OPS$ kullanıcılarının parolaları kontrol edilir ve “password” kısmında “external” ifadesi olduğu doğrulanır.
SQL> select username, password from dba_users where username like 'OPS$%'; USERNAME PASSWORD ------------------------------ ------------------------------ OPS$EMRE EXTERNAL
6 – Uzaktan Kimlik Doğrulamanın Kaldırılması
SQL> show parameter remote_os_authent remote_os_authent = TRUE
Yukarıda görüldüğü gibi remote_os_authent parametresinin değerinin TRUE olduğunu düşünelim. Birinci sunucudaki veritabanında, OPS$EMRE isimli, parolası EXTERNAL olarak belirlenen bir kullanıcı varsa, ikinci sunucudaki “emre” isimli işletim sistemi kullanıcısı aşağıdaki komutla birinci sunucudaki veritabanına şifresiz bağlanabilir.
$sqlplus /@sunucu1<br />
Bu, güvenlik açısından sıkıntı yaratabilecek bir durum olduğu için bu özelliğin kapalı olması tavsiye edilir. Bunu gerçekleştirmek için aşağıdaki komutla remote_os_authent parametresinin değeri FALSE olarak düzenlenmelidir.
SQL> alter system set remote_os_authent = FALSE scope=spfile;
(Değişikliğin etkili olması için veritabanını kapatıp tekrar başlatmak gerekir)
7 – DBSNMP Parolasının Değiştirilmesi
Oracle Enterprise Manager’a veritabanı, listener ve sunucu hakkında bilgiler gönderilirken, veritabanına bağlantıda varsayılanda “DBSNMP” kullanıcısı kullanılır. Bu kullanıcının UNLIMITED TABLESPACE, SELECT ANY DICTIONARY, and ANALYZE ANY DICTIONARY gibi güçlü yetkileri vardır ve veritabanı yaratıldığında DBSNMP kullanıcısının parolası da dbsnmp’dir. Bu kullanıcının parolasını değiştirmek önemli bir güvenlik önlemidir ancak parola değiştirme işlemi diğer kullanıcılara göre biraz farklıdır. Diğer kullanıcıların parolalarını değiştirmek için kullanılan “ALTER USER … IDENTIFIED BY …” komutu bu kez tek başına yeterli olmayacaktır, çünkü parola OEM konfigürasyon dosyalarında da kayıtlıdır ve bu dosyalarda da gerekli değişikliği yapmak gerekir. “ALTER USER” komutu ile parola değiştirildikten sonra targets.xml dosyası içinde aşağıdaki satıra yeni parola yazılır.
↓ ↓
Görüldüğü gibi şifrelenmiş bir şekilde tutulan DBSNMP parolasını yeni parola ile değiştirdik. Peki parolanın açık şekil
de dosya içinde tutulması güvenilirmi? Bu konuda ORACLE akıllı davranarak enterprise manager servisinin kapatılıp açılması sonrasında parolayı şifreler.
$emctl stop dbconsole $emctl start dbconsole
Sonrasında parolanın bulunduğu satır aşağıdaki şekilde görünür.
8 – Parolaların Script’lerden Ve RMAN’den Kaldırılması
Parolaların Script’lerden kaldırılması basit ve önemli bir güvenlik önlemi, aynı zamanda yazılımsal anlamda güvenli bir alışkanlıktır. SQL script’ler normalde aşağıdaki komut biçimiyle çalıştırılabilirler:
$ sqlplus -s system/oracle @sorgu1.sql
Bu komut ile “sorgu1.sql” isimli SQL script, parolası “oracle” olan “system” kullanıcısı ile veritabanına bağlanılarak çalıştırılacak ve aşağıdaki gibi işletim sisteminde bir process olarak gözlenebilecektir.
$ ps -eaf |grep sql oracle 15566 28619 0 15:33:45 pts/0 0:00 sqlplus -s system/oracle @sorgu1.sql
Görüldüğü gibi system kullanıcısının şifresi, işletim sisteminde process’lerin sorgulanması vasıtasıyla elde edilebilir. Bunu engellemek için 4 farklı yöntemden bahsedebiliriz.
1. Yöntem:
Veritabanına bağlantı cümlesini SQL scriptin başına yazmak ve işletim sistemi komutunda kullanıcı adı, parola belirtmeden /nolog opsiyonunu kullanmak.
SQL script’in başına eklenecek bağlantı cümlesi: “connect system/oracle”
İşletim sisteminde kullanacağımız komut:
$ sqlplus -s /nolog @sorgu1.sql
2. Yöntem:
Bu yöntem ise SQL cümlelerinin SQL script’te değil bir shell script’te bulunması durumunda kullanılması gereken bir yöntemdir. Aşağıdaki ilk örnek güvensizdir. Çünkü shell script çalıştırıldığında process’lerin sorgulanması vasıtasıyla kullanıcı adı ve parolası öğrenilebilir. İkinci örnekte ise process’ler sorgulandığında /nolog ifadesi görünür.
sqlplus system/oracle << target="/" catalog="catowner/catpass@catalog_connect_string">


