Rsyslog ve Universal Forwarder Kullanılarak Splunk’a Log Aktarımı

05.06.2021

Atakan Öztuna

Syslog, Linux ve Unix işletim sistemleriniz üzerinde neler olup bittiğini öğrenmek ve geçmişe dönük sistem ile alakalı kullanıcı erişimleri, hatalar, uyarılar ve performans indikatörlerine ilişkin kayıtların tutulduğu sistemdir.

server

Bu yazımda, Linux işletim sisteminde loglama mekanizmasını temsil eden syslog ve sisteme kaydedilen bu syslog verilerinin Splunk tarafından “best practice” olarak toplanması konularından bahsedeceğim.

Syslog, Linux ve Unix işletim sistemleriniz üzerinde neler olup bittiğini öğrenmek ve geçmişe dönük sistem ile alakalı kullanıcı erişimleri, hatalar, uyarılar ve performans indikatörlerine ilişkin kayıtların tutulduğu sistemdir. Dolayısıyla sistem yöneticileri için, sorumlu oldukları sistemleri izleme ve kontrol etme anlamında hayati bir öneme sahiptir. Syslog sayesinde, sisteminiz üzerinde gerçekleşen anormallikler, sistem hatalar ve kaynak kullanımı gibi bilgilere erişilebilir.

Konu, syslog verilerini Splunk’a aktarmak olduğunda ise karşımıza birçok seçenek çıkıyor. Bu seçenekler arasında, ara katman olarak görev yapacak bir sunucu üzerinde syslog yazılımı kurmak en mantıklı çözüm olarak duruyor. Böylelikle farklı cihazlardan gönderilecek olan syslog verileri tek bir merkezde toplanabilecek ve Universal Forwarder aracılığıyla Splunk’a kolaylıkla aktarılabilecek. Peki, bu yöntem bize ne gibi avantajları beraberinde getirecek? Şöyle sayabiliriz:

  • Splunk, gelen syslog mesajlarını herhangi bir port bağlantı noktasından (UDP veya TCP) dinleyebilir. Bu yöntemi kullanmak konfigürasyon aşamasında kullanıcıya kolaylık sağlıyor olsa da “splunkd” işleminin durması halinde, kesinti sırasında gönderilen tüm syslog mesajları kaybolur. Splunk syslog verilerini ayrı bir sunucuda tutarak bu riski ortadan kaldırır.
  • Farklı cihazlardan gelen log’ları merkezi bir syslog sunucunda toplamak, log kaynaklarındaki depolama alanlarını daha etkin bir şekilde yönetebilmenize olanak sağlar.
  • Log’larınızı kontrol etmek için her makineye erişmek yerine, kullanıcıya merkezi bir platform sunar.
  • Merkezi bir syslog sunucu üzerinde kurulacak olan Splunk Universal Forwarder sayesinde,” load-balancing” yapabilme kabiliyetine sahiptir.
  • Syslog verileri Splunk’a şifrelenerek aktarılır.
  • Universal Forwarder, sahip olduğu “indexer acknowledgments” özelliği sayesinde, indexer’dan gelecek olan onay cevabını alana kadar veri bloklarını “queue”da tutmaya devam eder, böylelikle kullanıcı herhangi bir veri kaybına maruz kalmaz.

RSYSLOG KURULUMU VE YAPILANDIRMASI

Çoğu Linux dağıtımında rsyslog paketi yüklenmiş olarak gelir. Yüklenmemiş olması durumunda, Linux paket yöneticisi aracını aşağıda gösterildiği gibi kurabilirsiniz.

$ sudo yum install rsyslog
$ apt install rsyslog

Rsyslog kurulumunu gerçekleştirdikten sonra, sunucunun boot olduğu zamanlarda rsyslog servisinin otomatik olarak başlayabilmesi için systemctl komutu kullanarak ayarlıyoruz.

$ sudo systemctl start rsyslog
$ sudo systemctl enable rsyslog
$ sudo systemctl status rsyslog

Rsyslog sunucusunu yapılandırmak için /etc/rsyslog.conf dosyası üzerinde aşağıdaki değişiklikleri yapıyoruz.

Rsyslog’u, merkezi bir günlük sunucu olarak yapılandırmak için, uzaktaki sunuculardan syslog alımı için kullanacağı protokollerini (UDP veya TCP veya her ikisi) rsyslog.conf dosyası üzerinden tanımlamamız gerekiyor.

Syslog alımı için UDP portunu kullanabilirsiniz. UDP protokolü kullanılarak veri transferi daha hızlı gerçekleştirilir. Ancak bununla beraber, doğası gereği TCP protokolünde kullanılan handshake özelliğini taşımaması sebebiyle paketlerin hedef sisteme ulaşıp ulaşmadığı kontrol edilemez.

// Provides UDP syslog reception
$ ModLoad imudp
$ UDPServerRun 514

TCP protokolü ise UDP protokolüne göre daha yavaştır, ama daha stabil bir bağlantı sağlar.

// Provides TCP syslog reception
$ ModLoad imtcp
$ InputTCPServerRun 514

