Quantcast
Channel: Oracle –ÇözümPark
Viewing all articles
Browse latest Browse all 68

Oracle Audit Mekanizması

$
0
0

 

Kurumsal firmalarda uzun bir zamandır hem databasehemdeoperatingsytem seviyesinde şirket için gizli ve değerli bilgilerin bir takım kullanıcılar tarafından şirklet dışına çıkartılması veya bu bilgilerin şirket içerisinde kötü amaçlarla kullanılmasnıönlemek için firmalar çok çeşitli yöntemler kullanmaya başlamışlardır.  Bir oracledba olarak burada database seviyesinde kullanıcıları nasıl izleyebiliriz, bunu yaparken nelere dikkat etmeliyiz gibi bir takım teknik konulara değineceğiz.

 

Oracledakiaudit mekanizmasının biraz tarihçesine inersek, 1992 yılında oracle 7 sürümüyle tüm auditözelliklerini içeren ilk veritabanı olma, 1994 yılında ise bağımsız güvenlik kuruluşlarından onay alan ilk veritabanı olma özelliiğinede sahiptir. Bu açıdan düşünüldüğünde oracleveritabanı diğer ilişkisel veritabanları arasında güvenilirliğini ile ilk sırada yer almayı başarmış bir veritabanıdır.

 

Peki Auditing nedir?  Özetle, seçilen bazı userların (veya hepsinin) database içerisinde yapmış olduğu aktivitelerin monitör edilmesi ve sonra kayıt altına alınarak saklanması işlemine auditing diyebiliriz. Bu monitöring ve kayıt altına alma işlemi, kullanıcı adı, işlemin yapıldığı an, hangi uygulama kullanılarak yapıldığı, hangi makine üzerinden sisteme giriş yapıldığı gibi bilgileri kapsar. Bir işlemin auditlenmesi için mutlaka başarılı olması gerekmemektedir, başarısız olan tüm işlemlerde izlenebilmektedir. (başarız olan işlemler kimi zaman başarılı olanlardan daha fazla önem taşırlar. Sürekli olarak birinin, sistemde yer alan bir kullanıcı adı ile sisteme giriş yapmayı denemesi şüphelenmek ve araştırmak için yeterli bir nedendir.) 

 

Neden  Aduting yapılmaya ihtiyaç duyulur? Bunun nedenleri ana hatlarıyla;

 

·                  Yapılan İşlemlere Ait Sorumluları Tespit Etmek İçin; 

·                  Davetsiz Misafirleri Caydırmak İçin,

·                  Şüpheli İşlemleri Araştırmak için,

·                  Yetkisiz Kullanıcıya Ait İşlemleri Tespit Etmek ve Denetime Bildirmek İçin,

·                  Özel bir database işlemi ile ilgili istatistik toplama ve monitor etmek için,

·                  Yetki ve Erişim Kontolleri ile Problemleri Tespit Etmek İçin.

 

Neden auditing yapacağımıza karar verdikden sonra,  karar verilmesi gereken 2 konu karşımıza çıkmaktadır. Bunlardan birincisi, nelerin audit edileceğine ikincisi ise audit kayıtlarının nerede saklanacağına karar vermekteir.  Database’ deki her oturumu her işlemi auditlememelisiniz, sonuçta bu kayıtların tutulması için de bir kaynak kullanılması gerekmektedir ki, audit kayıtları yanlış bir konfigurasyonlaçok hızlı büyüyebilir ve sizi olmadık bir anda zor durumda bırakabilir.  Sorun sadece kaynak problemi değildir aslında, yapılan auditing işleminin sisteme getirdiği ek bir performans kaybı olmaktadır. Dolayısıyla herşeyiauditlemek kimi zaman çözüm olmakdan uzak bir hal almaktadır. Bir diğer neden ne kadar çok auditin işlemi yaparsanız o kadar çok incelemeniz, denetlemeniz gereken kayıt ortaya çıkacaktır.

 

Audit işlemleri ile ilgili olarak nasıl yapılacağı konusu aslında ne tarz bir auditing metodu uygulayacağınızla birebir ilişkilidir.  Audit yöntemlerinden bahsedelim biraz;



1 -Genel Aktivitilerin Standart Auditing ile Auditlenmesi; 

 

Satndartauditing, SQL statamentlerın, yetkilerin, schema objelerinin ve networkdekiaktivitilerinauditlenmesidir. Standart auditing AUDIT komutu ile başlatılır, NOAUDIT komutu ile sonlandırılır.  Bu auditing işlemi AUDIT ANY yetkisi ile AUDIT SYSTEM yetkisine sahip herhangi bir kullanıcı yapabilir.

 

Audit kayıtları, güvenlik işinden sorumlu adminindatabase seviyesinde auditingienable etmesiyle başlar. Auditing enable edilmesiyle, databaseçalışan SQL statementınınçalışmasından sonra bir audit kaydı üretir. Üretilen bu audit kaydı kullanıcının transactionıcommit etmesinden bağımsızdır. Aynı şekilde başlatılan bir rollbackişlemide yine yeni bir audit kaydı oluşturur.

 

Burada AUDIT_TRAIL parametresi önemlidir, database tarafından tespit edilen audit kayıtlarının nerede ve nasıl saklanacağının belirlendiği parametredir. Bu parametrenin şu anki değerini görmek için;

 

