Veritabanında standart denetleme audit_trail parametresine değer (os, db, db extended, xml, xml extended) atanması ile başlar. Eğer denetlemeyi durdurmak istersek parametre NONE yapılmalıdır. Bu parametrenin none yapılması ile beraber veritabanı kapatılıp açıldığında tüm denetleme durmuş olur.

Denetlemeler komut, yetki, obje ve network aktiviteleri bazında tanımlanır. Denetleme başlatmak için AUDIT, durdurmak için NOAUDIT komutu kullanılmalıdır.

Bir kullanıcı kendine ait tüm kullanıcılar üzerinde AUDIT başlatabilir. Başka kullanıcıların objeleri üzerinde AUDIT başlatmak için ise AUDIT ANY yetkisi olmalıdır. Sistem yetkileri üzerinde AUDIT tanımlamak için AUDIT SYSTEM yetkisi olmalıdır. NOAUDIT komutunun çalıştırılması için ise özel bir yetkiye gerek yoktur.

O7_DICTIONARY_ACCESSIBILITY parametresi FALSE ise denetim izleri yalnızca SYSDBA yekili kullanıcılar tarafında silinebilir. DELETE ANY TABLE yetkisine sahip kullanıcılar dahi silemezler.

Tüm denetim kayıtları herhangi bir transaction’ın tanımlanmasını beklemeden, denetlenecek komutun çalışma anında yazılır.

Komutların Denetlenmesi

Komut bazında denetleme yapılması, kullancıların çalıştırdığı,

  • DML(INSERT, UPDATE, DELETE, SELECT)
  • DDL(CREATE, DROP….)

gibi veritabanı komutlarının denetlenmesi işlemidir. Denetleme yaparken denetleyeceğimiz obje türünü girmemiz yeterlidir. AUDIT komutunda yazdığınız obje türüne türüne göre istenilen komutlar denetlenir. Obje türüne göre denetleyebileceğimiz komutlar aşağıdaki gibidir.

Oracle Audit System

 

 

 

 

 

 

 

Bu tür komut bazlı denetlemeyi başlatmak için AUDIT SYSTEM yetkisine sahip olunması gerekir. (dba_sys_privs viewi sorgulanarak yetki sahipleri bulunabilir) Komut bazında denetleme yeni session açıldığında aktif olur.

Örneğin tablo objesi DELETE komutunun tüm veritabanında denetlenmesi için aşağıdaki komutu çalıştırabiliriz.

audit delete table by access;

Yada sadece SYSTEM kullanıcısında çalıştırılan SELECT TABLE komutunu denetlemek istersek aşağıdaki komutu çalıştırabiliriz.

audit select table by system;

Verilen audit leri görmek için DBA_STMT_AUDIT_OPTS viewini sorgulayabiliriz.

Oracle Audit Privilege

 

 

Yukarıdaki resimdede görüldüğü gibi;

  • SYSTEM kullanıcısında çalışan tüm SELECT TABLE komutları
  • SYSTEM kullanıcısının çalıştırdığı tüm komutların
  • EXEMPT ACCESS POLICY yetkisini veren GRANT komutlarının
  • Bütün kullanıcılarda olmak üzere DELETE TABLE komutlarının denetlendiğini görmekteyiz.

Yukarıdaki resimdede görüldüğü gibi SYSTEM kullanıcısının hem ALL STATEMENTS, hemde SELECT TABLE komutuyla denetlenmektedir. Bu durumda SYSTEM kullanıcısı SELECT TABLE çalıştırdığında 2 tanemi denetim izi olacak diye soru işaretimiz olabilir fakat bu doğru bir yaklaşım değildir sadece bir tane denetim izi oluşur.

AUDIT DELETE TABLE BY ACCESS komutunda kullanılan BY ACCESS eki her bir delete komutu için bir denetim kaydı oluşturulacağını gösterir. BY ACCESS yerine BY SESSION kullanılırsa sessionlar’da kullanılan tüm delete komutlarına karşılık gelen tek bir denetim izi tutulacaktır. Bu nedenle BY SESSİON ile tutulan denetim izinleri bize detaylı bilgi vermez.

