Linux Sistemlerde Auditd Kullanarak Detaylı Sistem Denetimi

auditd,  *nix sistemlerde özellikle güvenlik ile ilgili olayların derinlemesine incelenmesi ve raporlanması için kullanılan ve RedHat tarafından geliştirilen çok gelişmiş bir denetleme mekanizmasıdır. auditd ile herhangi bir dosya bütünlük kontrolü aracının yaptığına benzer şekilde sistem dosyalarında meydana gelen değişiklikler takip edilebildiği gibi kernel seviyesinde çalışmasından mütevellit daha derinlere inilerek herhangi bir sistem çağrısının neden olduğu değişiklikler de takip edilerek detaylı olarak loglanabilmektedir.
Bu anlamda Linux ya da Unix sistemlerde olup bitenle ilgili detaylı analiz yapılması gereken noktalarda auditd oldukça işe yaramaktadır. Zira, hangi dosyanın ne zaman kim tarafından değiştirildiğinden, belirli sistem çağrılarının sistemde meydana getirdiği değişiklikleri detaylı olarak analiz edilebilmesi, “sızılmış” bir sisteme hangi yollar ile girildiği ve sistemde ne gibi değişiklikler yapıldığı, arka kapı bırakılıp bırakılmadığının tespiti gibi konuların aydınlatılması açısından oldukça faydalı bir durumdur.
Yazının devamında, auditd ile ilgili detaylı bilgi bulabilir, kurulumu ve yapılandırması ile ilgili notlara erişebilirsiniz…

Linux Audit Nedir ?

Linux Audit mekanizması birden fazla bileşenden oluşmaktadır. Audit kernel modülü, sistem çağrılarını takip eder ve yapılandırmada takip edilmesi istenen çağrılarla ilgili olayları kaydeder. Audit daemon’u ise denetim raporlarını diske yazmakla görevli bileşendir. Toplanan logların görüntülenmesi ve sorgulanması için de belirli audit uygulamacıkları bulunmaktadır. Bu şekilde sisteminiz belirlediğiniz kriterlere göre takip edilecek ve uyuşan olaylar diske sorgulanabilir ve raporlanabilir bir şekilde kaydedilecektir.
Audit’in temel bileşenleri aşağıdaki gibidir: (Bu bölümde sadece sistem bileşenlerinin ne  iş yaptıklarına değineceğim ancak pratik örnekleri yazının ilerleyen bölümlerinde bulabilirsiniz.)

auditd

Audit kernel modülü tarafından üretilen logları diske yazmakla görevli olan auditd, adından da anlaşılacağı gibi daemon modda çalışan bir uygulamadır ve /etc/audit/auditd.conf path’indeki ana yapılandırma dosyasında nasıl çalışması gerektiği tarif edilir -ki ön tanımlı ayarlar başlangıç için yeterlidir.- Yapılandırma ile ilgili detaylar için  man sayfasına ya da http://linux.die.net/man/8/auditd.conf adresine bakabilirsiniz.

 auditctl

auditctl ise audit sistemi ilgili yönetim arabirimidir. Audit kernel ayarları, logların hangi parametrelerle üretileceği ve hangi dosya ve sistem çağrılarının takip edileceğini belirten kural setlerini düzenlemek için kullanılmakadır.

audit rules

/etc/audit/audit.rules dosyası içerisinde audit’in neyi nasıl izleyeceğini belirttiğimiz kurallar tanımlanmaktadır. Bu dosya auditd başladığı zaman sistem tarafından okunur ve içerisinde kurallardan hareketle izleme işlemleri başlatılır.

ausearch

Toplanan loglar içerisinde arama yapmak için ausearch komutu kullanılmaktadır. ausearch ile log dosyasında belirli kriterlere göre filtreleme yapılabilmektedir.

autrace

autrace, starec’e benzeyen hemen hemen aynı şeyi yapan bir audit aracıdır. Bu araç ile herhangi bir sürecin arkaplanda tam olarak ne yaptığı görüntülenebilmektedir.

aureport

aureport aracı, toplanan loglardan  özelleştirilmiş raporlar çıkarılmak için kullanılmaktadır.

Audit Kurulumu

Audit RHEL tabanlı sistemlerde default olarak gelmektedir bu nedenle ayrıca kurulmasına gerek bulunmamaktadır. Diğer sistemler için ise şu şekilde kurulum yapılabilmektedir:

Debian/Ubuntu Sistemler

# apt-get install auditd

FreeBSD Sistemler

FreeBSD sistemlerde de auditd default olarak gelmektedir, ancak devreye girmesi için startup’a eklenmesi gerekmektedir.
# echo 'auditd_enable="YES"' >> /etc/rc.conf

Yapılandırma

auditd’nin temel yapılandırması demin de bahsettiğim gibi /etc/audit/auditd.conf dosyasında bulunmaktadır. Bu dosyanın default şekli aşağıdaki gibidir:
# This file controls the configuration of the audit daemon
#

log_file = /var/log/audit/audit.log
log_format = RAW
log_group = root
priority_boost = 4
flush = INCREMENTAL
freq = 20
num_logs = 5
disp_qos = lossy
dispatcher = /sbin/audispd
name_format = NONE
##name = mydomain
max_log_file = 6
max_log_file_action = ROTATE
space_left = 75
space_left_action = SYSLOG
action_mail_acct = root
admin_space_left = 50
admin_space_left_action = SUSPEND
disk_full_action = SUSPEND
disk_error_action = SUSPEND
##tcp_listen_port =
tcp_listen_queue = 5
tcp_max_per_addr = 1
##tcp_client_ports = 1024-65535
tcp_client_max_idle = 0
enable_krb5 = no
krb5_principal = auditd
##krb5_key_file = /etc/audit/audit.key
Gördüğünüz gibi logların nereye yazılacağı, log formatının nasıl olacağı, sürecin sahibinin kim olacağı gibi temel bilgiler burada tanımlanmaktadır. Kendinize göre düzenlemek isterseniz auditd.conf’un man dosyasına ya da http://linux.die.net/man/8/auditd.conf adresine bakabilirsiniz. (Not: yardım dökümanını güncel olduğundan emin olmak açısından man üzerinden incelemenizi tavsiye ederim.)
Auditd ile ilgili bir diğer yapılandırma dosyası ise daemon’ın nasıl çalışacağı ile ilgili extra parametrelerin belirlendiği, RHEL sistemlerde,  /etc/sysconfig/auditd , Debian sistemlerde, /etc/defaults/auditd olarak geçen dosyadır. Audit’i öntanımlı ayarlarla çalıştırmak için bu dosyada ayrıca düzenleme yapmanıza gerek bulunmamaktadır.

auditd’nin başlatılması

Aslında audit, RHEL sistemlerde öntanımlı kurulu geldiğinden dolayı startup’a ekli durumdadır. Yani sisteminizi başlattığınız zaman auditd çalışmaya başlar. Debian’larda ise kurulum sonrası otomatik olarak başlatılacaktır.
Linux sistemlerde auditd klasik olarak init.d altından start / stop edilir:
/etc/init.d/auditd start
FreeBSD sistemlerde ise rc.d dizininin altındaki control scripti üzerinden çalıştırılmalıdır.
# /etc/rc.d/auditd start

Audit Sisteminin Kullanımı

Yazının buraya kadar olan bölümünde daha çok teorik bilgilerden bahsettim, bundan sonrasında ise birkaç örnek paylaşacağım. Bu şekilde pratik kullanım konusu daha da netleşecektir.
Bileşenler kısmında da bahsettiğim gibi audit’in neyi nasıl monitor edeceğini auditctl isimli uygulama üzerinden tanımladığımız kurallarla belirtiyoruz. Kuralları doğrudan komut satırından auditctl ile girebileceğimiz gibi audit.rules dosyasına da yazabiliyoruz. İkinci yöntemde auditd restart edildiği zaman bu dosyayı okuyor ve kuralları gene auditctl üzerinden devreye alıyor.

Sisteme Audit Kuralı Ekleme

Temel olarak auditd, dosya ve dizinleri ayrıca spesifik sistem çağrılarını monitor edebilmektedir. Şimdi bu uygulama şekillerini birer örnek üzerinden inceleyelim:

Dosya Monitoring Kuralı

