Yetkilendirme Güvenliği

Ekim 26 2009

1 – Yetki ve Roller

Yetki (Privilege) ve roller (Role) Oracle veritabanında bulunan bir kullanıcının neleri yapıp, neleri yapamayacağını belirlemek için kullanılan kavramlardır. Bu yetki ve roller kullanıcılara verilirken çok dikkat edilmelidir. Çünkü masum görünen bir yetki kullanıcının kötü niyetli olması durumunda güvenlik açığı olarak karşımıza çıkacaktır.

Yetkiler (Privilege), bir kullanıcının belirli bir tipteki SQL komutunu çalıştırma yetkisi, diğer kullanıcıların objelerine erişim yetkisi, bir PL/SQL paketi çalıştırabilme yetkisi gibi kavramlardır. Roller (Role) ise birkaç yetki ya da rolleri bir grup altında toplamaya yarar.

Yetkiler, sistem yetkileri (system privilege) ve obje yetkileri (object privilege) olmak üzere ikiye ayrılır. Sistem yetkileri kullanıcının belirli bir veritabanı operasyonunu yapabilmesini sağlar. Obje yetkileri ise belirli bir veritabanı objesi üzerindeki erişim yetkilerini düzenler.

Örnek olarak, aşağıda Enterprise Manager üzerinde SYSMAN kullanıcısının sahip olduğu roller, system yetkileri ve obje yetkilerinin sorgulandığı ekran çıktısı bulunmaktadır.

Görüldüğü üzere SYSMAN kullanıcısına görevlerini yerine getirebilmesi amacıyla, kurulumda gelen bazı yetki ve roller tanımlanmıştır. Tanımlanan rollerin ve sistem yetkilerinin yanında görülen “Admin Option” ve obje yetkilerinin yanında görülen “Grant Option” ifadesi, kullanıcının bu rol ya da sistem yetkilerini başka kullanıcılara atayıp atayamayacağını gösterir.

Rollerin ve yetkilerin kullanıcılara atanması için Enterprise Manager ya da başka bir yönetim aracı kullanılabileceği gibi aşağıdaki komutlar da belirtilen formatta kullanılabilir.

SQL> grant sistem_yetkisi(rol) to kullanıcı_adı(rol);
SQL> grant sistem_yetkisi_1(rol_1), sistem_yetkisi_2(rol_2), .., sistem_yetkisi_n(rol_n) to kullanıcı_adı(rol);
SQL> grant sistem_yetkisi to kullanıcı_adı(rol) with admin option;
SQL> grant obje_yetkisi to kullanıcı_adı(rol);
SQL> grant obje_yetkisi to kullanıcı_adı(rol) with grant option;

Örnek GRANT komutları:

SQL> grant select, insert on customer to fred, mary, joe;
SQL> grant insert on order_table to update_role;
SQL> grant all on customer to fred;
SQL> grant select on customer_view to mary;
SQL> grant create any cluster to customer_role;
SQL> grant select any table to fred;
SQL> grant create any table to public;
SQL> grant create tablespace to dba_role;

Yetki ve roller kullanıcılara atanırken yöntemimizin şu şekilde olmasında fayda vardır.

1- Yetki ve Roller kullanıcı tarafından talep edilmediği sürece verilmemelidirler.
2- Talep edilen yetki veya rollerin ne amaçla istenildiği sorgulanmalıdır.
3- Verilecek yetki ve rollerin güvenlik açısından ne gibi sorunlar yaratabileceği araştırılmalı ve kullanıcıya verilmeden önce bu hususlar değerlendirilmelidir.

2 – PUBLIC Yetkileri

Veritabanı yaratıldığında otomatik olarak yaratılan PUBLIC rolü gizli bir roldür. (DBA_ROLES view’ı sorgulandığında görülmez.) PUBLIC rolü veritabanındaki tüm kullanıcıların kalıcı varsayılan rolü olarak düşünülebilir. Başka bir ifade ile, PUBLIC rolüne atanan her türlü yetki, otomatik olarak tüm kullanıcıların kullanabileceği bir yetki haline gelir. Bu nedenle PUBLIC yetkileri, büyük güvenlik açıkları yaratabilecek bir konudur.