SQL> showparameteraudit_trail;

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

audit_trail                          string      NONE

 

 

Şu an bu değer NONE olduğundan dolayı auditingözelliği bu database’ de disable anlamına gelmektedir. AUDIT_TRAIL parametresi statik bir parametre olduğundan dolayı yapılan değişikliğin geçerli olması için database’ in restart olması gerekmektedir. Değişikliği yapmak içinse;

 

 

SQL> showuser

USER is "SYS"

SQL> ALTER SYSTEM SET AUDIT_TRAIL=DB SCOPE=SPFILE;

 

Systemaltered.

 

SQL> shutdownimmediate;

Database closed.

Database dismounted.

ORACLE instanceshutdown.

SQL> startup

ORACLE instancestarted.

 

Total System Global Area  419430400bytes

Fixed Size                  1249368 bytes

Variable Size              96473000bytes

Database Buffers          314572800bytes

RedoBuffers                7135232 bytes

Database mounted.

Database opened.

SQL>

 

 

Komutlarından faydalanılabilir. Buaradaaudit_trail parametresini “db” olarak set ettik. Bunun anlamı ve diğer alternatiflerini şöyle özetleyebiliriz;

 

 

DB ;  Audit kayıtlarının database’ de tutulması anlamına gelir. Bu kayıtlar database’ de sys.aud$ tablosunda saklanır.  (sysuserına ait audit kayıtları hariç, sysuserına ait audit kayıtlar OS’ ye yazılır)  Audit_trail parametresi DB olarak set edili iken database’ i readonlymodda açmak isterseniz, database size aşağıdaki gibi hata dönecektir. Bunun nedeni, audit_traildb olarak set edili iken database’ i readonly olarak açmak istiyorsanız önce audit_trail parametresini ya OS yada NONE olarak set etmeniz gerektiğidir (readonly  modda iken  audit kayıtlarını database’ e write edemeyeceğinden dolayı). 

 

 

SQL> startupmount

ORACLE instancestarted.

 

Total System Global Area  419430400bytes

Fixed Size                  1249368 bytes

Variable Size             100667304bytes

Database Buffers          310378496bytes

RedoBuffers                7135232 bytes

Database mounted.

SQL> alterdatabaseopenreadonly

  2  /

alterdatabaseopenreadonly

*

ERROR at line 1:

ORA-16006: audit_traildestinationincompatiblewithdatabaseopenmode

 

SQL> selectopen_modefromv$database ;

 

OPEN_MODE

----------

READ WRITE

 

SQL> showparameteraudit_trail;

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

audit_trail                          string      DB

SQL>

 

 

OS; Audit kayıtları operating sistemde belirtilen bir path’ de saklanır. Buraya file bazında çıkan dosyalar .aud uzantılı  olur. Burada iki farklı parametre daha var set etmemiz gereken, AUDIT_FILE_DEST parametresi audit kayıtlarının nerede tutulacağının set edildiği parametredir. Aşağıdaki şekilde set edilebilir;

 

 

altersystem set AUDIT_FILE_DEST ='d:\oracle11gR2\audit' scope=spfile;

 

Diğer parametre SYS userınınauditlenipauditlenmemesi ile ilgili, eğer SYS userınınsessionlarıdaauditlenecekse  AUDIT_SYS_OPERATIONS parametresi TRUE olarak set edilmelidir.

 

Altersystem set  AUDIT_SYS_OPERATIONS=TRUE scope=spfile;

 

10g’ de olmayan, 11g ile yeni gelen bir parametremiz daha var;  AUDIT_SYSLOG_LEVEL parametresi. Bu parametre sadece Unix ortamlarda kullanılmaktadır. Bu parametre manuel olarak initSID.ora dosyasına eklenilerek set edilebilir. İki farklı değer alabilir;

 

Facility;İşletim sistemi' nin, mesajı loglayan bölümünü ifade eder. Kabul ettiği değerler; user, local0–local7, syslog, daemon, kern, mail, auth, lpr, news, uucp ve cron

Local0 – local7 arasındaki değerler, syslog mesajlarını kategorize etmemize olanak sağlayan önceden tanımlanmış etiketlerdir. Bu kategoriler, syslog aracının ulaşabileceği log dosyaları veya diğer dizinler olabilir. Bu etiket tipler ile ilgili ayrıntılı bilgi için, syslog aracının MAN sayfasına bakabilirsiniz.

 

Priority; Mesajın öncelik derecesini belirler.  Kabul ettiği değerler, notice, info, debug, warning, err, crit, alert ve emergdir.

 

Bu parametreyi database’ e set etmek için;

 

ALTER SYSTEM SET AUDIT_TRAIL=DB SCOPE=SPFILE;

 

Komutundan faydalanabiliriz.

 

DB, EXTENTED ;  Audit kayıtları sys.aud$ tablosuna kaydedilir aynı zamanda Sqlbind değerleri ile sqltext’ deki Clobbilgileride bu tabloda tutulur.

 

Aşağıdaki gibi 2 farklı şekilde set edilebilir.

 

 

ALTER SYSTEM SET AUDIT_TRAIL=DB, EXTENDED SCOPE=SPFILE;