Örnek olarak /etc/passwd dosyasının her koşulda takip edilmesi ve değişikliklerin loglanması için şu komutu verebiliriz:
# auditctl -w /etc/passwd -k passwd-dosyasi -p rwxa
Bu komutu verdiğiniz zaman, auditd passwd’yi monitor etmeye başlayacaktır. Komutta geçen ifadelerin anlamları şu şekildedir:
-w /etc/passwd : Hangi dosyanın monitor edileceği -w parametresi ile tanımlanır.
-p rwxa : ifadesi, ilgili dosyada read, write, execure ve attribute change işlemi oluşması durumunda raporlanmasını söylemektedir. Bu anlamda passwd üzerinde en küçük bir değişiklik raporlanacaktır.
-k passwd-dosyasi : -k parametresi ile loglanan olayların daha sonradan ausearch gibi komutlarla analiz edilmesini kolaylaştırmak için hangi isimle etiketleneceğini belirtmektedir. Bizim örneğimizde audit.log dosyasına passwd ile ilgili eklenecek tüm olaylar passwd-dosyasi etiketi ile işaretlenecektir.

Dizin Monitoring Kuralı

Bir dizini monitör etmekle ilgili bir örnek ise şu şekilde olabilir:
# auditctl -w /etc -k etc-dizini -p wx
Bu örnekte audit, -w ile belirtildiği üzere /etc dizini altında write ve execute isteğinde bulunan (-p wx) tüm sistem çağrılarını etc-dizini etiketi ile loglayacaktır.

Sistem Çağrılarının Monitor Edilmesi

Örnek olarak mkdir komutu ile ilgili tüm sistem çağrılarını izlemek ve loglamak için şu kural kullanılabilir:
# auditctl -a exit,always -F arch=b64 -S mkdir
Bu kuralda,
-a exit,always : ile bunun bir system call kuralı olduğunu belirtiyoruz ve hangi sistem çağrısının state’ini  belirtiyoruz.
-S mkdir : -S parametresi ile sistem çağrısını belirtiyoruz.
-F arch=b64 : ile cpu mimarimizi tanımlıyoruz. (işlemciniz 32 bit ise bu parametreyi b32 olarak set etmeniz gerekir.)
Aşağıdaki komut ise başarısız olan open çağrılarını izleyip loglayacaktır:
 # auditctl -a exit,always -F arch=b64 -S open -F success!=0

Belirli Süreçlerin Monitor Edilmesi

Bir diğer kural tipi de süreçlerin pid ID’lerinden monitor edilmesidir. Örnek olarak 1923 pid’li bir sürecin arka planda yaptığı tüm işi monitor etmek için şu şekilde bir kural girilebilir:
# auditctl -a exit,always -F arch=b64 -S all -F pid=13594
Örnekleri çoğaltmak mümkün; daha fazla detay için man audit.rules ile man dosyasına göz atabilirsiniz.

Kuralların Listelenmesi

Kurallarınızı sisteme sonra,  şu şekilde listeleyebilirsiniz:
# auditctl -l
Bu komutun çıktısı aşağıdaki gibi olacaktır:
LIST_RULES: exit,always watch=/etc/passwd perm=rwxa key=passwd-dosyasi
LIST_RULES: exit,always dir=/etc (0x4) perm=wx key=etc-dizini
LIST_RULES: exit,always arch=3221225534 (0xc000003e) key=mkdir-syscall syscall=mkdir
LIST_RULES: exit,always arch=3221225534 (0xc000003e) success!=0 key=fail-open syscall=open
Görüldüğü üzere eklemiş olduğumuz kurallar listelenmektedir.

Kuralların audit.rules dosyasına eklenmesi

Eklediğiniz kuralların kalıcı olması için audit.rules dosyasına eklenmesi gerekir, bunun için komuttaki auditctl ifadesini çıkararak aşağıdaki gibi ekleyebilirsiniz:
Öncesinde rules dosyasını editleyin:
# vi /etc/audit/audit.rules
ve dosyanın altına kuralları ekleyin:
 -w /etc/passwd -k passwd-dosyasi -p rwxa
 -w /etc -k etc-dizini -p wx
 -a exit,always -F arch=b64 -S mkdir -k mkdir-syscall
 -a exit,always -F arch=b64 -S open -F success!=0 -k fail-open
Böylece auditd’yi restart ettiğiniz zaman ilgili satırlar okunacak ve auditctl tarafından uygulanacaktır.

Logların Görüntülenmesi