Veritabanı yaratıldığında varsayılan olarak PUBLIC rolüne belirli obje yetkileri atanır. Aşağıdaki komut ile, 11g versiyonu bir veritabanında varsayılan olarak PUBLIC rolüne atanmış 27467 adet obje yetkisi olduğunu görüyoruz.

SQL> select count(*) from dba_tab_privs where grantee='PUBLIC';
        COUNT(*)
        ----------
        27467

Ancak bu obje yetkilerini kaldırmak çeşitli hatalara yol açabilmektedir. Örneğin versiyon yükseltme, yama atma gibi işlemlerde hata ortaya çıkabilir. Ayrıca bu işlemler genellikle PUBLIC yetkilerini tekrar varsayılana dönüştürür. Bu nedenlerle PUBLIC rolüne atanmış obje yetkilerini kaldırmak tavsiye edilmez. Bu işlem yapılacaksa da çok dikkatli bir çalışma ile tüm etkileri hesaba katılarak yapılmalıdır.

PUBLIC rolüne atanan system yetkilerini aşağıdaki komutla sorguladığımızda ise, varsayılanda PUBLIC rolüne hiçbir sistem yetkisinin atanmadığını görürüz.

SQL> select count(*) from  dba_sys_privs where grantee = 'PUBLIC';
        COUNT(*)
        ----------
         0

PUBLIC rolüne sistem yetkisi atamak büyük güvenlik tehditlerine yol açacağından, hiçbir zaman tavsiye edilmez. Sistem yetkileri gerekli kullanıcılara roller vasıtasıyla atanmalıdır. Birçok sistem yetkisinin, kötü niyetli kişilerce veritabanı üzerinde hasar verici işlemlerin gerçekleştirilmesinde kullanılabileceği unutulmamalıdır.

3 – Geniş Yetkilerin Kaldırılması

Geniş yetkiler ifadesi kişiye göre farklılık gösterebilecek bir kavramdır. Ancak veritabanı güvenliğini sağlamakla sorumlu uzmanlar bu tanımı kendilerince netleştirip, “geniş yetkilere” sahip kullanıcıları belirleyerek, kullanıcıların bu yetkilere gerçekten ihtiyaçları olup olmadığını sorgulamalıdırlar. Aşağıdaki SQL script ile, bir kullanıcının sahip olmasında güvenlik riski bulunmayan yetkiler belirlenerek, bunların dışındaki yetkiler (geniş yetkiler) ve yetkilere sahip kullanıcılar listesi alınmaktadır. Script, ‘SYS’, ‘SYSTEM’, ‘WKSYS’, ‘XDB’, ‘MDSYS’, ‘ORDPLUGINS’, ‘ODM’, ‘DBA’, ‘IMP_FULL_DATABASE’, ‘EXP_FULL_DATABASE’ gibi varsayılan kullanıcı ve roller için çıktı alınmayacak şekilde oluşturulmuştur.