ALTER SYSTEM SET AUDIT_TRAIL='DB','EXTENDED' SCOPE=SPFILE;

 

Aşağıdaki gibi bu iki kriteri tek tırnak içerisinde kullanılmamalıdır;

 

ALTER SYSTEM SET AUDIT_TRAIL='DB, EXTENDED' SCOPE=SPFILE;

 

XML ;  Auditing kayıtları operatingsystem de xml dosyası olarak saklanır. XML formatındaki audit kayıtlarının defaultlokasyonuwindows’ da dahil olmak üzere tüm platformlarda; $ORACLE_HOME/admin/$ORACLE_SID/adumplokasyonudur.

 

Sys ve zorunlu audit dosyalarını operating sisteme XML fromatında yazmak için ; Audit_trail = XML orXML,ExTENDED, AUDIT_SYS_OPERATIONS=TRUE fakat AUDIT_SYSLOG_LEVEL parametresi set edilmemiş olmalıdır.

 

Sys ve zorunlu audit kayıtlarını syslogAudit file’ lerine, Standart Audit kayıtlarını XML Audit file’ lerine yazmak için;  Audit_trail = XML orXML,ExTENDED, AUDIT_SYS_OPERATIONS=TRUE ve AUDIT_SYSLOG_LEVEL parametreside set edilmiş olmalıdır.

 

Bu parametreyi database’ e set  etmek için ;

 

ALTER SYSTEM SET AUDIT_TRAIL=XML SCOPE=SPFILE;

 

Komutundan faydalanabiliriz.

 

XML, EXTENTED ;  Auditing kayıtları operatingsystem de xml dosyası olarak saklanır aynı zamanda Sqlbind değerleri ile sqltext’ deki Clobbilgileride burada saklanır.

 

Bu parametreyi set etmek içinde aşağıdaki iki komuttan biri kullanılabilir.

 

ALTER SYSTEM SET AUDIT_TRAIL=XML, EXTENDED SCOPE=SPFILE;

ALTER SYSTEM SET AUDIT_TRAIL='XML','EXTENDED' SCOPE=SPFILE;

 

Aşağıdaki gibi çalıştırılmamalıdır;

 

ALTER SYSTEM SET AUDIT_TRAIL='XML, EXTENDED' SCOPE=SPFILE;

 

NONE ;  Auditingdisable anlamına  gelir.

 

Audit_trail parametresini DB olarak set ettiğimizde belirlediğimiz auditkriterlerine uygun sessionlar geldikçe bu tabloda dolmaya başlayacaktır.

 

selectsessionid, userid, userhost, terminal, actionfromsys.aud$

 

SESSIONID                   USERID    USERHOST                                          TERMINAL                   ACTION#

14708                                KAMIL      WORKGROUP\KHOME         KHOME                         101

 

Burada action alanı çalıştırılan sql komutunun kodunu ifade etmektedir. Hangi kodun hangi komuta denk geldiğini aşağıdaki sorgu ile çekebilirsiniz.

 

Select * from AUDIT_ACTIONS ;

Ile sorgulayabilirsiniz.

Biraz da  AUDIT ve NOAUDIT komutlarının nasıl çalıştığından bahsedelim.

 

Audit veya Noaudit komutları sisteme gönderilirken komut sonlarında yer alan aşağıdaki 3 parametre önemlidir;

 

 

·         WHENEVER SUCCESSFUL cümlesi; herhangi bir audit veya noaudit komutunun sonunda bu cümle yer alıyorsa, çalıştırılan komut başarılı olmak kaydıyla auditleneceği veya auditlenmeyeceği anlamına gelir. Yani başarısız olan komut üzerinde işlem yapılmaz.

·         WHENEVER NOT SUCCESSFUL cümlesi; Eğer komutun sonunda bu cümle yer alıyorsa, başarısız olan komutların auditleneceği veya auditlenmeyeceği anlamına gelir. Başarılı olan komut üzerinde işlem yapılmayacak demektir.

 

·                  Her İkiside kullanılmazsa; Çalıştırılan Audit/Noaudit komutu içerisinde yukarıda belirtilen kısımlar kullanılmaz ise, hem başarılı hemdebaşarız tüm işlemlerin auditleneceği/auditlenmeyeceği anlamına gelir.

 

 

Örneğin;

 

 

AUDIT CREATE TABLE BY ACCESS WHENEVER NOT SUCCESSFUL;
 
 

 

Bu script ile createtablescriptiniçalıştıran tüm userlar içerisinde sadece başarız olanlar  (çalıştırdığı komutu hata verenler)  auditlenecek demektir.

 

Oracleaudit komutlarında  BY ACCSESS  cümleciğini  kullanmayı önerir.  Oracle 11gR2 ile birlikte audit komutunun sonunda byaccsess cümleciği kullanılmasa bile defaultunda yer aldığı için kullanılacaktır. Bu komutu kullanmanın bir takım avantajları vardır.  Bu avantajları özetleyecek olursak;

 

 

·                  BY ACCSESS komutu kullanıldığında, elde edilen audit kayısında daha fazla bilgi yer alacaktır. Örneğin, executionstatus (returncode), execution zamanı vetarihi,  kullanılan privilegesqltext’ i ve bindvariable değerleri gibi . Ek olarak BY ACCSESS kullanımı ile yapılan işleme ait SCN ‘ ıda kaydettiğinden geri dönüş gibi bir aksiyon alınması gerektiğinde bu bilgi ile Flashback komutları kullanılarak çok rahat eski veriye ulaşım sağlanabilecektir.

 

