BlogOracle

Kritik kullanıcı yetki kontrolleri – Oracle Database

Oracle Database üzerinde yetki her zaman bir karmaşadır. Bu yazımızda özellikle denetleme döneminde büyük dertlere sebep veren bu süreç üzerine nelere dikkat etmemiz gerekiyor, bu yetkileri nasıl kontrol edebiliriz, bunu inceleyeceğiz.

Veritabanı kullanıcıları için en kritik yetki ” ALTER ” ve ” ANY ” yetkileridir. Bu yetkiyi alan kullanıcılar aynı zamanda diğer kullanıcılar üzerindede hakimiyet kurabilmektedir. Veritabanı üzerindeki bütün tabloları silebilir, yeniden oluşturabilir ve düzenlebilir. Bu tip bir yetki kesinlikle tavsiye edilmez. Gerekli olan ihtiyaca göre yetkilendirmedir.

Oracle Database default kullanıcıları örneğin ” SYS ” yada ” SYSTEM bu yetkilere ihtiyaç duyar. Aşağıda bu tip kullanıcılar hariç tutularak yukarıda bahsettiğimiz kritik yetkilere sahip kişileri bulabilceğiniz SQL sorgusu verilmiştir.

/* Kritik yetkilerin kontrol edilmesi */
SELECT
	A.*,
	'GRANTED TO USER' TYPE
FROM
	DBA_SYS_PRIVS A,
	DBA_USERS B
WHERE
	A.GRANTEE = B.USERNAME
	AND PRIVILEGE IN(
		'BECOME USER',
		'ALTER USER',
		'DROP USER',
		'CREATE ROLE',
		'ALTER ANY ROLE',
		'DROP ANY ROLE',
		'GRANT ANY ROLE',
		'CREATE PROFILE',
		'ALTER PROFILE',
		'DROP PROFILE',
		'CREATE ANY TABLE',
		'ALTER ANY TABLE',
		'DROP ANY TABLE',
		'INSERT ANY TABLE',
		'UPDATE ANY TABLE',
		'DELETE ANY TABLE',
		'SELECT ANY TABLE',
		'CREATE ANY PROCEDURE',
		'ALTER ANY PROCEDURE',
		'DROP ANY PROCEDURE',
		'EXECUTE ANY PROCEDURE',
		'CREATE ANY TRIGGER',
		'ALTER ANY TRIGGER',
		'DROP ANY TRIGGER',
		'CREATE TABLESPACE',
		'ALTER TABLESPACE',
		'DROP TABLESPACES',
		'ALTER DATABASE',
		'ALTER SYSTEM',
		'SELECT ANY DICTIONARY',
		'EXEMPT ACCESS POLICY',
		'CREATE ANY LIBRARY',
		'GRANT ANY OBJECT PRIVILEGE',
		'GRANT ANY PRIVILEGE',
		'AUDIT ANY'
	)
	AND GRANTEE NOT IN(
		'ANONYMOUS',
		'CTXSYS',
		'DBSNMP',
		'EXFSYS',
		'LBACSYS',
		'MDSYS',
		'MGMT_VIEW',
		'OLAPSYS',
		'OWBSYS',
		'ORDPLUGINS',
		'ORDSYS',
		'OUTLN',
		'SI_INFORMTN_SCHEMA',
		'SYS',
		'SYSMAN',
		'SYSTEM',
		'TSMSYS',
		'WK_TEST',
		'WKSYS',
		'WKPROXY',
		'WMSYS',
		'XDB',
		'APEX_PUBLIC_USER',
		'DIP',
		'FLOWS_30000',
		'FLOWS_FILES',
		'MDDATA',
		'ORACLE_OCM',
		'SPATIAL_CSW_ADMIN_USR',
		'SPATIAL_WFS_ADMIN_USR',
		'XS$NULL',
		'OWBSYS_AUDIT',
		'ORDDATA',
		'APEX_030200',
		'APPQOSSYS',
		'DVSYS',
		'DVF'
	)
UNION ALL 
SELECT
	A.*,
	'GRANTED TO ROLE' TYPE
FROM
	DBA_SYS_PRIVS A,
	DBA_ROLES B
