Linux Advanced Logging

Merhaba, bu kılavuzda linux sunucu üzerinde nasıl log toplayacağımızı inceleyeceğiz. Linux günlükleri, Linux işletim sistemi, uygulamaları ve sistemi için olayların zaman çizelgesini sağlar ve sorunlarla karşılaştığınızda değerli bir sorun giderme aracıdır. Sorunlar ortaya çıktığında, bir yöneticinin yapması gereken ilk şey günlük dosyalarını analiz etmektir. Biz merkezi olarak tüm logları tek yerden nasıl toplayabileceğimize bakalım.
Kullanacağımız servislerin kurulumu ve yapılandırılmasına detaylı olarak diğer kılavuzlardan bulabilirsiniz. Şimdi kısaca bilgilendirme yapıp uygulamalara geçelim.
Log Nedir?
Log, bilgisayarlarda her işlemin kaydedildiği belgelere denir. TDK'ya göre bir arada işlenen ve birbirleriyle ilgili olan kayıtların tümüne verilen addır.
Syslog Nedir?
Bilgi işlemde, syslog, mesaj günlüğü için bir standarttır. Mesajları üreten yazılım, bunları depolayan sistem ve bunları raporlayan ve analiz eden yazılımların birbirinden ayrılmasını sağlar. Her mesaj, mesajı oluşturan sistemin türünü gösteren bir tesis koduyla etiketlenir ve bir önem düzeyi atanır.
Rsyslog Nedir?
Rsyslog, bir IP ağındaki günlük iletilerini iletmek için UNIX ve Unix benzeri bilgisayar sistemlerinde kullanılan açık kaynaklı bir yazılım yardımcı programıdır
Syslog, Rsyslog ve Syslog-ng arasındaki fark nedir?
Bunların tümü , rsyslog ve syslog - ng'nin geleneksel syslogd'un yerine daha hızlı ve daha zengin özelliklere sahip olduğu sistem günlüğü arka plan programlarıdır . sistem günlüğü sıfırdan başlarken, rsyslog aslında sözdizimini destekleyen ve genişleten bir syslogd çatalıydı .
En Önemli Linux Günlükleri
Çoğu dizini dört kategoriden birinde gruplayabiliriz:
- Uygulama Günlükleri
- Olay Günlükleri
- Hizmet Günlükleri
- Sistem Günlükleri
Diğer işletim sistemlerinde olduğu gibi, Linux günlük dosyalarını görmek için belirli komutları kullanabilirsiniz. Linux günlükleri sudo ls /var/log komutuyla görüntülenecektir . Ardından, bu dizin altında saklanan günlükleri görmek için ls yazabilirsiniz . Görüntülenecek en önemli günlüklerden biri, auth ile ilgili mesajlar dışında her şeyi günlüğe kaydeden syslog'dur.
Şimdi log dizininin içindeki dosyalardan kısaca bahsedelim. Dağıtımlara göre bazı dosya isimleri değişiklik gösterebilir, ancak mantık hep aynıdır.