·                  Oracledatabase’ i çalışan her bir sqlstatement’ını, kullanılan bir privilege‘ ı ve auditlenen her nesneye erişimi kaydeder. Bu kayıtlar neticesinde bu işlemin kaç defa yapıldığını bulmanıza da yardımcı olur.

 

·                  BY ACCSESS audit kayıtlarında oturum açma ve kapatma kayıtlarını fine-grained zamanları ile birlikte tutar.

 

 

BY ACCSESS kullanımına örnek olarak;

 

AUDIT SELECT TABLE BY ACCESS;
 
 

 

Spesifik bir Usera ait işlemlerin Auditlenmesi;d

 

 

Örneğin, Kamil ve Hakan userınınçalıştırmış olduğu tüm selectler ile Updateleriauditlenmesini istersek; 
 
AUDIT SELECT TABLE, UPDATE TABLE BY KAMIL, HAKAN BY ACCESS;
 

 

Başlıklar altında örnek scriptlerbaşlangıçda az gibi algılanabilir.

 

 

NOAUDIT Komutunun Çalıştırılması;

 

 

Audit edilen bir nesne, systemprivilege, veya bir kullanıcının audit edilmesini n kaldırılması, iptal edilmesini sağlar. NOAUDIT komutunda   WHENEVER SUCCESSFUL  ve   WHENEVER  NOT SUCCESSFUL   kullanımına dikkat edilmelidir,  burada da AUDIT’ dekine benzer bir kullanım sözkonusudur, bu cümle NOAUDIT komutunun sonunda kullanılmazsa başarılı/başarısız tüm işlemler audit kapsamı dışına çıkarılmış  olur.

 

Auditişlemlerleri ile ilgili olarak konu içerisinde vermiş olduğum örnekler ileride konular detaylandıkça artacağından şu aşamada konunun anlaşılması için yeterli olacağını düşünüyorum.

 

 

SQL Cümlelerinin Auditlenmesi ;

 

 

Database de yapılan tüm selectleri ayırt etmeksizin auditlemek istersek;

 

AUDIT SELECT TABLE BY ACCESS;
 

Komutundan faydalanabiliriz.

 

Eğer tüm SQL komutlarını auditlemek istiyorsanız, userconnectionlarını veya var olmayan nesnelere ait referanslar için aşağıdaki adımları izleyebilirsiniz;

 

 

·                  Userların tüm SQL Statement’ larınınAuditlenmesi ; ALLSTATEMENTS cümleciği ile sadece top-level SQL sorguları auditlenebilir. Bu audit seçeneği diğer audit seçeneklerinden farklıdır. Eğer sqlstatement’ ı pl/sqlproceduru içerisinden çalıştırılıyorsa,  All Statement opsiyonu bunları auditlemeyecektir. Bu auditopsiyonu diğer set edilmiş olan audit opsiyonlarından etkilemez.

 

Kullanımı ile örnek;

                       

      AUDIT ALL STATEMENTS BY KAMIL BY ACCESS WHENEVER SUCCESSFUL;
 

 

·                  Userlar tarafından çalıştırılan tüm Sql Statement’ larının (Komutların Kısayollarıİl e) Auditlenmesi ; 

 

Burada ifade edilmek istenen İndex, Procedure, Database Link vs. gibi bazı komutların kısayolları ile bu komutlar ile yapılan tüm işlemleri auditleyebilirsinizOracle’ da çok fazla sayıda komut olduğundan dolayı komutlara ait kısayolları buraya yazmaktansa merak edenler aşağıdaki linkden bunlara ulaşabilirler;

 

http://download.oracle.com/docs/cd/E11882_01/server.112/e17118/statements_4007.htm#SQLRF53735

 

Bu konuyla ilgili örnek olarak;

 

        AUDIT ALL BY KAMIL BY ACCESS;
 
 

verebiliriz.

   

·                  Kullanıcı Ayıt Etmeksizin Geçerli Oturumdaki Tüm SQL StatementlarınınAuditlenmesi ; All Statement audit seçeneği için IN SESSION CURRENT cümleciği ile top-levelsqlstatementlarınısession sonlanmadığı sürece audit edebilirsiniz. Bu auditi NOAUDIT ile sonlandıramazsınız fakat usersessionıdiscconect olduğunda zaten auditte sonlamış olacaktır.

 

Örneğin, mevcut bir sessinındaki tüm işlemleri auditlemek için;

 

         AUDIT ALL STATEMENTS IN SESSION CURRENT BY ACCESS WHENEVER NOT SUCCESSFUL;
 

 

komutunu kullanabilirsiniz.

 

·                  Login ve logoutlarınAudilenmesiİsterseni z AUDIT_SESSION komutu ile tüm login ve logooutlarıauditleyebilirsiniz.

 

Örneğin,

 

        AUDIT SESSION BY ACCESS;

 

Sadece belli bir kullanıcının login ve logoutlarınıauditlemek isterseniz,

 

        AUDIT SESSION BY kamil BY ACCESS;
 

 