set pages 50000
break on privilege skip 1
select privilege, grantee, admin_option from dba_sys_privs
   where privilege not in (/* list any other privilege here you don't find "sweeping"
          *'ALTER SESSION','QUERY REWRITE','CREATE DIMENSION',
          'CREATE INDEXTYPE','CREATE LIBRARY','CREATE OPERATOR',
          'CREATE PROCEDURE','CREATE SEQUENCE','CREATE SESSION',
          'CREATE SNAPSHOT','CREATE SYNONYM','CREATE TABLE',
          'CREATE TRIGGER','CREATE TYPE','CREATE USER','CREATE VIEW')
   and grantee not in('SYS','SYSTEM','WKSYS','XDB','MDSYS','ORDPLUGINS',
                            'ODM','DBA', 'IMP_FULL_DATABASE', 'EXP_FULL_DATABASE')
   /* Place all the user names you want to exclude */
  order by privilege, grantee

Aşağıda ise belirtilen SQL script çıktısının örnek bir bölümü bulunmaktadır. PRIVILEGE kolonu yetkileri, GRANTEE kolonu yetkiye sahip kullanıcıyı, ADM kolonu ise kullanıcının bu yetkiye ADMIN OPTION ile sahip olup olmadığını belirtir. Bu çıktı detaylı incelenerek gerek görülmeyen yetkilerin kaldırılmaları önemli bir güvenlik adımıdır.

PRIVILEGE                         GRANTEE                        ADM
--------------------------------  -----------------------------  ------

CREATE ANY TABLE                  RAPOR                          NO
                                  TEST                           NO
                                  SYSMAN                         NO
                                  WMSYS                          NO

CREATE ANY TRIGGER                TEST                           NO
                                  WMSYS                          NO

CREATE ANY TYPE                   TEST                           NO

CREATE ANY VIEW                   TEST                           NO
                                  WMSYS                          NO

CREATE CLUSTER                    TEST                           NO
                                  RECOVERY_CATALOG_OWNER         NO
                                  RESOURCE                       NO

CREATE DATABASE LINK              TEST                           NO
                                  RECOVERY_CATALOG_OWNER         NO

Bir kullanıcının yetkisini kaldırmak dikkatsizce yapılmaması gereken bir işlemdir. Bu nedenle kaldırılması gerektiğine karar verilen yetkilerin, kaldırılmarı durumundaki muhtemel etkileri iyi analiz edilmelidir. Bu noktada önemli bir metod, veritabanı kullanıcısının arkasındaki gerçek kişilerle birebir görüşmektir.

4 – Direkt Yetkilendirmenin Kullanılması

Bir yetki atanırken “with grant/admin option” seçeneğinin kullanılabileceğini daha önce belirtmiştik. Bu seçenek kullanılarak yetki atanan kullanıcı, bu yetkiyi başkalarına da atayabilmektedir. Örneğin aşağıdaki örnekte A kullanıcısı B kullanıcısına tab1 tablosunu sorgulama yetkisi ermektedir. Ancak yetkiyi alan B kullanıcısı bu yetkiyi C kullanıcısına verirken hata almaktadır.

SQL> Connect A/******
SQL> Grant select on tab1 to B;
Grant succeeded
SQL> Connect B/******
SQL> Grant select on a.tab1 to C;
ORA-01031: insufficient privileges

Ancak A kullanıcısı B kullanıcısına yetkiyi aşağıdaki şekilde atasaydı, B kullanıcı da bu yetkiyi C kullanıcısına atayabilecekti.

SQL> Connect A/******
SQL> Grant select on tab1 to B with grant option;
Grant succeeded
SQL> Connect B/******
SQL> Grant select on a.tab1 to C;
Grant succeeded

Benzer şekilde B kullanıcısı da bu yetkiyi C kullanıcısına “with grant option” seçeneği ile verebilir. Bu noktada aklınıza şu soru gelebilir: A kullanıcısı B kullanıcısına verdiği yetkiyi geri alırsa, C kullanıcısının B kullanıcısından aldığı yetkiye ne olur? İşte bu noktada Oracle’ın davranışı, yetkinin sistem ya da obje yetkisi olmasına göre, aşağıdaki şekillerde görüldüğü gibi farklılık göstermektedir.

SİSTEM YETKİSİNİN GERİ ALINMASI

OBJE YETKİSİNİN GERİ ALINMASI

Şekilde görülebileceği gibi sistem yetkisi söz konusu olduğunda, C’nin yetkisi kalırken, obje yetkisi söz konusu olduğunda C’nin yetkisi de B’nin yetkisi ile birlikte kalkmaktadır. Her iki seçenek te, yeri geldiğinde istenmeyen durumlara yol açabilir.

Başka bir senaryo ise, C kullanıcısına hem B hem de A kullanıcısı tarafından aynı obje yetkisinin verilmesi olarak düşünülebilir. Böyle bir durumda, A ya da B kullanıcılarından herhangi biri C’den söz konusu yetkiyi geri aldığında, diğer kullanıcının atadığı yetki C kullanıcısında kalacaktır. Bu durum ise yanıltıcı olabilir.

Konu başlığındaki ifadede geçtiği gibi “direkt” yetkilerin kullanılması bu tip sorunların önüne geçecektir. Başka bir ifade ile, yetki verirken “with admin/grant option” seçeneğini kullanmaz isek, bahsettiğimiz problemlerle karşılaşmayız. Obje yetkilerini verirken, sadece obje sahibi ya da sys kullanıcısı gibi bir yönetici hesabı ile yetkileri atamalıyız. Güvenlik kontrolü yapacağımız bir veritabanında ise aşağıdaki komutu kullanarak, bir obje yetkisinin, obje sahibi dışındaki kullanıcılar tarafından atandığı yetkileri tespit edebiliriz.

SQL> select owner, table_name, privilege, grantee, grantor from dba_tab_privs
          where grantor != owner and grantee != 'PUBLIC';

OWNER      TABLE_NAME   PRIVILEGE      GRANTEE    GRANTOR
---------  ----------   -------------  ---------- ----------
A          TAB1         SELECT         C          B

Burada A kullanıcısına ait TAB1 tablosu üzerinde select yetkisinin, B kullanıcısı tarafından C kullanıcısına atadığını görebiliyoruz. Bu durumu düzeltmek için, B kullanıcısı tarafından atanan bu yetkiyi kaldırarak, yetkiyi obje sahibi olan A kullanıcısı ya da SYS kullanıcısı ile atamamız gerekir.

Sistem yetkileri için de “with admin option” seçeneğinin kullanılmaması ve sistem yetkilerinin SYS tarafından verilmesi daha güvenli olacaktır. Bu seçenek kullanılarak verilen yetkileri aşağıdaki komut ile tespit edebiliriz.

SQL> select * from  DBA_SYS_PRIVS where ADMIN_OPTION='YES' and
          GRANTEE not in ('DBA','SYS','SYSTEM','AQ_ADMINISTRATOR_ROLE','SCHEDULER_ADMIN');
GRANTEE     PRIVILEGE      ADM
----------  ------------   ------
B              CREATE TABLE   YES

Görüldüğü gibi B kullanıcısına “with admin option” seçeneği ile tablo yaratma yetkisi verilmiştir. Bu yetkinin kaldırılarak “with admin option” ifadesi olmadan tekrar verilmesi uygun olacaktır.

5 – Tablespace Kotalarının Sınırlandırılması

• İlk olarak aşağıdaki sorgu ile SYTEM tablespace’i üzerindeki kotalar kontrol edilir:

SQL>select username, bytes/1024/1024 used, max_bytes/1024/1024 quota
        from dba_ts_quotas where tablespace_name = 'SYSTEM' order by username;

• SYSTEM tablespace’i üzerindeki limitsiz kota yetkileri kaldırılmalıdır. Ancak bundan önce SYSTEM tablespace’inin SYS şeması dışında objeler içermediğinin doğrulanması gerekir. Aşağıdaki sorgu ile kontrol edilebilir.

SQL> select owner, segment_type, segment_name from dba_segments<
         where tablespace_name = 'SYSTEM' and owner not in ('SYS','SYSTEM');

• Bir sonraki adımda sınırsız tablespace (unlimited tablespace) sistem yetkisine sahip kullanıcılar belirlenir.

SQL> select grantee from dba_sys_privs where privilege = 'UNLIMITED TABLESPACE';

• “UNLIMITED TABLESPACE” yetkisinin RESOURCE rolüne atanmadığı aşağıdaki sorgu ile doğrulanmalıdır.

SQL> select * from dba_sys_privs where grantee = 'RESOURCE';
Emre Baransel tarafından yayınlandı

Bir Cevap Yazın