Bir sonraki aşamada, uzaktaki makinelerden toplanan logların hangi dizin ve dosya altında toplanacağını belirleyeceğimiz parametreleri yukarıdaki tanımlamalardan sonra gelecek şekilde tanımlayacağız. 

Aşağıdaki şekilde tanımlanan kuralda “template” parametresi ile uzaktaki sunuculardan gelen log’ların “var/log” dizinin altında, client makinenin host ismi bilgisini baz alarak yıl,ay,gün formatında olacak şekilde dosyalara yazılmasını rsyslog programına söylüyoruz. Bu format, kullanıcının log’ları ilgili dizinde hangi formatta görüntülemek istediğine göre değişiklik gösterebilir.

$ template Server1, “var/log/syslog/%HOSTNAME%/%$YEAR%-%$MONTH%-%$day%.log”

Eğer, sadece belirli IP adreslerinden gelen syslog paketlerini kabul etmek istiyorsak yukarıda belirtilen konfigürasyona ek olarak aşağıdaki parametreler girilebilir. Bu tanımlamada, sadece belirtilen IP adreslerinden gelen logları kabul ederek, bir çeşit IP bazlı bir filtreleme uygulamış oluyoruz.

Satırın sonunda yer alan “?Server1” parametresi belirtilen IP adreslerinden gelen log’ların “Server1” yapılandırma şablonuna göre işlenmesi gerektiğini rsyslog’a söyler.

“&stop” parametresi ise rsyslog’a, log’ların dosyaya yazıldıktan sonra mesajları işlemeyi durdurmasını söyler. Aksi takdirde, gelen log’lar local’de bulunan dosyalara yazılacaktır.

if ($fromhost-ip == ‘x.x.x.x’ or $fromhost-ip == ‘y.y.y.y’) then ?Server1
& stop

Rsyslog.conf üzerinde yapmış olduğumuz konfigürasyon değişikliklerin ardından rsyslog servisinin restart edilmesi gerekmekte.

$sudo systemctl restart rsyslog

Eğer sisteminizde firewall aktif olarak çalışıyor ise hem UDP hem de TCP bağlantıları için 514 portunu aşağıda gösterildiği gibi açmamız gerekmektedir.

$ sudo firewall-cmd -permanent -add-port=514/udp
$ sudo firewall-cmd -permanent -add-port=514/tcp
$ sudo firewall-cmd –reload

UNIVERSAL FORWARDER YAPILANDIRMASI

Uzaktaki sunuculardan topladığımız log’lar /etc/rsyslog.conf dosyası üzerinde belirtmiş olduğumuz üzere ilgili dizin ve dosyanın altına yazılacaktır. Bu dosyaların içerisinde yer alan log’ları splunk’a aktarmak için ise Universal Forwarder kullanıyor olacağız. Forwarder veri alımı açısından gerek kurulumu gerek kullanımı açısından son derece esnek ve kullanışlıdır. Bu durumda, rsyslog bilgileri bir dizine yazdığından, bu dizinleri izlemek ve bunları uygun dizinlere etiketleyerek göndermek için Splunk UF kullanıyor olacağız.

[monitor///var/log/syslog/server1/*log]
index=syslog
sourcetype=syslog
host_segment=4
disabled=0

* host_segment: “inputs.conf” dosyası içinde belirtilen ilgili dizinin sırası belirtilerek host bilgisini çekmek için kullanılan bir parametredir.

“Inputs.conf” dosyasında gerekli tanımlamalar yapıldıktan sonra Universal Forwarder’ın restart edilmesi gerekir.

/opt/splunkforwarder/bin/splunk restart

LOGROTATE YAPILANDIRMASI

Rsyslog sunucuları, verileri kalıcı olarak depolamaya yönelik değildir. Bizim senaryomuzda, rsyslog sunucusunun, log kaynakları ile Splunk arasında bir önbellek sunucusu olarak görev yapması amaçlanmıştır. Bu sunucunun sınırsız disk alanına sahip olmadığını düşünürsek, sabit diski doldurmamak için ilgili dizinde bulunan log dosyaları üzerinde “log rotation” ve silme işlemlerini uygulamamız gerekiyor. Kurumun belirlemiş olduğu politika doğrultusunda (belirli bir gün sayısından itibaren log’ları silmeye başla) dosyaları temizlemek için cron işi kullanılabilir.

“/etc/cron.daily/logdelete.sh” günlük cron dizini altında bir script içerisine ilgili komut dizisini yazarak log’larınızı silebilirsiniz. Bu örnekte, syslog dizininde beş günden daha eski olan dosyalar otomatik olarak silinecektir.

Find /var/log/syslog -type f -mtime +5 – delete

SONUÇ

Bu yazıda, rsyslog mantığını, yapılandırmasını ve topladığımız log’ları Splunk’a nasıl aktaracağımızı mümkün olduğunca kısa ve net bir şekilde anlatmaya çalıştım. Umarım bu yazıyı yararlı bulmuşsunuzdur.