Komutunu kullanabiliriz.

 

·                  Object doesn’ t exist hatasıyla fail olan sqlstatementlarınınAuditlenmesiNOT EXIST  cümleciği ile object  doesn’ t exist hatasıyla  fail  olan sorguları auditleyebilirsiniz.

 

Örneğin,

 

AUDIT  NOT  EXIST ;

 

SQL Stamentları ile İlgili Audintingleri Sonlandırmak İçin;

 

 

NOAUDIT komutu ile SQL statementlarıüzerindeki auditingleri sonlandırabiliriz.  Bu komutu çalıştırmadan önce mutlaka çalıştıracak olan kullanıcının AUDIT SYSTEM yetkisine sahip olmalıdır.  AuditAllStatements seçeneği ile set edilmiş olan autiler, NoauditAuditStatements ile kaldırıldığında, bu işlemden diğer auditkonfigurasyonları etkilenmeyecektir. Daha öncede belirttiğimiz üzere InSessionCurrent cümleciği ile set edilmiş olan auditlerNoaudit ile geri alınmazlar, bu auditing işlemi session sonlandığında bitecektir.

 

 

Noaudit ile ilgili örnek olarak aşağıdaki komutları verebiliriz;

 

NOAUDIT session;

NOAUDIT session BY  kamil;

NOAUDIT DELETE ANY TABLE;

NOAUDIT SELECT TABLE, INSERT TABLE, DELETE TABLE, EXECUTE PROCEDURE ;

NOAUDIT ALL STATEMENTS;

 
Privilege ile İlgili Audit Seçeneklerinin Configure Edilmesi; 
 

 

Haklar ile ilgili  audit seçenekleri,  ilgili   ayrıcalığın ismine karşılık gelen sistem hakları ile aynıdır. Örneğin,  Deleteanytable komutunun auditlenmesi ;

 

AUDIT DELETE ANY TABLE BY ACCESS WHENEVER NOT SUCCESSFUL;

AUDIT DELETE ANY TABLE BY ACCESS;

AUDIT SELECT TABLE, INSERT TABLE, DELETE TABLE, EXECUTE PROCEDURE BY ACCESS WHENEVER NOT SUCCESSFUL;

 

şeklindedir.

 

Bu auditlerüzerindeki auditing işleminin kaldırılması ise, yine benzer bir mantıkla ;

 

NOAUDIT ALL PRIVILEGES;

NOAUDIT SELECT TABLE, INSERT TABLE, DELETE TABLE, EXECUTE PROCEDURE;

 

Schema Objelerinin Auditlenmesi ;

 

Konuyu biraz daha spesifiklendirebiliriz, yani tüm select komutlarını auditlemekistemiyde sadece x userının altındaki bir tabloyu auditlemek isteyebiliriz. 

 

AUDIT SELECT ON owner.tablename BY ACCESS;

AUDIT SELECT ON owner.viewname BY ACCESS;

AUDIT DELETE ON laurel.emp BY ACCESS;

AUDIT SELECT, INSERT, DELETE ON hr.dept BY ACCESS WHENEVER SUCCESSFUL;

AUDIT SELECT ON DEFAULT BY ACCESS  WHENEVER NOT SUCCESSFUL;

AUDIT EXECUTE ON procedure_name BY ACCESS;

AUDIT INSERT TABLE BY ACCESS;

 
 

Schema Objelerinin Auditlerinin Kaldırılması;

 

Schema nesneleri üzerindeki auditingi kaldırmak için yine Noaudit komutundan faydalanabiliriz;

 

NOAUDIT DELETE  ON emp;

NOAUDIT SELECT, INSERT, DELETE  ON hr.dept;

NOAUDIT ALL ON emp;

NOAUDIT ALL  ON  DEFAULT;

 

 

Bu radaON DEFAULT cümleciğinden bahsetmek gerekebilir.  Aşağıdaki örnek üzerinden açıklamaya çalışalım.

 

 

AUDIT ALL ON DEFAULT BY ACCESS;

 

Bu komut ile aşağıdaki komutların hepsi etkilenecektir.

 

Alter , Execute, İnsert, Select , Audit, Grant, lock, Update, Comment, Flashback, Read, Delete, Index, Rename .

 

On default yerine spesifik olarak neleri auditleyeceğinizi siz belirlemek isterseniz, örneğin;

 

AUDIT ALTER, DELETE ON DEFAULT BY ACCESS;

 

 

İle yapabilirsiniz.

 

 

Directory’ lerinAuditlenmesi;

 

Directoryler içerisindeki nesneleri auditleyebilirsiniz. Örneğin,  bir directory içerisine create ettiğiniz bir programı, kimin çalıştırdığını auditleyebilirsiniz.  Bunu yaparken aşağıdaki komuttan faydalanabiliriz;

 

AUDIT EXECUTE ON DIRECTORY my_directory BY ACCESS;

 

Audit işlemini iptal etmek içinse;

 

NOAUDIT EXECUTE ON DIRECTORY my_directory;

 

komutunu kullanabiliriz.

 

 

Tüm Function, Procedure, Package ve TriggerlarıAudit Etmek İçin;

 

 

AUDIT EXECUTE PROCEDURE BY ACCESS;

 

User bazında bu işlemi yapmak istersek;

 

