Merhabalar,
Uzun zamandır makale yazmıyordum bu hafta sonu çok fazla sorulan bir konuda Zabbix Log File Monitoring hakkında küçük bir makale hazırladım. Şimdiden keyifli okumalar.
Log file içerisindeki bir tanıma neden alarm yazmak isteriz öncelikle bunu bir açmak lazım;
Windows veya Linux sistemler üzerlerinde çalışan servis veya process’ler herhangi bir olay veya hata durumlarını mutlaka bir Log dosyasına kaydederler ve bir iz düşümü bırakırlar.
Log dosyasındaki bir hata yada iz düşümü bilgisi bize aslında çok önemli bir durumun gerçekleştiğini veya bilmek istediğimiz bir olayın bilgisini verebilir, bu sebeple herhangi bir log dosyasının içerisindeki bir parametrenin yakalanması durumuna alarm almak isteyebiliriz.
Biz bu olayı daha anlaşılır kılmak adına bir Linux sunucu üzerinde SSH bağlantısı kurulması halinde alarm alarak olayı gerçek hayat senaryosunda kurgulamış olacağız.
Bu yaklaşım izleme ürününü bir Cyber Security veya Loglama ürünü yerine kullanmak anlamına gelmez. Biz olaya tamamen izleme gözü ile bakacağız.
Haydi başlayalım.
Hedef Sunucu: Oracle Linux 8, Zabbix Agent2 Active Mod ile izleniyor.
Öncelikle bu sunucu üzerinde SSH ile bağlantı kurulduğunda bunun nereye log yazdığını bulmamız gerekiyor.
“tail -f /var/log/secure” komutu ile kontrol ettiğimizde yapılan SSH bağlantılarının iz düşümleri burada görüyoruz.
Zabbix Agent ile bu dosya üzerinden bir data okumak istiyorsak permission’lara bakmak gerekiyor. Aşağıdaki gibi /var/log/secure dosyası için sadece root grubu ve user’ı okuma ve yazma hakkına sahip olarak görüntülüyoruz.
Aşağıdaki görsel ve buradaki link bu izinlerin nasıl verildiğini anlatmaktadır.
sudo chgrp zabbix secure
sudo chmod 640 secure
yukarıdaki komutları kullanarak /var/log/ altındaki secure isimli klasöre zabbix grubu için sadece okuma izni verildi.
Şimdi bir Template hazırlama vakti.
Item sekmesine gelerek Create item diyorum ve yeni bir item tanımlıyorum.
Name: SSH Logins
Type: Zabbix agent (active)
Key: log[/var/log/secure,,,skip]
Type of information: Log
Update interval: 1s
Yukarıdaki gibi parametlerimi hazırlıyorum ve item tanımlamamı tamamlıyorum.
Hazırladığım Template’i hedef sunucuma ekliyorum.
Kısa bir süre bekleyerek ve SSH Login Logout olarak Log dosyasında yeni Log’lar oluşmasını sağlıyorum. Aşağıdaki gibi Latest Data ekranında Log’ların geldiğini görüntülüyorum.
CLI ekranında Log dosyasında ne görüyorsam artık Zabbix tarafına bunları çekebildim.
- May 7 00:46:54 zbx-60-db sshd[4442]: Accepted password for root from 192.168.1.15 port 52432 ssh2
- May 7 00:46:54 zbx-60-db sshd[4442]: pam_unix(sshd:session): session opened for user root by (uid=0)
Ben sadece Accepted password yazan satırı almak istiyorum zaten bu satırda SSH bağlantısına ait tüm bilgiler bulunuyor. Bunun için buradaki dokümantasyonda 2. parametre olan <regexp> parametresine direkt olarak yakalamak istediğim parametrenin başlangıcını regex yazım dilinde yazmam gerekiyor.
Key değerimi log[/var/log/secure,”Accepted.*”,,,skip] olacak şekilde güncelliyorum. Bu şu demek oluyor yakaladığım Log değerlerininden sadece başlangıcı “Accepted.*” olan satırı Zabbix’e taşımış olacağız.
Aşağıdaki gibi sadece kırmızı alanı çekmek için bu değişikliği yapmış olduk.
Tekrar SSH Login ve Logout oluyorum ve yeni gelen datalara Latest Data panelinden bakıyorum istediğimiz şekilde düzeldiğini görüyorum.
Gelin şimdi Zabbix’in nimetlerinden faydalanmaya devam edelim ve Preprocessing sekmesinde gelen ham datayı işleyelim.
Gelen datanın başında uzun bir tarih alanı vardı ben bunu da görmek istemiyorum ve bir satırı alıp buradaki sitede onu pars etmek için minik bir Regex komutu yazıyorum. Gelen 1 satırlık data’da sadece Accepted kısmı dahil olacak şekilde sonraki alanı parse ediyorum. (Aşağıdaki yeşil alanı)
Bunu preprocessing alanına ekliyorum ve sonunda \0 yazıyorum.
Aşağıdaki gibi gelen datalar adım adım istediğim şekilde dönüştü ve daha sade bir hal aldı.
Data alma ve preprocessing işlemleri bittiğine göre artık bu item için trigger tanımlayabiliriz. İlgili item’ın üzerine gelip Create trigger diyorum.
Gelen data bir Log datası olması sebebi ile kullanabileceğim Trigger functionlara bakıyorum. Doğru trigger function kullanmazsak item datası doğru olarak gelse bile oluşturacağımız trigger çalışmayacaktır.
Log datasına uygun olan lenght (value) function bunun için uygun görünüyor.
Name: SSH Login has been detected !
Severity: High
Expression: length(last(/Linux Log File Monitoring/log[/var/log/secure,”Accepted.*”,,,skip]))>0
and
nodata(/Linux Log File Monitoring/log[/var/log/secure,”Accepted.*”,,,skip],5m)=0
Description: {ITEM.LASTVALUE1}
Yukarıdaki gibi düzenliyorum. Burada and operatörü ve nodata fonksiyonunu da kullandım; eğer bir SSH Login girişi tespit edilirse alarm alınacak ve 5 dakika boyunca yeni bir data gelmez ise giriş tespiti olmaz ise alarm clear olacak şekilde yapılandırdım. Sizler alarmı Allow Manuel Close seçeneğini seçerek nodata function’u kullanmadan tek bir function ile de tanımlayabilirsiniz. Bu durumda alarm geldiğinde her bir alarm için manuel olarak kapatma yapmanız gerekeceğini unutmayın.
Şimdi alert ekranından alarmımızı kontrol edelim. Problem Name alanının sağ alt kısmındaki minik “?” kısmına {ITEM.LASTVALUE1} trigger değerinden gelen son datayı da gelmiş olarak görüyoruz herşey istediğimiz gibi çalışıyor. Bunu yazmamdaki amaç ihtiyaç halinde Media Type içerisinde de gösterebilmek.
Aradan 5 dakika kadar bir süre geçtiğinde ise alarmın kendiliğinden Resolve olduğunu görüntülüyorum.
Bir makalenin daha sonuna geldik umarım faydalı bir içerik olmuştur.
Elinize sağlık. Çok güzel bir kaynak olmuş. Aynı olayı Windows RDP içinde yapmamız mümkün mü?