Kullanıcı, Parola Ve Kimlik Doğrulama Güvenliği

Ekim 26 2009

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.

3797cf30e7c4a9c6 ” ENCRYPTED=”TRUE“/>
↓ ↓
new_password” ENCRYPTED=”FALSE“/>

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">

Emre Baransel tarafından yayınlandı 

Bir Cevap Yazın