Standart olarak başarılı ve başarısız tüm komutlar denetlenir. Sadece başarılı komutları denetlemek istersek WHENEVER SUCCESSFUL, sadece başarısız komutları denetlemek istersek WHENEVER NOT SUCCESSFUL kelimelerini ekleriz.. Örn;

AUDIT UPDATE TABLE, INSERT TABLE  BY ACCESS WHENEVER NOT SUCCESSFUL;

Şu anda bağlı olan session’da çalışan tüm komutlar içinde denetim izi oluşturmak istersek, aşapıdaki komutu kullanırız.

AUDIT ALL STATEMENTS IN SESSION CURRENT;

Bu komut özellikle logon trigger içinde kullanıldığında, veritabanına bağlanan tüm sessionlar için denetim izleri toplamaya başlarız. Örn ad-hoc bir sorgulama programı olan SQL*Plus ile veritabanına bağlanan kullanıcıların komutlarını denetlemek istersek aşağıdaki gibi bir logon trigger yazmalıyız.

CREATE OR REPLACE TRIGGER SYS.SQLPLUS_LOGON_TRIGGER
   AFTER LOGON
   ON DATABASE
DECLARE
BEGIN
   IF 
            UPPER (SYS_CONTEXT ('userenv'), 'MODULE') LIKE '%SQL%PLUS%'  OR  
            UPPER (SYS_CONTEXT ('userenv'), 'MODULE') LIKE '%SQLPLUS%'
   THEN
      EXECUTE IMMEDIATE 'AUDIT ALL STATEMENTS IN SESSION CURRENT;';
   END IF;
EXCEPTION
   WHEN OTHERS
   THEN
      NULL;
END;
/

Veritabanına bağlanan tüm kullanıcılar denetlemek istersek aşağıdaki komutu çalıştırmalıyız. Ama fazla transaction olan yerde büyük sıkıntılara neden olabilir.

ADUIT SESSION BY ACCESS;

Birkaç pratik örnek yapacak olursak;

  • Sadece belirli bir kullanıcının çalıştırdığı bütün komutları denetlemek istersek, aşağıdaki komutu vermeliyiz.
AUDIT SESSION BY MUSTAFA BY ACCESS;
  • User bazlı denetleme için
AUDIT SELECT TABLE, UPDATE TABLE BY KAMIL, MUSTAFA BY ACCESS;
  • Login ve logout’ ların Audilenmesi;
AUDIT SESSION BY ACCESS;
  • Userların tüm SQL Statement’ larının Auditlenmesi
AUDIT ALL STATEMENTS BY MUSTAFA BY ACCESS;

Yetkilerin Denetlenmesi

Yetkilerin denetlenmesi bir kullanıcısnın sistem yetkilerini kullanarak yaptığı işlerin denetlenmesidir.Örn bir kullanıcının CREATE ANY TABLE yetkisi varsa ve bu yetkiyi kullanarak başka kullanıcılarda tablo yarattığında denetim izi oluşsun istiyorsak yetki denetlemesi yapmalıyız.

Kullanıcının yetkiye sahip olmadan erişebildiği nesneler için yetki denetlemesi yapılamaz. Örn bir kullanıcı kendi şemasında bulunan tabloları zaten select edebileceği için (SELECT ANY TABLE yetkisine  ihtiyaç yoktur) bu tür durumlarda yetki denetlemesi ile denetlenmez (Komut denetlenmesi yapılabilir.) Ama bir kullanıcı başka bir kullanıcının tablolarına SELECT ANY TABLE yetkisi ile eriştiği anda yetki denetlemesine takılır.

Yetki denetlemesi hem kullanıcı hemde veritabanı bazında olabilir. Yetki denetlemesi yapacak kullanıcının AUDIT SYSTEM yetkisi olmalıdır. Yetki denetlemesi ile denetleme yapabileceğimiz sistem yetkileri aşağıdaki gibidir.