- /var/log/syslog veya /var/log/messages: Sistemle ilgili bilgilerin yanı sıra genel mesajlar. Esasen, bu günlük, küresel sistemdeki tüm etkinlik verilerini depolar. CentOS veya Rhel gibi Redhat tabanlı sistemlere yönelik etkinliklerin messages dosyasında, Ubuntu ve diğer Debian tabanlı sistemler ise Syslog'da depolandığını unutmayın.
- /var/log/auth.log veya /var/log/secure: Hem başarılı hem de başarısız oturum açmalar ve kimlik doğrulama yöntemleri dahil olmak üzere kimlik doğrulama günlüklerini depolar. Yine sistem türü, kimlik doğrulama günlüklerinin nerede saklanacağını belirler; Debian/Ubuntu bilgileri /var/log/auth.log içinde saklanırken Redhat/CentrOS /var/log/secure içinde saklanır. Bu log dosyalarında sudo yetkisi ile çalıştırılan komutların ve kullanıcıların loglarının tutulduğunu unutmayın.
- /var/log/boot.log: Başlatma ile ilgili tüm bilgilerin ve başlatma sırasında günlüğe kaydedilen tüm mesajların deposu.
- /var/log/maillog veya var/log/mail.log: Posta sunucularıyla ilgili tüm günlükleri saklar; postfix, smtpd veya sunucunuzda çalışan e-postayla ilgili hizmetler hakkında bilgiye ihtiyaç duyduğunuzda kullanışlıdır.
- /var/log/kern: Çekirdek günlüklerini ve uyarı verilerini depolar. Bu günlük, özel çekirdeklerde sorun giderme için de değerlidir.
- /var/log/dmesg: Aygıt sürücüleriyle ilgili mesajlar. Bu dosyadaki mesajları görüntülemek için dmesg komutu kullanılabilir.
- /var/log/faillog: Tüm başarısız oturum açma girişimlerinin bilgilerini içerir; bu, giriş kimlik bilgilerini hacklemeye çalışanlar ve kaba kuvvet saldırıları gibi güvenlik ihlalleri girişimi hakkında bilgi edinmek için yararlıdır.
- /var/log/cron: Cron arka plan programının bir işi ne zaman başlattığı, ilgili hata mesajları vb. gibi Crond ile ilgili tüm mesajları saklar.
- /var/log/yum.log veya apt|dpkg: Yum veya apt komutunu kullanarak paketleri kurarsanız, bu günlük, bir paketin ve tüm bileşenlerin doğru şekilde kurulup kurulmadığını belirlemede faydalı olabilecek ilgili tüm bilgileri depolar.
- /var/log/httpd, /var/log/apache2 veya /var/log/nginx/ : Apache httpd veya Nginx arka plan programının error_log ve access_log dosyalarını içeren bir dizindir. error_log, httpd tarafından karşılaşılan tüm hataları içerir. Bu hatalar, bellek sorunlarını ve sistemle ilgili diğer hataları içerir. access_log, HTTP üzerinden alınan tüm isteklerin kaydını içerir.
- /var/log/mysqld.log veya /var/log/mysql.log : Tüm hata ayıklama, başarısızlık ve başarı mesajlarını günlüğe kaydeden MySQL günlük dosyası. MySQL arka plan programı mysqld'nin başlatılması, durdurulması ve yeniden başlatılması hakkında bilgi içerir. Bu, sistemin dizini belirlediği başka bir örnektir; RedHat, CentOS, Fedora ve diğer RedHat tabanlı sistemler /var/log/mysqld.log'u kullanırken Debian/Ubuntu /var/log/mysql.log dizinini kullanır.
Yukarıdaki log dosyaları varsayılan sistemlere göre belirtilmiştir. Kurduğunuz uygulamalara göre örnekler daha çoğaltılabilir.
Ön Gereksinimler
- Ubuntu 16x-22x
- auditd service
- superuser
Artık genel bilgimiz olduğuna göre bir sistemden hangi logları toplayacağımıza ve hangi önemli logların eksik olduğunu ve bunları nasıl alabileceğimize bakalım.
İşlemlere başlamadan önce auditd servisinin çalışır olduğundan emin olun ve aşağıdaki github listesini auditd kurallarına ekleyiniz.
https://raw.githubusercontent.com/Neo23x0/auditd/master/audit.rules
Bu makaleyi yazma amacım varsayılan olarak bir sistem kurduğunuzda aslında bir çok şeyin eksik olduğunu görmem ve bunları nasıl elde edebileceğimize bakmak oldu. Şimdi hangi logları alabileceğimize uygulamalı olarak bakalım.
Aşağıda her kısımda hangi logların alınacağı belirtilmiştir.
Authentication
- Kullanıcının başarılı ve başarısız oturum olayları
- Kullanıcı oluşturma ve silme olayları
- Kullanıcı gruba ekleme ve çıkarma olayları
- Kullanıcı aktif ve pasif etme olayları
- Kullanıcı parola değiştirme olayları
- Sudo komutu kullanım olayları
Kılavuz boyunca, konfigürasyon dosyaları üzerinde düzenleme yapılmadan önce yedek alınması önerilir.
STEP1 | Auditd Kurulumu
Makalenin en başında merkezi olarak tüm logları tek yerden nasıl toplamaya çalışacağımıza değinmiştik. Bunu yapmak için auditd hizmetine ihtiyacımız vardır. O yüzden auditd hizmeti hakkında kısa bir bilgi verip, hemen kuruluma geçelim.
Auditd Hizmeti Ne işe Yarar?
Linux Denetim sistemi, sisteminizdeki güvenlikle ilgili bilgileri izlemenin bir yolunu sağlar. Denetim, önceden yapılandırılmış kurallara dayanarak, sisteminizde meydana gelen olaylar hakkında mümkün olduğunca çok bilgi kaydetmek için günlük girişleri oluşturur. Bu bilgi, görev açısından kritik ortamların güvenlik ilkesini ihlal edenleri ve gerçekleştirdiği eylemleri belirlemesi açısından çok önemlidir.
Denetim, sisteminize ek güvenlik sağlamaz; bunun yerine, sisteminizde kullanılan güvenlik ilkelerinin ihlallerini keşfetmek için kullanılabilir. Bu ihlaller, SELinux gibi ek güvenlik önlemleri ile daha da önlenebilir.
Aşağıdaki liste, Audit'in günlük dosyalarına kaydedebildiği bazı bilgileri özetlemektedir:
- Bir olayın tarihi ve saati, türü ve sonucu.
- Öznelerin ve nesnelerin duyarlılık etiketleri.
- Bir olayın, olayı tetikleyen kullanıcının kimliğiyle ilişkilendirilmesi.
- Denetim yapılandırmasındaki tüm değişiklikler ve Denetim günlük dosyalarına erişme girişimleri.
- SSH, Kerberos ve diğerleri gibi kimlik doğrulama mekanizmalarının tüm kullanımları.
- /etc/passwd gibi herhangi bir güvenilir veritabanında yapılan değişiklikler.
- Sisteme veya sistemden bilgi alma veya verme girişimleri.
- Kullanıcı kimliğine, konu ve nesne etiketlerine ve diğer niteliklere göre olayları dahil edin veya hariç tutun.
Audit Servisi Kurulumu
Denetim sistemini kullanabilmek için sisteminizde denetim paketlerinin kurulu olması gerekir. Denetim paketleri varsayılan olarak RHEL 7'de yüklü gelir. Bu paketler kurulu değilse, Denetim'i ve bağımlılıkları kurmak için kök kullanıcı olarak aşağıdaki komutu yürütün.
RHEL Türü Dağıtımlar
sudo yum -y install audit audit-libs
DEBIAN Türü Dağıtımlar
sudo apt -y install auditd audispd-plugins

