Linux/UNIX Sunucu Sistemleri Üzerinde İz Sürme
Posted by: Gökhan ALKAN 17 Ocak 2014
Linux/UNIX sunucularda genellikle birden fazla sistem yöneticisi, sunucu sistemler üzerinde çalışmaktadır. Burada yaşanabilecek en büyük sorunlardan bir tanesi olası bir çalışmazlık, saldırı veya denetim durumunda kim ne zaman hangi komutları girmiş bilgisinin edinilmesidir. Bunun için Linux/UNIX sistemlerde kullanılmak üzere açık kaynak kodlu yazılımlar ve servisler mevcuttur. Burada anlatılacak olanlar ise Bash kabuğunda gerçekleştirilecek olan bir yama ile girilen komutlara dair kayıtlarının Syslog servisi aracılığı ile kaydedilmesi olacaktır.
Burada anlatılan adımlar Ubuntu 12.10 dağıtımı ve Bash 4.0 versiyonu baz alınarak gerçekleştirilecektir. Bu işlem aşağıdaki şekilde görüntülenebilir.
Bash kabuğunun kaynak kodlarını ve ilgili yamayı temin etmek için aşağıdaki adımlar uygulanabilir.
# wget http://ftp.gnu.org/gnu/bash/bash-4.0.tar.gz
# wget http://sbdtools.googlecode.com/files/bash-4.0-syslog.patch
# tar -zxvf bash-4.0.tar.gz
# cd bash-4.0
İlgili paketlerin temin edilmesinden sonra yama için gerekli adımlar uygulanarak kurulum işlemi gerçekleştirilmelidir.
# patch -p1 < bash-4.0-syslog.patchpatching file bashhist.cpatching file lib/readline/histexpand.cpatching file lib/readline/histfile.cpatching file lib/readline/history.cpatching file lib/readline/history.h
Kurulum işleminin /usr/local/bash dizinine gerçekleştirileceği varsayılmıştır.
# ./configure --prefix=/usr/local/bash# make# make install
Sonrasında aşağıdaki komutlar çalıştırılarak mevcut kabuğun yerine derlenen Bash kabuğunun kullanılması sağlanır.
# mv /bin/bash /bin/bash.bak && cp bash /bin/
Kurulum işleminin tamamlanmasının ardından komutların Syslog servisi aracılığı ile kaydedilebilmesi için ilgili yapılandırma seçeneklerinin aktif edilmesi gerekmektedir. İlgili yamadaki aşağıdaki satırlara bakılacak olursa;
syslog(LOG_LOCAL5 | LOG_INFO, "history: [pid:%d uid:%d] %s, getpid(), getuid(), string);
Syslog servisine local5 öncelikle; süreç numarası, kullanıcı ID değeri ve komut biçiminde kaydedilmesi sağlanmıştır. local5 öncelikle kayıt gerçekleştirilmesi için Syslog servisi üzerinde bir takım yapılandırma adımlarının gerçekleştirilmesi gerekmektedir. Bunun için;
# touch /var/log/bash.log
Ve son olarak değişikliklerin etkin olabilmesi için Syslog servisi yeniden başlatılmalıdır.
Bu işlemlerin ardından sunucu sistem üzerinden girilen tüm komutlar /var/log/bash.log dosyasına kaydedilecektir. Örnek bir içerik aşağıdaki şekilde olmaktadır.
May 23 20:33:41 linhux bash: history: [pid:24712 uid:0] grep bash /etc/passwd
Goruldugu gibi hangi tarihte hangi komut kim tarafindan verilmis goruntulenebilmektedir. Tabiki burada akla bu islemin guvenilirligi hakkinda bir takim sorular gelebilmektedir. Ornegin /var/log/bash.log dosyasinin iceriginin degistirilmesi durumunda olabilecekler. Bu islem cok asikar bir durum olusturdugundan cevap cok net olmaktadir. Burada anlatilanlar sadece durumu gosterebilmek acisindan bu sekilde ele alinmistir. Zaten burada dusunulen olasi bir aksilik durumunda girilen komutlarin izlerinin surulebilmesi oldugundan syslog servisi icin uzak bir sunucu dusunulmustur. Syslog servisi ile kayitlarin lokal bir dosyada tutulmasi yerine uzak syslog sunucuya gonderilebilmesi icin syslog yapilandirmasinda asagidaki satir girilmelidir.
Görüldüğü gibi hangi tarihte hangi komut kim tarafından verilmiş görüntülenebilmektedir. Tabii ki burada akla bu işlemin güvenilirliği hakkında bir takım sorular gelebilmektedir. Örneğin /var/log/bash.log dosyasının içeriğinin değiştirilmesi durumunda olabilecekler. Bu işlem çok aşikâr bir durum oluşturduğundan cevap çok net olmaktadır. Burada anlatılanlar sadece durumu gösterebilmek acısından bu şekilde ele alınmıştır. Zaten burada düşünülen olası bir aksilik durumunda girilen komutların izlerinin sürülebilmesi olduğundan Syslog servisi için uzak bir sunucu düşünülmüştür. Syslog servisi ile kayıtların yerel bir dosyada tutulması yerine uzak Syslog sunucuya gönderilebilmesi için Syslog yapılandırmasında aşağıdaki satır girilmelidir.
if ((p = getpwuid(uid = getuid())) == NULL)
printf(" pw_name : %s\n", p->pw_name);
printf(" pw_uid : %d\n", (int) p->pw_uid);
printf(" pw_gid : %d\n", (int) p->pw_gid);
printf(" pw_shell : %s\n", p->pw_shell);
Kod derleme işlemi tamamlandıktan sonra strace komutu ile incelendiğinde açıkça /etc/passwd dosyasının open fonksiyonu ile okunduğu görülmektedir.
# gcc -o calistir deneme.c
# strace -o cikti ./calistir
pw_name : root pw_uid : 0 pw_gid : 0 pw_shell : /bin/bash
# grep passwd cikti
/etc/passwd dosyasının değiştirilmesinin önlenmesi için Linux sistemlerde kullanılan chattr komutu kullanılabilir. Bu komut ile istenilen dosyasının değiştirilmesi ve silinmesi engellenebilmektedir. Kullanıcı ister değiştirilmiş bir dosyayı sisteme SSH, FTP ya da farklı yollardan aktarmak istesin, isterse dosyayı değiştirmeye çalışsın, bu işlemi gerçekleştiremeyecektir. Hangi kullanıcı haklarına sahip olursanız olun öncelikle dosyadan bu hakkın kaldırılması gerekmektedir. Bu işlemde doğal olarak uzak Syslog sunucusunda görüntülenecektir. Ayrıca yine aynı şekilde sisteme giriş yapmış kullanıcıların logları da incelenerek bu tutarsızlık ortaya çıkarılabilecektir. /etc/passwd dosyasında değişiklik yapılabilmesini önlemek için;
komutu girilmelidir. Burada anlatılanlar tek çözüm olarak görülmemiştir. Yazının başında değinildiği gibi gerek ticari gerekse açık kaynak kodlu farklı yazılımlar ve servisler aracılığı ile bu işlem gerçekleştirebilmektedir. Burada anlatılanlar Linux/UNIX sistemlerdeki meydana gelebilecek olası bir iz sürme olayına karşılık alternatif çözüm sunmak amacı ile kaleme alınmıştır.
NOT: Bu makalenin en güncel haline http://www.galkan.net/2014/01/linux-unix-sistemlerde-iz-surme-kayit-tutma.html adresinden erişim sağlanabilmektedir.
bilgi toplama, hacking, linux, linux security, programming for security, security articles