Denetleme en genel tanımıyla, veritabanında yapılan işlemlerin belirlenmiş kurallara göre izlenmesi ve kayıt edilmesidir.
Veritabanı denetlemesi veritabanı güvenliği açısından en önemli çalışmalardan bir tanesidir. Veritabanı denetlemesi sayesinde;
- Veritabanında bulunan bilgilerin tutarlı olduğu,yetkisiz kişilerce değiştirilmediğini kanıtlar.
- Veritabanında yapılan şüpheli hareketler sorgulanabilir ve kimin tarafından yapıldığı bulunur.
- Veritabanında yetkisiz işlem yapmak isteyen kullanıcılar açısından caydırıcı önlem alınmış olur.
- Güvenlik yönetmeliklerine uyum sağlanır.
- Veritabanı performansı ile ilgili bilgiler toplanır.
Burada önemli noktalarda bir tanesi hangi kurallara göre izleme ve kayıt yapılacağımızın belirlenmesidir. Veritabanında kısa bir süre içerisinde milyonlarca işlem olabilir. Önemli olan kayıt altına alınmaya değer işlemlerin belirlenmesidir. Kayıt altına alınması gereken işlemlerin belirlenmesi bizim denetleme politikamıza (Auditing Policy) bağlıdır.
Diğer önemli bir nokta ise, veritabanındaki işlemlerin nasıl kayıt altına alınacağıdır. Bu kayıtlara denetim izi denmektedir.
Bunun yanında diğer bir önemli noktada denetim izlerinin değiştirilmeden saklanmasının sağlanmasıdır.
Oracle Veritabanında Mutlaka Tutulan Denetim İzleri
Oralce veritabanında denetim tamamen kapansa bile zorunlu kayıt altına alınan 3 tane işlem vardır.Bunlar;
- Veritabanı açılışı
- Veritabanı kapatılışı
- SYSDBA ve SYSOPER rolüne sahip kullanıcıların veritabanına bağlanması
Veritabanında denetim izleri iki ayrı parametre ile yönetilmektedir. Bunlar audit_trail ve audit_sys_operations parametreleridir. Bu paramrelerden audit_trail parametresine NONE, audit_sys_operations parametresine boşluk atarsak veritabanında denetlemeyi durdurmuş oluruz.
Bu durumda olan bir veritabanında, yanlızca veritabanı kapama, açma ve veritabanı yöneticisi login işlemleri, denetim izi olarak audit_file_dest dizininde bulunan *.aud dosyalarına yazılır.
Bu durumdaki bir veritabanında veritabanını açıp kapattığımızda /u01/app/oracle/admin/ORCL/adump dizinine baktığımızda.
Eğer veritabanında denetimi başlatır ve denetim için herhangi bir tanım yapmazsak;(Audit komutuyla herhangi bir denetim tanımı yapmazsak) bu durumda sadece SYS.AUD$ ve SYS.FGA_LOG$ tablosuna yapılan “INSERT,UPDATE,DELETE,MERGE” işlemleri denetim altına alınır. Bu tablolar denetim izlerini veritabanında tutan tablolardır. Normalde bu tablolarda oynama yapılmaması gerekir bu nedenle bu tablolarda bir değişiklik yapıldığında hiçbir tanım olmasa bile denetlemesi mantıklıdır. Örn;
alter system set audit_trail='DB' scope=spfile; alter system set audit_sys_operations=TRUE scope=spfile; shut immediate startup
Veritabanında daha önceden tanımlanmış olan denetim tanımlarını kaldırıyoruz;
NOAUDIT ALL ON DEFAULT; NOAUDIT ALL PRIVILEGES; NOAUDIT ALL STATEMENTS; NOAUDIT ALL;
Veritabanına SYS kullanıcıs ile bağlanıp sys.aud$ tablosunu siliyoruz.
delete sys.aud$; 300 rows deleted. commit; Commit complete.
Bu işlemden sonra denetim tablosuna yazılı bir kayıt bulunmamaktadır. Fakat audit_sys_operations parametresi TRUE olduğu ve bu işlem SYS kullanıcı tarafından yapıldığı için audit_file_dest parametresinin gösterdiği dizine aşağıdaki gibi denetim izi yazılmıştır.
[oracle@single1 adump]$ cat ORCL_ora_6825_20170816091342121137143795.aud Wed Aug 16 09:18:57 2017 +03:00 LENGTH : '169' ACTION :[15] 'delete sys.aud$' DATABASE USER:[1] '/' PRIVILEGE :[6] 'SYSDBA' CLIENT USER:[6] 'oracle' CLIENT TERMINAL:[5] 'pts/4' STATUS:[1] '0' DBID:[10] '1479257114' Wed Aug 16 09:19:00 2017 +03:00 LENGTH : '159' ACTION :[6] 'commit' DATABASE USER:[1] '/' PRIVILEGE :[6] 'SYSDBA' CLIENT USER:[6] 'oracle' CLIENT TERMINAL:[5] 'pts/4' STATUS:[1] '0' DBID:[10] '1479257114'
NOT : Aynı işlemi SYSTEM kullanıcısı ile yaparsak bu işlemle ilgili denetim izninin sys.aud$ tablosuna yazıldığını göreceksiniz.
Denetim Tablosunun Korunması
Denetim tablosunun korunabilmesi için O7_DICTIONARY_ACCESSIBILITY parametresinin FALSE olması gerekir. Varsayılan değeride false’dir.
Bu parametre bize SYS objelerine ANY sistem yetkisi ile erişimi engellemeyi sağlar. Örn bir kullanıcısnın SELECT ANY TABLE yetkisi olsun bunun anlamı bu kullanıcı veritabanında ki bütün tabloları okuyabilir anlamına gelir. Fakat O7_DICTIONARY_ACCESSIBILITY parametresi false ise SYS altındaki objeler bundan muaftır. Özellikle DELETE ANY TABLE ve UPDATE ANY TABLE yetkisine sahip kullanıcıların, denetim izlerini tuttuğumuz sys.aud$ tablosunun silinmemesi için bu parametre false yapılmalıdır.
NOT : Denetim tablosunu korumanın en sağlam yöntemi Database Vault kurulumudr. DB Vault kurulumu ile beraber gelen REALM veya COMMAND RULE’ler yardımıyla veritabanı yöneticisi dahil olmak üzere, denetim tablosu olan sys.aud$ olan tüm erişim güvenlik yöneticisine verilir.
Veritabanında Denetim İzlerinin Tutulması
Veritabanında denetim izlerinin tutulması için audit_trail parametresinin DB veya DB,EXTENDED yapılmalıdır. Veritabanında denetim izleri tutulmaya başlandığında tüm kayıtlar sys.aud$ tablosuna yazılır.
SYS.aud$ tablosunun kolonları çoğunlukla kodlu($) girildiği için anlaşılması zor olacağından dolayı çok sık kullanılmaz bunun yerine dba_audit_trail görüntüsünü(view) kullanırız.
Audit_trail parametresi DB yapılırsa, veritabanında denetim izi olarak yapılan işlemin türü ve diğer bilgiler tutulur. Denetim izinde çalıştırılmış olan SQL komutu bulunmaz. Örneğin bir tablodan kayıt silelim. Audit_trail parametresi DB ise denetim izlerinde hangi zamanda, hangi kullanıcının işlem türü olarak DELETE komutunu çalıştırdığımı görürüz. Fakat komutun kendisini ve çalıştığı anda aldığı parametreyi göremeyiz. Eğer veritabanıda tutulan denetim izlerinin az kaynak tüketmesini istiyorsak(disk,CPU) audit_trail parametresi DB yapılmalıdır.
Eğer audit_trail parametersi DB,EXTENDED yapılırsa veritabanı denetim izleri içinde çalışan SQL komutunun tamamı ve komutta bulunan parametrelerde sys.aud$ tablosunda yazılır. Örn;
alter system set audit_trail=DB,EXTENDED scope=spfile; shut immediate startup delete sys.aud$ where entryid=1; 0 rows deleted. commit; Commit complete.
Örnekteki denetim izlerinde SQL_TEXT’i boş olan satır audit_trail parametresi DB değerine sahipken yapılmış bir işlemdir. SQL_TEXT’i dolu olan satır ise audit_trail parametresi DB, EXTENDED değerine sahipken yapılmış bir işlemdir.
İşletim Sisteminde Denetim İzlerinin Tutulması
Denetim izlerinin İşletim sistemindeki dosyalarda tutulabilmesi için aşağıdaki 3 ayrı parametreden birisi seçilmelidir.
- OS
- XML
- XML,EXTENDED
OS Parametresinin Kullanımı
Denetim izlerinin, işletim sistemindeki dosyalarda tutulabilmesi için audit_trail parametresi OS yapılır.
alter system set audit_trail=OS scope=spfile;
Örn; Amacımız hr kullanıcısına ait employees tablosunu takip etmektir.
audit all on hr.employees by access; Audit succeeded.
Denetlediğimiz employees tablosunu SYSTEM kullanıcıs ile sorgulayalım. Politikamıza göre işletim sistemi dosyasına yazılacaktır.
Denetim izlerinin bulunduğu dizinde, ilgili dosya açılarak denetim izleri okunur. Buradaki bilgiler sys.aud$ tablosundaki bilgilere benzerdir. Dosyalar üzerinde arama yapılması ve istenilen denetim izninin bulunması veritabanındaki tablolara göre daha zordur. Fakat file sisteme yazılan denetim izlerinin veritabanı yöneticileri tarafından erişilemeyecek dizinlerde bulunması bu denetleme türünü daha güvenli hale getirmektedir.
Wed Aug 16 11:16:37 2017 +03:00 LENGTH : '218' ACTION :[54] 'select employee_id,first_name,salary from hr.employees' DATABASE USER:[3] 'SYS' PRIVILEGE :[6] 'SYSDBA' CLIENT USER:[11] 'mustafatepe' CLIENT TERMINAL:[7] 'unknown' STATUS:[1] '0' DBID:[10] '1479257114'
SYSLOGS Servisi ile Denetim İzlerinin Oluşturulması
Syslog; Unix ve Linux işletim sistemlerinde standart olarak kullanılan mesaj izleme(message logging) sistemidir. Genellikle network,printer gibi araçlardan standart arka planda çalışan syslog programına gönderilen mesajlardan oluşur. Bu mesajlar belli kaynaklardan gönderilir. Auth, authpriv, daemon, cron, ftp, lpr, kern, mail, news, syslog, user, uucp, local0…local07
Bu kaynaklardan gönderilen mesaj çeşitleri ise; notice, info, debug, warning, err, crit, alert, emerg şeklindedir.
Oracle syslog’a denetim izleri gönderirken; kaynak adını ve mesaj çeşidini audit_syslog_level parametresine değer atayarak belirleriz.
Örnegimizde denetim izlerinin syslog’a local1 kaynağından gönderildiğini ve mesajın warning seviyesinde olduğunu düşünürsek. Aşağıdaki şekilde audit_syslog_level parametresine değer atamalıyız. Bu işlem sırasında audit_trail parametresi OS olmalıdır.
alter system set audit_syslog_level='local1.warning' scope=spfile; shut immediate startup
Veritabanı tanımlarımızı tamamladık. İşletim sisteminde Oracle denetim izlerinin syslog programına nasıl gönderileceğini ve bu loğlara nasıl erişeceğimizi ayarlamalıyız. Bunun için syslog konfigürasyon dosyası /etc/rsyslog.conf’dır. Bu dosyaya veritabanında yaptığımız konfigürasyona uygun olarak şu satırları ekleriz.
local1.warning /var/log/ audit.log
Syslog programını restart ederiz.
[root@single1 ~]# /etc/init.d/rsyslog restart Shutting down system logger: [ OK ] Starting system logger:
/var/log/audit.log dosyasına baktığımızda denetim izlerini görebiliriz.
Genellikle Oracle tarafından denetim izinlerinin işletim sistemi tarafından tutulması önerilmektedir. Özellikle denetim izlerinin syslog’a gönderilmesi, denetim izlerinin veritabanı tarafından değiştirilmesini engeller. Fakat denetim izleri işletim sistemi dosyası(OS) olarak tutarsak çalıştırılan SQL’ler denetim iznine yansımaz. Obje ismi, action,zaman gibi bilgiler içerir. Ama biz denetim izninin hem işletim sisteminde hemde SQL’lerin olmasını istiyorsak XML,EXTENDED yapmalıyız.
XML Dosyalarında Denetim İzlerinin Tutulması
Denetim izlerinin XML formatında dosylarda tutabilmek için audit_trail parametresi aşağıdaki tanımlanır.
alter system set audit_trail=XML scope=spfile; shut immediate startup
Deneme olsun düşüncesiyle auditini açtığımız employees tablosunda SYSTEM kullanıcısıyla bir takım sorgular çalıştıralım.
update hr.employees set SALARY=SALARY+SALARY*0.1; 107 rows updated. commit; Commit complete.
Audit_file_dest parametresinin gösterdiği dizin içindeki XML formatındaki denetim iznine bakabiliriz.
Bu dosyaların incelenmesi oldukça zordur. Oracle bu dosyaların içeriklerine V$XML_AUDIT_TRAIL görüntüsü ile erişmemizi sağlar.
select extended_timestamp,db_user,object_name,statementid,sql_text from V$XML_AUDIT_TRAIL order by 1 desc;
Eğer XML tutulan denetim izlerinde SYS dışındaki kullanıcıların çalıştırdıkları SQL komutlarınıda görnek istersek, audit_trail parametresi XML,EXTENDED yapmalıyız.
SQL> alter system set audit_trail=XML,EXTENDED scope=spfile; SQL> shut immediate SQL>startup
Deneme olsun düşüncesiyle auditini açtığımız employees tablosunda SYSTEM kullanıcısıyla bir takım sorgular çalıştıralım.
SQL> update hr.employees set SALARY=SALARY+SALARY*0.1; 107 rows updated. SQL> commit; Commit complete.
Görüldügü gibi SYSTEM kullanıcısının çalıştırdığı UPDATE komutunu artık görebiliriz.
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/
Yararlı olması Dilegiyle …
Yazar : Mustafa Bektaş Tepe