Auditd yüklendikten sonra, daha fazla log almamız için bazı ayarlar yapmamız gerekmektedir. Özel yapılandırma dosyası için /etc/audit/rules.d/audit.rules yolunu kullanmanız gerekmektedir. Dosyayı bir editör yardımı ile açalım.
sudo vi /etc/audit/rules.d/audit.rules
Aşağıda ki link üzerinden kuralları ekleyiniz.
https://gist.github.com/Neo23x0/9fe88c0c5979e017a389b90fd19ddfee
Not :Denetim tarafından toplanan bilgi miktarına bağlı olarak sistem performansı etkilenebilir.
Gerekli ayarları yapılandırıldıktan sonra, auditd denetim bilgilerini toplamak ve günlük dosyalarında saklamak için hizmeti başlatmanız gerekir. Başlatmak için kök kullanıcı olarak aşağıdaki komutu kullanın.
sudo service auditd start
service komutu, auditd arka plan programı ile doğru bir şekilde etkileşim kurmanın tek yoludur. Auid değerinin düzgün bir şekilde kaydedilmesi için service komutunu kullanmanız gerekir. systemctl komutunu yalnızca iki eylem için kullanabilirsiniz: enable ve status
auditd servisini, önyükleme zamanında başlayacak şekilde yapılandırmak için:
sudo systemctl enable auditd
auditd servisi denetimi eylemi komutu kullanılarak denetim üzerinde bir dizi başka eylem gerçekleştirilebilir. auditd servisi ile ilgili daha detaylı bilgiye diğer kılavuzlardan üzerinden erişebilirsiniz.
STEP2 | Authentication
Günümüzde sisteme ait log kayıtları, büyük önem taşımaktadır. Sisteme başarılı veya başarısız giriş yapan kullanıcıları takip etmeliyiz ve buna ek olarak SIEM gibi ürünler ile alarmlar oluşturmamız gerekmektedir. Artık bunu hem yasal hemde güvenlik için zorunlu olarak düşünmek yanlış olmayacaktır. Debian dağıtımlarında, /var/log/auth.log RHEL dağıtımlarında ise /var/log/secure dosyalarında, hem başarılı hem de başarısız oturum açmalar ve kimlik doğrulama yöntemleri dahil olmak üzere kimlik doğrulama günlüklerini depolar. Ancak, biz merkezi olarak auditd üzerinden, kimlik erişim ve sudo komutu loglarına bakacağız.
Linux üzerinde, eğer bir dosya anlık olarak değişiyor ise özelikle log okurken, tail komutunu kullanmak çok faydalı olacaktır. Günlükler, sorunun son bölümünü gösterdiği için tail çok kullanışlı bir araç haline gelmektedir. Sistem üzerinde oturum açmadan önce ilgili dosyamı tail komutu ile bir kenarda açıyorum.
tail -f /var/log/auth.log

