Splunk Üzerinde Log Kesintilerini Tespit Etmek. SIEM sistemlerinde en çok ihtiyaç duyulan ya da sistemin sağlıklı çalıştığından emin olunmak istenen konulardan biri log kesintilerini tespit edebilmektir. Bu konu neredeyse bütün SIEM değerlendirme kriterlerinde haklı olarak bulunmaktadır.
Log kesintisini tespit etmek konu başlığı altında birçok alt madde barındırmaktadır. Örnek olarak;
- Bir sistemin hiç log göndermiyor olması
- Bir sistemin sadece bazı logları göndermiyor olması
- Logların geliyor ancak gecikmeli olması
Splunk üzerinde basit bir sorgulama ile bu durumlar tespit edilebilir ve alarm oluşturulabilir.
Splunk sorgulamaları SPL (Search Processing Language) adı verilen kendine özgü bir dil ile yapılmaktadır. Çok geniş içeriğe sahip olan SPL ile ihtiyaçların karşılanmasının birden fazla yöntemi bulunmaktadır. Bu yöntemler sorgunun basitliği, cevap dönme süresi gibi farklılıklara sahip olabilir. Bu yazıda çok fazla kaynaktan log toplanıyor olması ihtimali nedeniyle en performanslı ve kısa bir sorgu örneğini paylaşacağım. Performansa en çok pozitif etki eden etken az bilinen tstats komutu ile gizli bir alan olan _indextime alanını kullanmamız olacaktır.
Öncelikle loglardaki zaman bilgisi hakkında bilgi vermek istiyorum. Splunk her bir logu indekslerken iki adet zaman bilgisi kaydeder. Bu bilgiler _time ve _indextime alanlarında bulunur.
- _time alanı logun içerisinde geçen zaman bilgisini içerir. Eğer log içerisinde bir zaman bilgisi yok ise Splunk Indexer’in zaman bilgisi kaydedilir.
- _indextime alanı ise logun zaman bilgisinden bağımsız olarak Splunk Indexer’in bu logu alıp kaydettiği (indekslediği) zaman bilgisini kaydeder.
Biz bu çalışmada _indextime alanını kullanacağız. Bunun nedeni logların gecikmeli geliyor olması durumunu kesinti olarak tanımlamamaktır.
Splunk’ın her log için kesinlikle kaydettiği host alanını da sistemi belirlemek için kullanacağız.
Bir sistemin log kesintisini tespit etmek için yapacağımız işlemler;
- Her host için en son indekslenen verinin zamanını bulacağız
- Bu zamanın bizim belirleyeceğimiz süreden daha eski olup olmadığını kontrol edeceğiz
- En son gelen log, bu belirlediğimiz zamandan daha eski ise listeleyeceğiz.
Kullanacağımız SPL sorgusu aşağıdaki şekildedir :
| tstats latest(_indextime) as latest where index=* earliest=-24h by host
| eval delay = now() -latest
| where delay > 900
| eval delay=tostring(delay, “duration”)
| fields -latest
Sonuç olarak aşağıdaki şekilde bir sonuç aldık. “test_host” isimli sistem 16 dakika 23 saniyedir log göndermiyor.
Resim-1
Şimdi kullandığımız SPL’i adım adım açıklayalım;
| tstats latest(_indextime) as latest where index=* earliest=-24h by host
tstats komutu Splunk’ın indekslenmiş alanlardan hızlı sorgulamamızı sağlayan komutdur.
Bu komut ile bütün indexlerde (index=* ) en son indekslenen logun indekslenme zamanını ( latest(_indextime) as latest ) host bazında listeleyecektir.
Aramayı son 24 saat’te gelen bütün loglarda yapacağımızı earliest=-24h parametresi ile veriyoruz. Bu komut çıktısında latest alanında epoch formatında en son loglanan zaman bilgisini elde ettik.
| eval delay = now() -latest
now() fonksiyonu bize sorgu anındaki zaman bilgisini epoch formatında verecektir. Şimdi, bu değer ile latest alanındaki zaman bilgisinin farkını alarak en son gelen logun kaç saniye önce geldiğini eval komutu ile hesaplıyoruz.
| where delay > 900
Hesapladığımız gecikme süresini saniye olarak belirlediğimiz maksimum gecikme süresi ile karşılaştırıp, bu değerden büyük olanları filtreliyoruz. Bu örnekte 15 dakika karşılığı olarak 900 saniye olarak kullandım.
| eval delay=tostring(delay, “duration”)
Artık elimizdeki liste (eğer varsa) 15 dakika’dan fazla süredir log göndermeyen hostları içeriyor. Artık çıktıyı okunması/yorumlanması daha kullanışlı olması için saat:dakika:saniye şeklinde görünmesi için formatlıyoruz. Burada yine eval komutunu tostring fonksiyonu ile kullanıyoruz. Sonucu yine delay alanına yazıyoruz.
| fields -latest
Son olarak elimizde ihtiyacımız kalmayan değer olan latest alanını kaldırıyoruz.
Bu sorguyu isterseniz “Save as Alert“ seçeneğini kullanarak alarm haline getirerek, düzenli aralıklar ile çalıştırılmasını ve e-posta ya da başka şekilde bilgilendirilmeyi sağlayabilirsiniz.
Umarım açıklamalar ve sorgu sizlere faydalı olmuştur.
Sorguda kullandığımız komutlar ve fonksiyonlar için aşağıdaki linklerden detaylı bilgi edinebilirsiniz.
Bu konuyla ilgili sorularınızı alt kısımda bulunan yorumlar alanını kullanarak sorabilirsiniz.
Referanslar
tstats
https://docs.splunk.com/Documentation/Splunk/8.2.3/SearchReference/Tstats
eval
https://docs.splunk.com/Documentation/Splunk/8.2.3/SearchReference/Eval
where
https://docs.splunk.com/Documentation/Splunk/8.2.3/SearchReference/Where
fields
https://docs.splunk.com/Documentation/Splunk/latest/SearchReference/Fields