ADMIN CREATE ANY VIEW DROP ANY SEQUENCE
ALTER ANY CACHE GROUP CREATE CACHE GROUP DROP ANY SYNONYM
ALTER ANY INDEX CREATE MATERIALIZED VIEW DROP ANY TABLE
ALTER ANY MATERIALIZED VIEW CREATE PROCEDURE DROP ANY VIEW
ALTER ANY PROCEDURE CREATE PUBLIC SYNONYM DROP PUBLIC SYNONYM
ALTER ANY SEQUENCE CREATE SEQUENCE EXECUTE ANY PROCEDURE
ALTER ANY TABLE CREATE SESSION FLUSH ANY CACHE GROUP
ALTER ANY VIEW CREATE SYNONYM INSERT ANY TABLE
CACHE_MANAGER CREATE TABLE LOAD ANY CACHE GROUP
CREATE ANY CACHE GROUP CREATE VIEW REFRESH ANY CACHE GROUP
CREATE ANY INDEX DELETE ANY TABLE SELECT ANY SEQUENCE
CREATE ANY MATERIALIZED VIEW DROP ANY CACHE GROUP SELECT ANY TABLE
CREATE ANY PROCEDURE DROP ANY INDEX UNLOAD ANY CACHE GROUP
CREATE ANY SEQUENCE DROP ANY MATERIALIZED VIEW UPDATE ANY TABLE
CREATE ANY SYNONYM DROP ANY PROCEDURE XLA
CREATE ANY TABLE

 

  • Bellirli bir kullanıcıya denetim izi oluşturmak.
AUDIT CREATE ANY TABLE BY MUSTAFA;
  • Tüm kullanıcıda denetim izi oluşturmak.
AUDIT DELETE ANY TABLE;
  • Yetkileri kaldırmak için.
NOAUDIT CREATE ANY TABLE BY MUSTAFA;

NOAUDIT DELETE ANY TABLE;

Obje Denetlenmesi

Objelerin denetlenmesi ile şemadaki bir nesne tüm veritabanı kullacıları için denetlenir. Bu tür bir denetleme belirli bir kullanıcının nesne üzerindeki erişimleri için kullanılmaz.  Yapılan denetim tanımı tüm kullanıcılar için geçerlidir.

Bir kullanıcı sahip olduğu nesneler üzerinde AUDIT tanımlama yetkisine sahiptir. Başka kullanıcıların nesneleri üzerinden denetleme tanımlayabilmesi için AUDIT ANY yetkisine sahip olmalıdır.

Örnegin bir obje için denetlme yapmak istesek.

AUDIT SELECT,INSERT,UPDATE ON MUSTAFA.TEST_TABLE BY ACCESS;

DBA_OBJ_AUDIT_OPTS görüntüsü ile objler üzerinde yapılan denetlemeler sorgulanır.

Oracle Audit Object

 

 

  • OWNER : Obje Sahibi
  • OBJECT_NAME : Obje İsmi
  • OBJECT_TYPE : Obje Tipi
  • ALT : Alter komutu Başarılı/Başarısız
  • AUD : Audit komutu Başarılı/Başarısız
  • COM : Comment komutu Başarılı/Başarısız
  • DEL : Delete komutu Başarılı/Başarısız
  • GRA : Grant komutu Başarılı/Başarısız
  • IND : Index komutu Başarılı/Başarısız
  • INS : Insert komutu Başarılı/Başarısız
  • LOC : Lock komutu Başarılı/Başarısız
  • REN : Rename komutu Başarılı/Başarısız
  • SEL : Select komutu Başarılı/Başarısız
  • UPD : Update komutu Başarılı/Başarısız
  • REF : Reference komutu Başarılı/Başarısız
  • EXE : Execute komutu Başarılı/Başarısız
  • CRE : Create komutu Başarılı/Başarısız
  • REA : Read komutu Başarılı/Başarısız
  • WRI : Write komutu Başarılı/Başarısız
  • FBK : Flashback komutu Başarılı/Başarısız