AUDIT EXECUTE PROCEDURE BY psmith BY ACCESS;

 

Schemaİçerisinden Procedure veya FunctionExecute Edildiğinde Auditlemekİçin;

 

 

AUDIT EXECUTE ON HR.check_work BY ACCESS WHENEVER SUCCESSFUL;

 

 

Function, Procedure , Packages  ve Triggerlar  Üzerindeki Auditingi Kaldırmak İçin;

 

 

Noaudit komutu ile kaldırılabilir.

 

NOAUDIT EXECUTE PROCEDURE;

NOAUDIT EXECUTE PROCEDURE BY kamil;

NOAUDIT EXECUTE ON sales_data.checkwork;

 

 

Networkü Auditlemekİçin;

 

 

Network üzerinden yapılan işlemleri auditlemek istiyorsak;

 

AUDIT NETWORK BY ACCESS;

 

Bu auditingi kaldırmak içinse;

 

NOAUDIT NETWORK;

 

komutlarından yararlanabiliriz.

 

 

2.               Güvenlik ile İlgili SQL Komutlarının ve Yetkilerin Varsayılan Olarak Auditlenmesi ;

 

 

Çok kullanılan bir yöntem olmamakla beraber, bu konuya da açıklık getirmekte fayda var. Dbca ile database’ i create ederken, oracledatabase’i  auditiçok sık kullanılan güvenlikle ilgili  sqlstatementlarını ve haklarını auditleyecekşekilde set eder.

 

 

 

Oracledatabasedefault olarak aşağıdaki yetkileri auditler.

 

ALTER ANY PROCEDURE

CREATE ANY LIBRARY

DROP ANY TABLE

ALTER ANY TABLE

CREATE ANY PROCEDURE

DROP PROFILE

ALTER DATABASE

CREATE ANY TABLE

DROP USER

ALTER PROFILE

CREATE EXTERNAL JOB

EXEMPT ACCESS POLICY

ALTER SYSTEM

CREATE PUBLIC DATABASE LINK

GRANT ANY OBJECT PRIVILEGE

ALTER USER

CREATE SESSION

GRANT ANY PRIVILEGE

AUDIT SYSTEM

CREATE USER

GRANT ANY ROLE

CREATE ANY JOB

DROP ANY PROCEDURE

 

 

 

 

3.               Spesifik Olarak Fine-grainedActivitilerininAuditlenmesi;

 

Fine-grainedauditing i kullanmak için, istenilen durumları içeren policiler oluşturup sonrasında bu policyleriauditleyebilirsiniz.  FGA aslında audit işleminin yapılan aktivitiye göre özelleştirilmesidir şeklinde tanımlayabiliriz.  

FGA insert, update ve delete gibi operasyonları ile ilgili sqlquerylerininauditlenmesine de olanak sağlar. 

 

 

FGA adutinglog kayıtları sys.fga_log$  tablosuna kaydedilir.  Bu kayıtlar DBA_FGA_AUDIT_TRAIL view’ inden select edilebilir. DBA_COMMON_AUDIT_TRAIL viewi standart ve fga kayıtlarını combine eder. Ayrıca audit_trail kayıtları XML file’ lere yazılacak şekilde set edilmişse  V$XML_AUDIT_TRAIL  view’ i kullanılarak select edilebilir.

 

 

Fga sadece bizim istemiş olduğumuz spesifik alanlar üzerinde yapılan işlemleri auditlememizi sağlar. Böylelikle bizim için daha anlamlı sonuçlar oluşturur.  Durum böyle olduğunda gereksiz audit kayıtlarının oluşmasını n önüne geçilmiş olunur.  FG auditingi kullanabilmek için sysninşemalarından DBMS_FGA  packageınaexecute yetkisinin olması yeterlidir.

 

 

FG auditpolicymanage etmek için dbms_fgapackageından faydalanabiliriz. Bu package ile tek policy ile tüm kombinasyonları (select, insert, update, delete)  komutlarının audit edilmesini enable edebiliriz.  Burada önemli bir nokta policy’ i  create  ettikden sonra modify edemiyoruz onun yerine dropcerate ederek yenisini oluşturuyoruz. DBMS_FGA’ ın tüm değişkenleri ile birlikte kullanımı aşağıdaki gibi,

 

 

DBMS_FGA.ADD_POLICY(

   object_schema      VARCHAR2,

   object_name        VARCHAR2,

   policy_name        VARCHAR2,

   audit_condition    VARCHAR2,

   audit_column       VARCHAR2,

   handler_schema     VARCHAR2,

   handler_module     VARCHAR2,

   enable             BOOLEAN,

   statement_types    VARCHAR2,

   audit_trail        BINARY_INTEGER IN DEFAULT,

   audit_column_opts  BINARY_INTEGER IN DEFAULT);

 

 

Kullanımına geçmdenönce burada sık kullanılan değişkenler üzerinde biraz bahsedebiliriz;

 

 

·                  Object_schema ; Hangişemasnın altındaki objectauditlenecekse,  bu şemanın belirlendiği parametre,

·                  Object_name ; Auditlenecek olan object’ in isminin belirlendiği parametre,

·                  Policy_name ; oluşturulan bu policy’ e istenirse ismin verildiği parametre, unigue bir alandır, kullanılan bir isim bir daha kullanılamaz.