Şimdi putty vb. bir araçtan sistem üzerinde oturum açıyorum. Görseldeki gibi from kısmında hangi ip üzerinden bağlantı yapıldığını görebilirsiniz. Bu kısımda hatalı giriş loglarını da aynı şekilde alabilirsiniz.
Oturum açma yeşil, oturum kapatma işlemi sarı olarak işaretlenmiştir.

Bu görselde ile GUI tabanlı üzerinden oturum açılmış log çıktıları gözükmektedir. Uzaktan bağlantı sağlanmadığı için herhangi bir ip bilgisi vermemektedir.

sudo logları
Bilgisayarınızı başkalarıyla paylaşırken ve onlara sudo erişimi verdiyseniz, onu nasıl kullandıklarını izlemek akıllıca olur. Neyse ki, sudo geçmişini kontrol etmek kolaydır. Bu listede, sudo kullanarak kimin ve ne zaman hangi komutu verdiğini kontrol edebilirsiniz. Şimdi, nasıl olduğunu görelim.
İlk olarak, tail komutu ile audidt dosyasını anlık olarak takip edelim.
sudo tail -f /var/log/audit/audit.log
Kullanıcının sudo yetkisi ile başarılı olduğu log bilgilerini almaya çalışalım.
sudo fdisk -l

Kullanıcının sudo yetkisi olmadığı halde, komutları sudo ile çalıştırdığındaki log bilgilerini almaya çalışalım.