Kolon içerikleri ise aşağıdaki şekilde değerlendirilir.

  • -/- : Denetlenme tanımlanmamış
  • A/- : Komut başarılı çalıştığında denetleme yapılıyor (By Access)
  • -/A : Komut başarısız olduğunda denetleme yapılıyor (By Access)
  • A/A : Komut başarılı veya başarısız olduğunda denetleme yapılıyor (By Access)
  • S/- : Komut başarılı çalıştığında denetleme yapılıyor (By Session)
  • -/S : Komut başarısız olduğunda denetleme yapılıyor (By Session)
  • S/S : Komut başarılı veya başarısız olduğunda denetleme yapılıyor (By Session)

Veritaanında henüz yaratılmayan nesnelerin denetlenmesinide tanımlayabiliriz. Bu kullanım AUDIT komut içinde ON DEFAULT tanımının kullanılması ile yapılır ve standart olarak denetlemeler  all_def_audit_opts viewi ile sorgulanır.

Oracle Standart Auditing

 

 

 

 

Veritabanında Standart Olarak Kullanılan Denetleme Tanımları

Bir veritabanı standart olarak dbca arabirimi ile yaratıldığında, denetim izleri veritabanında tutulur. Audit_trail parametresi DB olarak atanır. $ORACLE_HOME/rdbms/admin dizinindeki secconf.sql dosyası çalıştırılarak veritabanındaki standart denetimler tanımlanır.

Veritabanı oluşturulduğunda tanımlanan standart denetimleri geri almak istersek aynı dizindeki undoaud.sql dosyasını çalıştırmalıyız.

Kendi yarattığımız veritabanlarında standart denetleme tanımlarını yapmak istersek secconf.sql betiğini değiştirebiliriz.

  • Audit alter any table by access;
  • Audit create any table by access;
  • Audit drop any table by access;
  • Audit Create any procedure by access;
  • Audit Drop any procedure by access;
  • Audit Alter any procedure by access;
  • Audit Grant any privilege by access;
  • Audit grant any object privilege by access;
  • Audit grant any role by access;
  • Audit audit system by access;
  • Audit create external job by access;
  • Audit create any job by access;
  • Audit create any library by access;
  • Audit create public database link by access;
  • Audit exempt access policy by access;
  • Audit alter user by access;
  • Audit create user by access;
  • Audit role by access;
  • Audit create session by access;
  • Audit drop user by access;
  • Audit alter database by access;
  • Audit alter system by access;
  • Audit alter profile by access;
  • Audit drop profile by access;
  • Audit database link by access;
  • Audit system audit by access;
  • Audit profile by access;
  • Audit public synonym by access;
  • Audit system grant by access;
  • Audit directory by access;

Orta Katman Kullanıcılarının Denetlenmesi

Orta katman uygulamaları veritabanına bağlanırken, veritabanında daha önceden açılmış bir session’ı kullanırlar. Orta katman kullanıcıları aslında veritabanında ortak bir veritabanı kullanıcısı kullanır. Bu nedenle denetleme açısından bakıldığında orta katmandan gelen kullanıcılar için özel bir çalışma yapılmadığı sürece birbirinden ayırt etmek imkansızdır..

Orta katmandan bağlanan kullanıcıların veritabanında denetlenebilmesi için kullanılacak seçeneklerden biri, veritabanına bağlantı kurarken orta katman tarafında CLIENT_IDENTIFIER alanının set edilmesidir. Bu durumda her bir uygulama kullanıcısı veritabanına bağlandığında , oracle.jdbc.driver.OracleConnection paketi ile bağlantı yaparken setClientIdentified() metodu kullanılarak CLIENT_IDENTIFIED alanına kullanıcı kodu atar. Java tarafında tarafında CLIENT_IDENTIFIER alanına değer atamak için farklı metodlar bulunmaktadır. Bunun dışında diğer bir yöntem ise Dynamic Monitoring Service tanımının kullanılmasıdır.

Client_identifier bilgisine USERENV uygulama bağlamı ile erişilir.

Anıl Akduygu Oracle Veritabanı Güvenliği
https://docs.oracle.com/cd/E11882_01/server.112/e10575/tdpsg_auditing.htm#TDPSG52529
http://www.kamilturkyilmaz.com/2011/01/21/oracle%E2%80%99-da-audit-mekanizmasi/

İyi Çalışmalar…
Mustafa Bektaş Tepe

Loading