WHERE
	A.GRANTEE = B.ROLE
	AND PRIVILEGE IN(
		'BECOME USER',
		'ALTER USER',
		'DROP USER',
		'CREATE ROLE',
		'ALTER ANY ROLE',
		'DROP ANY ROLE',
		'GRANT ANY ROLE',
		'CREATE PROFILE',
		'ALTER PROFILE',
		'DROP PROFILE',
		'CREATE ANY TABLE',
		'ALTER ANY TABLE',
		'DROP ANY TABLE',
		'INSERT ANY TABLE',
		'UPDATE ANY TABLE',
		'DELETE ANY TABLE',
		'SELECT ANY TABLE',
		'CREATE ANY PROCEDURE',
		'ALTER ANY PROCEDURE',
		'DROP ANY PROCEDURE',
		'EXECUTE ANY PROCEDURE',
		'CREATE ANY TRIGGER',
		'ALTER ANY TRIGGER',
		'DROP ANY TRIGGER',
		'CREATE TABLESPACE',
		'ALTER TABLESPACE',
		'DROP TABLESPACES',
		'ALTER DATABASE',
		'ALTER SYSTEM',
		'SELECT ANY DICTIONARY',
		'EXEMPT ACCESS POLICY',
		'CREATE ANY LIBRARY',
		'GRANT ANY OBJECT PRIVILEGE',
		'GRANT ANY PRIVILEGE',
		'AUDIT ANY'
	)
	AND GRANTEE NOT IN(
		'DBA',
		'IMP_FULL_DATABASE',
		'DATAPUMP_IMP_FULL_DATABASE',
		'OLAP_DBA',
		'EXP_FULL_DATABASE',
		'OEM_MONITOR'
	);

Yukarıdaki kod bloğunu çalıştırdığınızda aşağıdaki gibi bir döküm alırsınız. Ben belli olması için ” HR ” kullanıcısına yetki verdim. Aşağıda görüyoruz. Sizde karşınıza çıkan kullanıcıları detaylı olarak incelemeli ve gerekiyorsa yetkilerini almalısınız.

Peki bu yetkileri nasıl alabilirsiniz. Syntax : REVOKE {system_privilege | object_privilege } FROM user;

Örnek ;

REVOKE ALTER ANY TRIGGER FROM HR;
REVOKE ALTER ANY TABLE FROM HR;

Peki bu yeterlimi hayır, birde bu yetkileri ” ADMIN OPTION ” dediğimiz ek özellikle almış olabilirler. ADMIN OPTION size verilen yetkileri , sizinde başkasına verebileceğiniz bir özelliktir. Diğer bir değişle size ” CREATE ANY TABLE ” yetkisi ” ADMIN OPTION ” ile verildiyse sizde bu yetkiyi başkasına verebilirsiniz. Bu yetki net bir ifade ile DBA yöneticileri dışında kimsede olmamalıdır.

Kullanıcılara atanmış ADMIN OPTION yetkisini görmek için

/* ADMIN OPTION yetkisine sahip kullanıcılar */

SELECT A.GRANTEE, A.PRIVILEGE, A.ADMIN_OPTION
  FROM DBA_SYS_PRIVS A, DBA_USERS B
 WHERE     A.ADMIN_OPTION = 'YES'
       AND A.GRANTEE NOT IN ('ANONYMOUS',
                             'CTXSYS',
                             'DBSNMP',
                             'EXFSYS',
                             'LBACSYS',
                             'MDSYS',
                             'MGMT_VIEW',
                             'OLAPSYS',
                             'OWBSYS',
                             'ORDPLUGINS',
                             'ORDSYS',
                             'OUTLN',
                             'SI_INFORMTN_SCHEMA',
                             'SYS',
                             'SYSMAN',
                             'SYSTEM',
                             'TSMSYS',
                             'WK_TEST',
                             'WKSYS',
                             'WKPROXY',
                             'WMSYS',
                             'XDB',
                             'APEX_PUBLIC_USER',
                             'DIP',
                             'FLOWS_30000',
                             'FLOWS_FILES',
                             'MDDATA',
                             'ORACLE_OCM',
                             'SPATIAL_CSW_ADMIN_USR',
                             'SPATIAL_WFS_ADMIN_USR',
                             'XS$NULL',
                             'OWBSYS_AUDIT',
                             'ORDDATA',
                             'APEX_030200',
                             'APPQOSSYS',
                             'DVSYS',
                             'DVF')
       AND A.GRANTEE = B.USERNAME;

Kod bloğunu çalıştırdığımda ” HR ” kullanıcısının bu yetkiye sahip olduğunu görüyorum.

Yetkisi almak için komut aynı

REVOKE ALTER ANY TABLE FROM HR;

Bununla birlikte SYSDBA yetkisine sahip kullanıcılarında incelenmesi gerekir.

/* SYSDBA Yetkisine sahip kullanıcılar */
SELECT *
  FROM v$pwfile_users
 WHERE SYSDBA = 'TRUE';

Örnek çıktı aşağıdaki gibi, bende sadece SYS görünüyor. Eğer farklı kullanıcılar varsa araştırılması gerekir.

Farklı bir kullanıcı listelendiğinde yetkisini almamız gerekirse;

REVOKE SYSDBA FROM HR 

Bununla birlikte ” DBA ” rolüne sahip kullanıcılarında incelenmesi gerekir. Bu yetkiye sahip kullanıcıları görmek isterseniz;

/* Formatted on 10/18/2020 12:53:38 PM (QP5 v5.300) */