Normal bir kullanıcıyı, sudo grubuna aldığınızda aşağıdaki gibi günlük kayıtları göreceksiniz.
Kullanıcı, yetkisi olmadığı halede sudo su komutu ile root kullancısına geçmeye çalışacağı zaman aşağıdaki gibi bir hata logları üretilecektir.
STEP3 | Shell Komut Geçmiş Logları
Terminal ekranında yazılan komut geçmişi kolay bir şekilde silinebilir. Genelde bir sistem saldırıya uğradığı zaman komut geçmişinin bir kopyası alınması ve ardından silinmesidir. Sistemin güvenliğini içeriden ve dışarıdan korumak için, bizim tüm kullanıcılardan shell üzerinde çalıştırılan komut loglarını almamız gerekmektedir. Aşağıdaki alınacak komut geçmişi sadece bash için geçerlidir.
Bu işlem sonucunda Linux kaynağınızda aşağıdaki hareketleri takip ediyor olacaksınız.
- Bash Kabuğu Komut Girdisi ( Session History)
- Komut çalıştıran Kişinin Kullanıcı Adı ( Session History )
- Komut çalıştıran Kişinin Kaynak İp'si ( Session History )
- Komut çalıştıran Kişinin Hangi path üzerinde işlem yaptığı ( Session History )
- Komut çalıştıran Kaynağın ismi ( Session History )
Bash üzerindeki komut girdilerini almak için, Bash.bashrc yapılandırma dosyasına özel hazırladığımız komutlar eklenmelidir. Editor ile bash.bashrc dosyasını açalım ve son satırına aşağıdaki özel komutları ekleyelim.
sudo vi /etc/bash.bashrc
Dahil edilen özel komutlar sayesinde, tüm kullanıcıların komut girdilerini tek yerde toplayabileceğiz.
distro=`cat /etc/os-release | grep -oP 'PRETTY_NAME="\K[^"]+'`
function history_to_syslog
{
EVENTSOURCE_IP=`hostname -I | awk '{print $1}'`
IP=`who am i |awk '{match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/); ip = substr($0,RSTART,RLENGTH); print ip'}`
CMD=$(history 1)
CMD=$(echo $CMD |awk '{print substr($0,length($1)+2)}')
DIR=$(pwd)
USER=$(echo $USER)
if [ "$CMD" != "$OLD_CMD" ]; then
logger -p local6.debug -- SESSIONHISTORY = $$, USER = $USER, OS= $distro, EVENTSOURCEIP= $EVENTSOURCE_IP, PWD = $DIR, CMD = "${CMD}", IP = ${IP}
fi
OLD_CMD=$CMD
}
trap history_to_syslog DEBUG || EXIT

Dosyayı, kayıt edip çıkınız.
:wq!
Oturum geçmişini, lokalde veya merkez syslog sunucusunda toplamak için, yapılandırma dosyası oluşturalım.
sudo vi /etc/rsyslog.d/session_history.conf
Yapılandırma dosyasına aşağıdaki komut satırlarını ekleyelim. Satır satır ne olduklarına bakalım.
- satırda ki local6 ile başlayan path local üzerine yazmanızı sağlar.
- satır biriktirme dosyaları için benzersiz ad öneki ekler.
- satır 1 gb alan sınırı belirler.
- satır kapatma sırasında mesajları diske kaydeder.
- satır eş zamansız olarak çalıştırır.
- satır ana bilgisayar kapalıysa sonsuz yeniden deneme sayısı.
- ve son satır, syslog veya siem sunucunuzun ip adresinizi yazmanız içindir.
Local üzerinde tutacağım için, ilk satır hariç diğerlerini # sembolü koyarak yorum satırı haline getiriyorum.
local6.* /var/log/bash_history.log
#$ActionQueueFileName fwdRule1
#$ActionQueueMaxDiskSpace 1g
#$ActionQueueSaveOnShutdown on
#$ActionQueueType LinkedList
#$ActionResumeRetryCount -1
#local5.*;local6.* @192.168.1.70:514

Dosyayı kayıt edip çıkınız.
:wq!
Değişikliklerin geçerli olması için source komutu ile bash yapılandırma dosyamızın içeriğini okutalım.
source /etc/bash.bashrc
rysylog servisini yeniden başlatarak işlemi tamamlıyoruz.
sudo service restart rsyslog
Oturum geçmişinin tutulacağı dosyanın oluştuğunu kontrol edelim.
ls /var/log/b*

Evet artık yaptığımız işlemleri ne kadar başarılı olduğunu test edebiliriz. tail komutunu kullanarak oluşturduğumu dosyayı anlık olarak izleyelim.
tail -f /var/log/bash_history.log
Dosyayı açtığımız anda, çalıştırdığımız ilk komut satırının logunu aldığını görebiliriz. Bir kaç komut çalıştırıyorum ve sonucun başarılı olduğunu görebiliyorum.
hostname
hostname -I