·                  Audit_conditionAuditlenecek olan sqlstatementlarındawherecondition’ı içerisinde geçecek olan alanı ifade eder. Null olarak set edilirse  ve bu parametre kullanılmaz ise tüm aktivitelerin auditleneceği anlamına gelir.

·                  Audit_column ; spesifik bir kolon auditlenecek ise bunun set edildiği parametre,

·                  Enables ;  TRUE  ise policy  enable demektir, defaultdeğeride TRUE’ dur,

·                  StatementsTypes ; Hangisqlstatementınınaudit edileceğini belirten parametredir  (sadece  select, insert, update, delete’ i  içerir. Bu ğernull gönderilirse default değeri SELECT olduğundan buna göre policy’ i set edilecektir. )

·                  Audit_trail ; fgaudit kayıtları için destination DB veya XML set edilebilir, (default değeri db+extenteddır

 

 

Tüm parametreleri ile package’ ı aşağıdaki şekilde kullanabiliriz ;

 

 

Begin

DBMS_FGA.ADD_POLICY (

   object_schema      =>  'scott',

   object_name        =>  'emp',

   policy_name        =>  'mypolicy1',

   audit_condition    =>  'sal < 100',

   audit_column       =>  'comm,sal',

   handler_schema     =>   NULL,

   handler_module     =>   NULL,

   enable             =>   TRUE,

   statement_types    =>  'INSERT, UPDATE',

   audit_trail        =>   DBMS_FGA.XML + DBMS_FGA.EXTENDED,

   audit_column_opts  =>   DBMS_FGA.ANY_COLUMNS);

end ;

/

 

 

Create edilmiş olan policy dolayısıyla auditidisable etmek için aşağıdaki sytax kullanılabilir, bunlarla ilgili örnekleri aşağıda bulabilirsiniz;

 

 

Begin

DBMS_FGA.DISABLE_POLICY(
   object_schema  VARCHAR2, 
   object_name    VARCHAR2, 
   policy_name    VARCHAR2 ); 
end; 
/

 

 

Package içerisinde object_schema parametresini göndermeniz, database otomatik olarak sisteme connect olmuş olan userı dikkate alacaktır. 

 

 

Var olan bir policydrop etmek içinse ;

 

 

Begin

DBMS_FGA.DROP_POLICY(
   object_schema  VARCHAR2, 
   object_name    VARCHAR2, 
   policy_name    VARCHAR2 );
end ;
/

 

systaxdan faydalanabiliriz.

 

 

Bir örnekle yaptıklarımızı açıklamaya çalışalım. Scottscheması altındaki emp tablosunda yapılan işlemleri   scott_emp_policy adı ile bir policy oluşturup auditmeleyeçalışalım.

 

 

Begin

DBMS_FGA.DROP_POLICY (
object_schema   =>  'scott',
object_name     =>  'emp',
policy_name     =>  'scott_emp_policy');
end ;
/
 
 
 

Dikkat ederseniz statement_type parametresi kullanmadım, dolayısıyla auditpolicy’ imiz sadece bu tabloya yapılan selectleriauditleyecektir.

 

 

Şu anda disable olan bir policy’ i tekrar aktive etmek içinse;

 

 

Begin

DBMS_FGA.ENABLE_POLICY(
   object_schema  VARCHAR2,
   object_name    VARCHAR2,
   policy_name    VARCHAR2,
   enable         BOOLEAN);
end ;
/

 

komutundan faydalanabiliriz.  Örneğin.

 

Begin

DBMS_FGA.ENABLE_POLICY (
object_schema    =>  'scott',
object_name      =>  'emp',
policy_name      =>  'mypolicy1',
enable           =>   TRUE);
end ;
/
 
 

 

Daha anlaşılması için örnekleri biraz daha detaylandıralım;

 

 

BEGIN
  DBMS_FGA.ADD_POLICY(
   object_schema      => 'HR',
   object_name        => 'EMPLOYEES',
   policy_name        => 'chk_hr_employees',
   policy_owner       => 'SEC_MGR',
   enable             =>  TRUE,
   statement_types    => 'INSERT, UPDATE, SELECT, DELETE',
   audit_trail        =>  DBMS_FGA.DB);
END;
/
 
 

 

Tukarıdakişekilde policy’ i oluşturdukdan sonra aşağıdaki gibi sqllerauditleniyor olacaktır. 
 
 
 
SELECT COUNT(*) FROM HR.EMPLOYEES WHERE COMMISSION_PCT = 20 AND SALARY > 4500;
 
SELECT SALARY FROM HR.EMPLOYEES WHERE DEPARTMENT_ID = 50;
 
DELETE FROM HR.EMPLOYEES WHERE SALARY > 1000000;
 
 

 

Spesifik bir schema altında yer alan bir tablodaki özel bir (yada birden fazla) kolunu,  istediğimiz bir kondition gerçekleştiğinde auditlemek istiyorsak  createpolicypackageına aşağıdaki kısımlarıda  aeklememiz gerekir;

 

 

audit_condition    => 'DEPARTMENT_ID = 50', 
audit_column       => 'SALARY,COMMISSION_PCT,'
 
 

 

FineGrating yöntemi oluşan audit kayıtlarını UTL_MAIL packageınıkullarak sonuçları istenilen kullanıcılara mail attırabiliriz. Bunun için oracledocumentation’ dan UTL_MAIL packageının kullanımı ile ilgili ayrıntılı bilgi alabilirsiniz.

 

 

Bir başka örnek olarak;

 

 

BEGIN
 DBMS_FGA.ADD_POLICY(OBJECT_SCHEMA => 'OE',
   OBJECT_NAME                     => 'ORDERS',
   POLICY_NAME                     => 'ORDERS_FGA_POL',
   AUDIT_CONDITION                 => 'SYS_CONTEXT(''USERENV'', ''CLIENT_IDENTIFIER'') = ''Robert''',
   HANDLER_SCHEMA                  => NULL,
   HANDLER_MODULE                  => NULL,
   ENABLE                          => True,
   STATEMENT_TYPES                 => 'INSERT,UPDATE,DELETE,SELECT',
   AUDIT_TRAIL                     => DBMS_FGA.DB + DBMS_FGA.EXTENDED,
   AUDIT_COLUMN_OPTS               => DBMS_FGA.ANY_COLUMNS);
END;
/

 

 

systaxı kullanılabilir.

 

 

4.               Admin  Userlarının (SYS) Auditlenmesi ;

 

 

Sys  userını veya sistemde sysdba  veya sysoper  yetkisine sahip olan tüm kullanıcıları auditleyebilirsiniz. Sysuserınınauditlenmesi ile ilgili olarak bir takım faklılıklar mevcut, örneğin sysyiauditliyorsanızaudit_trail  parametreniz ne olarak set edilmiş olursa olsun (None, Db, Xml, EXTENDE) sysuserıauditlenir ve bu audit kayıtları operating sisteme file olarak yazar.  Sysuserınınaudit kayıtlarını  operating sisteme yazması,  sys.aud$  tablosuna yazmasından çok daha güvenlidir, sysuserı zaten sysdba yetkisine sahip olduğundan dolayı  tabloya müdahale edebilir yani burdaki bir takım audit  kayıtlarını  delete  edebilir, bu yöntem ile  bu tarz kötü davranışların önüne geçilmesi  planlanmıştır.  

 

 

Sysuserınınauditlenmesi ile ilgili özel bir parametrenin ( AUDIT_SYS_OPERATIONS) tanımlanması gerekmektedir.  Yapılacak değişiklik aşağıdaki gibidir;

 

ALTER SYSTEM SET AUDIT_SYS_OPERATIONS=TRUE SCOPE=SPFILE;

 

Audit_trail  parametresi zaten set edilmiş olmalı ;

 

ALTER SYSTEM SET AUDIT_TRAIL=XML, EXTENDED SCOPE=SPFILE;
 

 

Son olarak database’ i restart ediyoruz. Sonrasında sysuserına ait tüm işlmler artık auditleniyor olacaktır.

 

 

Buraya kadar 4 tane audit yöntemi üzerinde konuştuk.  Her yöntemde audit kayıtları DB olarak seçilirse, bu kayıtlar SYSTEM tablespace’ inde tutulur. Bizim için SYSTEM tablepace’ i kritik önem taşıdığından dolayı bu tarz verilerin systemtablespace’ i dışında farklı bir yerde tutulmasını isteriz. Bu tarz bir işlemi gerçekleştirmek isterseniz aşağıdaki adımları kullanarak yapabilirsiniz;

 

 

Öncelikle audit kayıtlarımızın tutulduğu tablespacelerin hangi tablespace’ de olduğunu kontrol etmekle başlayalım ;

 


 

SELECT table_name, tablespace_name

FROM   dba_tables

WHERE  table_name IN ('AUD$', 'FGA_LOG$')

ORDER BY table_name;

 

TABLE_NAME                     TABLESPACE_NAME

------------------------------ ------------------------------

AUD$                           SYSTEM

FGA_LOG$                       SYSTEM

 

 

Gördüğünüz gibi SYSTEM tablespace’ i içerisinde yer alıyorlar.  Şimdi yeni oluşturacağımız bir tablepace‘ e taşıyalım.

 

 

Yeni bir tablespacecreate edelim;

 

Createtablespaceonly_audit  datafile‘c:\oracle11gR2\audit\’    size  10M ;

 

 

Aşağıdaki pl/sql ile taşıma işlemi yapıyoruz.

 

 

BEGIN

  DBMS_AUDIT_MGMT.set_audit_trail_location(

    audit_trail_type           => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,

    audit_trail_location_value => 'ONLY_AUDIT');

END;

/

 

 

Son durumu kontol edelim.

 

 

SELECT table_name, tablespace_name

FROM   dba_tables

WHERE  table_name IN ('AUD$', 'FGA_LOG$')

ORDER BY table_name;

 

TABLE_NAME                     TABLESPACE_NAME

------------------------------ ------------------------------

AUD$                           ONLY_AUDIT

FGA_LOG$                       ONLY_AUDIT

 

 

ve taşıma tamamlanmış oldu.

 

 

Oracle da özellikle 11gR2 ile gelen yeni değişikliklerden de bahsederek audit kavramını açıklamaya çalıştım.  Umarım faydalı olmuştur.


Viewing all articles
Browse latest Browse all 68