SELECT DISTINCT A.GRANTEE, A.GRANTED_ROLE, 'DBA' GRANTED_CRITIC_ROLE
  FROM (    SELECT DISTINCT LEVEL LEVEL_DEEP, GRANTEE, GRANTED_ROLE
              FROM DBA_ROLE_PRIVS
        START WITH GRANTED_ROLE = 'DBA'
        CONNECT BY PRIOR GRANTEE = GRANTED_ROLE) A,
       DBA_USERS  B
 WHERE     A.GRANTEE = B.USERNAME
       AND B.USERNAME NOT IN ('SYSTEM', 'SYS')
       AND B.ACCOUNT_STATUS = 'OPEN';

Yukarıkdaki kod bloğunu çalıştırdığımda ” HR ” kullanıcısının bu yetkiye sahip olduğunu görüyorum. Sizde farklı kullanıcılar görürseniz bunu araştırmalısınız.

Yetkiyi almak istersek;

REVOKE DBA FROM HR 

Son olarak CATALOG yetkilerinede bir bakalım. Katalog yetkileri üç farklı bölümde incelenir.

DELETE_CATALOG_ROLE; Veritabanında denetim izleri burada tutulur.Örneğin AUD$ tablosunu silmek için bu yetkiye ihtiyaç vardır. Bir kullanıcı bu yetkiye sahip olursa veritabanında denetim yani log kayıtlarını silebilir.

Aşağıdaki sorgu ile bu yetkiye sahip kullanıcıları listeyebilirsiniz.

/* Delete Catalog Role kontrolü */

SELECT DISTINCT
       A.GRANTEE, GRANTED_ROLE, 'DELETE_CATALOG_ROLE' GRANTED_CRITIC_ROLE
  FROM (    SELECT DISTINCT LEVEL LEVEL_DEEP, GRANTEE, GRANTED_ROLE
              FROM DBA_ROLE_PRIVS
        START WITH GRANTED_ROLE = 'DELETE_CATALOG_ROLE'
        CONNECT BY PRIOR GRANTEE = GRANTED_ROLE) A,
       DBA_USERS  B
 WHERE     A.GRANTEE = B.USERNAME
       AND B.USERNAME NOT IN ('SYSTEM', 'SYS', 'SYSMAN')
       AND B.ACCOUNT_STATUS = 'OPEN';

Yetkisini almak için

REVOKE DELETE_CATALOG_ROLE FROM HR 

SELECT_CATALOG_ROLE; SYS kullanıcısında bulunan tablolarını diğer kullanıcıların listeyebileceği ve sorgulayabileceği roldür.

/* Select Catalog Role kontrolü */
SELECT DISTINCT
       A.GRANTEE, GRANTED_ROLE, 'SELECT_CATALOG_ROLE' GRANTED_CRITIC_ROLE
  FROM (    SELECT DISTINCT LEVEL LEVEL_DEEP, GRANTEE, GRANTED_ROLE
              FROM DBA_ROLE_PRIVS
        START WITH GRANTED_ROLE = 'SELECT_CATALOG_ROLE'
        CONNECT BY PRIOR GRANTEE = GRANTED_ROLE) A,
       DBA_USERS  B
 WHERE     A.GRANTEE = B.USERNAME
       AND B.USERNAME NOT IN ('SYSTEM', 'SYS', 'SYSMAN')
       AND B.ACCOUNT_STATUS = 'OPEN';

Yetkisini almak için

REVOKE SELECT_CATALOG_ROLE FROM HR 

EXECUTE_CATALOG_ROLE; SYS kullanıcısı üzerinde prosedür ve fonksiyonların çalıştırılması hakkını atandığı kullanıcıya veren haktır.

/* Execute Catalog Role kontrolü */
SELECT DISTINCT
       A.GRANTEE, GRANTED_ROLE, 'EXECUTE_CATALOG_ROLE' GRANTED_CRITIC_ROLE
  FROM (    SELECT DISTINCT LEVEL LEVEL_DEEP, GRANTEE, GRANTED_ROLE
              FROM DBA_ROLE_PRIVS
        START WITH GRANTED_ROLE = 'EXECUTE_CATALOG_ROLE'
        CONNECT BY PRIOR GRANTEE = GRANTED_ROLE) A,
       DBA_USERS  B
 WHERE     A.GRANTEE = B.USERNAME
       AND B.USERNAME NOT IN ('SYSTEM', 'SYS', 'SYSMAN')
       AND B.ACCOUNT_STATUS = 'OPEN';
REVOKE EXECUTE_CATALOG_ROLE FROM HR 

Bu yazımızda Oracle Database kullanıcı yetkilerini ilk bakışta nasıl incelemeliyiz, nelere dikkat etmeliyiz konularına değindik. Umarım faydası olmuştur.

Diğer yazılarımızda görüşmek dileğiyle.

Buğra PARLAYAN

Çok sevdiği mesleği Oracle Veritabanı Yöneticiliğinde bulunmayan Türkçe kaynakları yazan hayırsever genco

İlgili Makaleler

3 Yorum

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Başa dön tuşu