Sonuç olarak bash üzerinde komut geçmişlerini alabildik ve bunları istersek bir merkezi syslog sunucusuna gönderebiliriz.
Girdi geçmişleri sadace bash üzerinden alındığını unutmayın. sh, zsh vb. kabuklarda çalıştırdığınız komut girdileri, bu log dosyasına işlenmez.

Paket Yönetici Logları (APT,YUM)
GNU/Linux sisteminizde yeni paketler yüklemek veya rutin yükseltmeleri çalıştırmak için apt,yum,apk,dnf vb. komutunu kullandığınızda, etkinliklerinizle ilgili bilgilerin nereye kaydedildiğini merak edebilirsiniz. Bash kullanıyorsanız, geçmiş dosyanız muhtemelen kullandığınız komutlarla ilgili bilgileri tutar, ancak ~/.bash_history gibi geçmiş dosyaları $HISTSIZE ayarınıza bağlı olarak yalnızca çalıştırdığınız en son komutları tutar ve genellikle tarihler ve zamanları içermez. Bu yüzden çoğu dağıtımda, /var/log/ dizini altında paket yöneticileri hakkında “apt,dnf vb.” daha çok bilgi bulabilirsiniz. Şimdi ubuntu için inceleme yapalım.
/var/log/apt dizini bir dizi günlük dosyası içerir. history.log dosyası ve ayrıca dosyanın history.log.1.gz, history.log.2.gz vb. adlı bir dizi eski sürümü içerir. Bu günlüklerin her biri, belirli bir zaman diliminde çalıştırılan uygun komutlarla ilgili bilgileri içerecektir.
sudo ls -l /var/log/apt*

Gördüğünüz gibi, bu günlük dosyaları küçüktür ve dosyanın birkaç nesli korunur. Geçerli günlük hariç tümü, disk alanından tasarruf etmek için gzip'lenir. Dosya tarihleri, bu örnek sistemde günlüklerin yaklaşık olarak ayda bir kez devredildiğini göstermektedir.
Peki biz paket yöneticilerden hangi logları alabiliriz.
- Paket Listesi Değiştirme
- Paket Listesi Güncelleme
- Paket Yükleme
- Paket Silme
- Paket Yükseltme
- Katılımsız Yükseltme
- Paket Maskeleme
- rollback'ten
Paket yükleme silme güncelleme, paket listesi.maskeleme
apt paket listesinde işlem yapıldığını görmek için aşağıdaki komut eklenmesi gere…
-w /etc/apt/sources.list -p wa -k apt-list2
servisi yeniden başlatalım.
Sistem Logları
Syslog, linux işletim sistemimizde neler olduğunu anlamak için sistem oturum açma, uyarı, durum, hata ve raporların kayıtlarının tutulduğu bir sistemdir. Bu şekilde özellikle sistem yöneticileri için önemlidir. Syslog sistem hatalarını, saldırıları veya işletim sistemi sorunlarını kaydeder. Bu gibi durumları tespit etmek için SysLog kayıtlarının geriye dönük olarak incelenmesi yeterlidir.
Klasik linux sistemlerinde bu kayıtlar /etc/syslog.conf olarak ayarlanabilir. Ancak modern Linux sistemlerinde rsyslogd hizmeti, SysLog’a yeni işlevler eklenerek geliştirilir. Klasik bir Linux sisteminde, günlük kayıtları /var/log dizininde saklanır. Bu dizin önemli bir dizindir ve günlük kayıtları syslog aracılığıyla paylaşılır.
CentOS veya Rhel gibi Redhat tabanlı sistemlere yönelik etkinliklerin messages dosyasında, Ubuntu ve diğer Debian tabanlı sistemler ise Syslog dosyasında depolandığını unutmayın.
Şimdi syslog ile örnek olarak, servis, swap gibi logları almaya çalışalım.
Kernel Logları
Takılan Aygıt Loglarına bakalım.