Kurallardan hareketle toplanan tüm loglar, /var/log/audit/audit.log dosyasına kaydedilmektedir. Bu dosyada bizim girdiğimiz kurallardan hariç olmak üzere öntamımlı olarak sisteme giriş çıkış bilgileri de bulunmaktadır.
Dosya içerisinde belirli kriterlere göre arama yapmak için ausearch komutu kullanılabilir. Örnek olarak kendi eklediğimiz komutlarda -k parametresi ile kurallara etiketler atamıştık. İşte ilgili kurallar nedeni ile üretilen loglar bu etiketler üzerinden aranabilirler.
Örnek olarak:
# ausearch -k passwd-dosyasi
Komutu, (eklediğimiz kurala göre) passwd dosyasında yapılan değişiklikleri raporlayacaktır. Bunu test etmek için sisteminize bir kullanıcı ekleyebilir sonrasında bu komutu çalıştırabilirsiniz. Örnek çıktı şu şekilde olacaktır:
----
time->Sat May  3 18:50:37 2014
type=PATH msg=audit(1399132237.197:2945): item=0 name="/etc/passwd" inode=789473 dev=fd:00 mode=0100644 ouid=0 ogid=0 rdev=00:00 nametype=NORMAL
type=CWD msg=audit(1399132237.197:2945):  cwd="/root"
type=SYSCALL msg=audit(1399132237.197:2945): arch=c000003e syscall=2 success=yes exit=4 a0=7f436bb4269a a1=80000 a2=1b6 a3=0 items=1 ppid=2040 pid=13588 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts1 ses=12 comm="adduser" exe="/usr/sbin/useradd" key="passwd-dosyasi"
----
time->Sat May  3 18:50:37 2014
type=PATH msg=audit(1399132237.198:2951): item=0 name="/etc/passwd" inode=789473 dev=fd:00 mode=0100644 ouid=0 ogid=0 rdev=00:00 nametype=NORMAL
type=CWD msg=audit(1399132237.198:2951):  cwd="/root"
type=SYSCALL msg=audit(1399132237.198:2951): arch=c000003e syscall=2 success=yes exit=5 a0=7f4372df0ce0 a1=2 a2=1b6 a3=0 items=1 ppid=2040 pid=13588 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts1 ses=12 comm="adduser" exe="/usr/sbin/useradd" key="passwd-dosyasi"
----
time->Sat May  3 18:50:37 2014
type=PATH msg=audit(1399132237.201:2968): item=0 name="/etc/passwd" inode=789473 dev=fd:00 mode=0100644 ouid=0 ogid=0 rdev=00:00 nametype=NORMAL
type=CWD msg=audit(1399132237.201:2968):  cwd="/root"
type=SYSCALL msg=audit(1399132237.201:2968): arch=c000003e syscall=2 success=yes exit=9 a0=7f436bb4269a a1=80000 a2=1b6 a3=0 items=1 ppid=2040 pid=13588 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts1 ses=12 comm="adduser" exe="/usr/sbin/useradd" key="passwd-dosyasi"
----
time->Sat May  3 18:50:37 2014
type=PATH msg=audit(1399132237.202:2972): item=0 name="/etc/passwd" inode=789473 dev=fd:00 mode=0100644 ouid=0 ogid=0 rdev=00:00 nametype=NORMAL
type=CWD msg=audit(1399132237.202:2972):  cwd="/root"
type=SYSCALL msg=audit(1399132237.202:2972): arch=c000003e syscall=2 success=yes exit=10 a0=7f436bb4269a a1=80000 a2=1b6 a3=0 items=1 ppid=2040 pid=13588 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts1 ses=12 comm="adduser" exe="/usr/sbin/useradd" key="passwd-dosyasi"
----
time->Sat May  3 18:50:37 2014
type=CONFIG_CHANGE msg=audit(1399132237.208:2991): auid=0 ses=12 op="updated rules" path="/etc/passwd" key="passwd-dosyasi" list=4 res=1
----
time->Sat May  3 18:50:37 2014
type=PATH msg=audit(1399132237.208:2992): item=4 name="/etc/passwd" inode=789474 dev=fd:00 mode=0100644 ouid=0 ogid=0 rdev=00:00 nametype=CREATE
type=PATH msg=audit(1399132237.208:2992): item=3 name="/etc/passwd" inode=789473 dev=fd:00 mode=0100644 ouid=0 ogid=0 rdev=00:00 nametype=DELETE
type=PATH msg=audit(1399132237.208:2992): item=2 name="/etc/passwd+" inode=789474 dev=fd:00 mode=0100644 ouid=0 ogid=0 rdev=00:00 nametype=DELETE
type=PATH msg=audit(1399132237.208:2992): item=1 name="/etc/" inode=781827 dev=fd:00 mode=040755 ouid=0 ogid=0 rdev=00:00 nametype=PARENT
type=PATH msg=audit(1399132237.208:2992): item=0 name="/etc/" inode=781827 dev=fd:00 mode=040755 ouid=0 ogid=0 rdev=00:00 nametype=PARENT
type=CWD msg=audit(1399132237.208:2992):  cwd="/root"
type=SYSCALL msg=audit(1399132237.208:2992): arch=c000003e syscall=82 success=yes exit=0 a0=7fffad3e6dd0 a1=7f4372df0ce0 a2=7fffad3e6c90 a3=0 items=5 ppid=2040 pid=13588 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts1 ses=12 comm="adduser" exe="/usr/sbin/useradd" key="passwd-dosyasi"
Çıktıda görüldüğü gibi passwd dosyasına erişim sağlayan tüm uygulamalar ve sistem çağrıları listelenmektedir.
Monitor edilen süreçlerle ilgili toplanan logları görüntülemek için ausearch komutu -p pid parametresi ile kullanılabilir. Örneğimizde pid’i 1923 olan süreç için kural girmiştik. Görüntüleme işi ise şu şekilde yapılabilir:
# ausearch -p 1923
Ausearch komutu ile -k ile keyword (tag) belirtilmemiş kurallara ait çıktıları monitor etmek için ise doğrudan -f ile dosya ismi vererek kullanılabilir.
# ausearch -f /etc/passwd -i
Komuttaki parametrelere ait açıklamalar şu şekildedir:
-f /etc/passwd : Sadece bu dosya ile ilgili çıktıları görüntüle
-i : Metin içindeki sayısal girdileri örnepin uid değerini hesap ismine dönüştürür.
Bir diğer arama şekli ise -x parametresi ile çalıştırılan komuta göre arama yapmaktır. Örneğin hangi kullanıcının ‘vi’ komutunu kullanarak /etc/passwd dosyasına erişmeye çalıştığını görmek için aşağıdaki gibi bir komut kullanılabilir.
ausearch -f /etc/passwd -x vi -i
Komutun çıktısı aşağıdaki gibi olacaktır:
type=PATH msg=audit(05/03/2014 19:23:49.220:3781) : item=0 name=/etc/passwd inode=789472 dev=fd:00 mode=file,644 ouid=root ogid=root rdev=00:00 nametype=NORMAL
type=CWD msg=audit(05/03/2014 19:23:49.220:3781) :  cwd=/root
type=SYSCALL msg=audit(05/03/2014 19:23:49.220:3781) : arch=x86_64 syscall=setxattr success=yes exit=0 a0=e913f0 a1=7fd282bb5db7 a2=eabbc0 a3=1c items=1 ppid=1728 pid=13745 auid=root uid=root gid=root euid=root suid=root fsuid=root egid=root sgid=root fsgid=root tty=pts0 ses=2 comm=vi exe=/bin/vi key=passwd-dosyasi
Gördüğünüz gibi hangi kullanıcının (root) vi ile passwd’yi editlemiş olduğunu görebiliyoruz.
Ausearch ile ilgili bir diğer güzel kullanım şekli ise, tarih parametresi geçilebiliyor olmasıdır. Örneğin sadece bügün’e ait logları görüntüle demek için şu komut kullanılabilir:
# ausearch -ts today -k etc-dizini
ya da spesifik bir tarihten sonraki tüm loglar denilebilir:
# ausearch -ts 03/04/2014  -k etc-dizini
ausearch ile ilgili birçok parametre bulunuyor. Detaylar için man ausearch ile man dosyasına göz atmanızı öneririm.
Log dosyalarından anlaşılacağı üzere audit izlediği sistem bileşenleri ile ilgili çok detaylı bilgilendirmede bulunmaktadır. Bu yolla sisteminizde neler olup bittiğini en ince ayrıntısına kadar incelemeniz mümkün olabilmektedir. Audit çok gelişmiş bir uygulama olmasından dolayı burada bahsetmediğim daha bir çok parametreye sahip, bu nedenle her bileşenle ilgili man dosyasına da göz atmanızı öneririm.