Logwatch ile Otomatik Log Raporu Oluşturma

Sunucularınızda her gece neler olduğunu biliyor musunuz? Kaç başarısız SSH denemesi yapıldı, hangi servisler hata verdi, disk kullanımı kritik seviyeye ulaştı mı? Çoğu sysadmin bu soruların cevabını ancak bir şeyler ters gittiğinde aramaya başlar. Logwatch tam da bu noktada devreye giriyor: sistem loglarını otomatik olarak analiz edip anlamlı özetler çıkaran, her sabah kahvenizi içerken okuyabileceğiniz raporlar hazırlayan bir araç.

Logwatch Nedir ve Neden Kullanmalısınız?

Logwatch, Perl ile yazılmış, sistem log dosyalarını düzenli aralıklarla analiz eden ve özetleyen açık kaynaklı bir araçtır. Varsayılan olarak /var/log altındaki logları işler ve bunları okunabilir bir formatta size sunar. E-posta ile gönderebilir, dosyaya yazabilir ya da terminal çıktısı olarak alabilirsiniz.

Neden Logwatch kullanmalısınız sorusunun cevabı aslında çok basit: ham log dosyalarını okumak zaman alır ve çoğu zaman önemli şeyleri gözden kaçırırsınız. Bir /var/log/auth.log dosyası saatte binlerce satır üretebilir. Bunu manuel okumak yerine, Logwatch size “Bu gece 1.2.3.4 IP adresinden 847 başarısız SSH denemesi yapıldı” şeklinde özetlenmiş bir rapor sunar.

Gerçek dünya senaryosu olarak şunu düşünün: 50 sunucuyu yöneten bir ekipte çalışıyorsunuz. Her sabah her sunucunun loglarını kontrol etmek saatler alır. Logwatch ile her sunucu sabah 06:00’da otomatik rapor üretir ve bunlar merkezi bir e-posta adresine gelir. Siz tek bir inbox üzerinden tüm filonun durumunu 15-20 dakikada değerlendirirsiniz.

Kurulum

Logwatch hemen hemen tüm büyük Linux dağıtımlarının paket depolarında bulunur.

Debian/Ubuntu tabanlı sistemler için:

sudo apt update
sudo apt install logwatch -y

RHEL/CentOS/AlmaLinux/Rocky Linux için:

sudo dnf install logwatch -y
# ya da eski sistemlerde
sudo yum install logwatch -y

Fedora için:

sudo dnf install logwatch -y

Kurulum tamamlandıktan sonra Logwatch’ın dosya yapısına bakalım:

ls -la /usr/share/logwatch/
# dist.conf/  -> Dağıtıma özgü varsayılan ayarlar
# default.conf/ -> Logwatch'ın kendi varsayılan ayarları
# scripts/ -> Log işleme scriptleri
# lib/ -> Kütüphane dosyaları

ls -la /etc/logwatch/
# conf/ -> Kullanıcı tanımlı konfigürasyon
# scripts/ -> Özel scriptler

Burada önemli bir nokta var: /usr/share/logwatch/ altındaki dosyaları asla doğrudan düzenlemeyin. Tüm özelleştirmelerinizi /etc/logwatch/conf/ altında yapın. Paket güncellemelerinde değişiklikleriniz korunur.

Temel Konfigürasyon

Ana konfigürasyon dosyası /usr/share/logwatch/default.conf/logwatch.conf adresinde bulunur. Bunu kopyalayarak kendi ayarlarımızı oluşturalım:

sudo cp /usr/share/logwatch/default.conf/logwatch.conf /etc/logwatch/conf/logwatch.conf
sudo nano /etc/logwatch/conf/logwatch.conf

Dosyanın içinde dikkat etmeniz gereken kritik parametreler:

  • LogDir: Log dosyalarının bulunduğu dizin, genellikle /var/log
  • TmpDir: Geçici dosyalar için dizin, genellikle /var/cache/logwatch
  • Output: Çıktı formatı (mail, stdout, file)
  • Format: Rapor formatı (text, html)
  • Encode: E-posta encoding (none, base64)
  • MailTo: Raporun gönderileceği e-posta adresi
  • MailFrom: Gönderici e-posta adresi
  • Range: Hangi zaman aralığının analiz edileceği (yesterday, today, all)
  • Detail: Rapor detay seviyesi (Low, Med, High ya da 0-10 arası sayı)
  • Service: Hangi servislerin raporlanacağı
  • mailer: E-posta gönderme komutu

Örnek bir konfigürasyon dosyası:

# /etc/logwatch/conf/logwatch.conf

LogDir = /var/log
TmpDir = /var/cache/logwatch
Output = mail
Format = html
Encode = none
MailTo = [email protected]
MailFrom = [email protected]
Range = yesterday
Detail = Med
Service = All
mailer = "/usr/sbin/sendmail -t"

İlk Manuel Çalıştırma

Kurulumu test etmek için Logwatch’ı manuel olarak çalıştıralım:

# Basit bir test - terminal çıktısı
sudo logwatch --output stdout --detail low --range today

# Daha detaylı test
sudo logwatch --output stdout --detail high --range yesterday --format text

# Sadece belirli servisleri kontrol etmek
sudo logwatch --output stdout --service sshd --service sudo --range today

İlk çalıştırmada çıktının nasıl göründüğünü inceleyin. SSH bölümünde başarısız oturum açma denemelerini, sudo bölümünde yetkisiz erişim girişimlerini göreceksiniz.

Servis Bazlı Konfigürasyon

Logwatch her servis için ayrı konfigürasyon dosyaları kullanır. Bunlar /usr/share/logwatch/default.conf/services/ altında bulunur. Özelleştirmek için /etc/logwatch/conf/services/ dizinine kopyalayın.

SSH konfigürasyonunu özelleştirme:

# Önce servis listesine bakalım
ls /usr/share/logwatch/default.conf/services/ | head -20

# SSH konfigürasyonunu kopyalayalım
sudo mkdir -p /etc/logwatch/conf/services/
sudo cp /usr/share/logwatch/default.conf/services/sshd.conf /etc/logwatch/conf/services/sshd.conf
sudo nano /etc/logwatch/conf/services/sshd.conf

SSH konfigürasyonunda $ignore_missing_users = 1 gibi parametrelerle rapor içeriğini şekillendirebilirsiniz. Hangi kullanıcı adı denemelerinin raporlanacağını, hangi IP aralıklarının göz ardı edileceğini buradan kontrol edebilirsiniz.

Otomatik E-posta Raporları Ayarlama

Logwatch kurulumla birlikte genellikle bir cron job oluşturur. Bunu kontrol edelim:

# Mevcut logwatch cron ayarını kontrol et
cat /etc/cron.daily/00logwatch
# ya da
ls -la /etc/cron.daily/ | grep logwatch

Eğer yoksa ya da özelleştirmek istiyorsanız kendi cron job’ınızı oluşturun:

sudo nano /etc/cron.d/logwatch
# Her sabah 07:00'de rapor gönder
0 7 * * * root /usr/sbin/logwatch --output mail --format html --mailto [email protected] --detail med --range yesterday

# Haftalık özet rapor - Pazartesi sabahı
0 8 * * 1 root /usr/sbin/logwatch --output mail --format html --mailto [email protected] --detail high --range 'between -7 days and today'

Burada dikkat edin: --range 'between -7 days and today' parametresi son 7 günü kapsar. Haftalık toplantılardan önce bu raporu almak ekibinize genel bir bakış sağlar.

Özel Filtreler ve Logfiles

Bazen varsayılan servisler yeterli olmaz. Özel bir uygulama veya servisiniz için Logwatch filtresi yazabilirsiniz. Örneğin Nginx access loglarını analiz edelim:

# Önce custom bir log dosyası tanımı oluşturalım
sudo mkdir -p /etc/logwatch/conf/logfiles/
sudo nano /etc/logwatch/conf/logfiles/nginx.conf
# /etc/logwatch/conf/logfiles/nginx.conf
LogFile = nginx/access.log
LogFile = nginx/error.log
*AppliesTo = nginx
Archive = nginx/access.log.*.gz
Archive = nginx/error.log.*.gz

Şimdi bu log dosyası için bir servis scripti oluşturalım:

sudo mkdir -p /etc/logwatch/scripts/services/
sudo nano /etc/logwatch/scripts/services/nginx
#!/usr/bin/perl
# Basit bir Nginx log analiz scripti

use strict;
use warnings;

my %status_codes;
my %top_ips;
my $total_requests = 0;
my $error_count = 0;

while (defined(my $line = <STDIN>)) {
    chomp $line;
    $total_requests++;
    
    # HTTP status code'u yakala
    if ($line =~ /"s+(d{3})s+/) {
        $status_codes{$1}++;
        if ($1 >= 400) {
            $error_count++;
        }
    }
    
    # IP adresini yakala
    if ($line =~ /^(d+.d+.d+.d+)/) {
        $top_ips{$1}++;
    }
}

print "Toplam İstek: $total_requestsn";
print "Hatalı İstek (4xx/5xx): $error_countnn";

print "HTTP Durum Kodları:n";
foreach my $code (sort keys %status_codes) {
    print "  $code: $status_codes{$code}n";
}

print "nEn Çok İstek Atan IP'ler (Top 5):n";
my $count = 0;
foreach my $ip (sort { $top_ips{$b} <=> $top_ips{$a} } keys %top_ips) {
    last if $count >= 5;
    print "  $ip: $top_ips{$ip} istekn";
    $count++;
}
sudo chmod +x /etc/logwatch/scripts/services/nginx

Çoklu Sunucu Senaryosu

50 sunucudan bahsetmiştik. Gerçek bir kurumsal ortamda logları merkezi bir noktada toplamak ve oradan Logwatch çalıştırmak mantıklıdır. Bunun için iki yaklaşım var:

Yaklaşım 1: Her sunucuda Logwatch, merkezi e-posta:

Her sunucuda ayrı Logwatch konfigürasyonu, hepsi aynı e-posta adresine rapor gönderir. E-postanın konusu sunucu adını içerir, böylece inbox’ınızda kolayca filtreyebilirsiniz.

# /etc/logwatch/conf/logwatch.conf içinde
MailTo = [email protected]
MailFrom = logwatch@$(hostname -f)

Yaklaşım 2: Logları merkeze çek, tek noktadan analiz:

# Merkezi log sunucusunda çalışacak script
sudo nano /usr/local/bin/central-logwatch.sh
#!/bin/bash
# Merkezi Logwatch raporu oluşturma scripti

SERVERS=("web01" "web02" "db01" "db02" "proxy01")
REPORT_DIR="/var/reports/logwatch/$(date +%Y-%m-%d)"
MAIL_TO="[email protected]"

mkdir -p "$REPORT_DIR"

for server in "${SERVERS[@]}"; do
    echo "[$server] Rapor alınıyor..."
    
    # Uzak sunucudan log raporu al
    ssh -o ConnectTimeout=10 -o StrictHostKeyChecking=no 
        logwatch-user@"$server" 
        "sudo logwatch --output stdout --format text --detail med --range yesterday" 
        > "$REPORT_DIR/${server}-report.txt" 2>&1
    
    if [ $? -ne 0 ]; then
        echo "HATA: $server sunucusuna ulaşılamadı" >> "$REPORT_DIR/errors.txt"
    fi
done

# Tüm raporları birleştir ve gönder
echo "To: $MAIL_TO" > /tmp/combined-report.txt
echo "Subject: Günlük Log Raporu - $(date +%Y-%m-%d)" >> /tmp/combined-report.txt
echo "" >> /tmp/combined-report.txt

for server in "${SERVERS[@]}"; do
    echo "========================================" >> /tmp/combined-report.txt
    echo "SUNUCU: $server" >> /tmp/combined-report.txt
    echo "========================================" >> /tmp/combined-report.txt
    cat "$REPORT_DIR/${server}-report.txt" >> /tmp/combined-report.txt
    echo "" >> /tmp/combined-report.txt
done

# Hata varsa ekle
if [ -f "$REPORT_DIR/errors.txt" ]; then
    echo "BAĞLANTI HATALARI:" >> /tmp/combined-report.txt
    cat "$REPORT_DIR/errors.txt" >> /tmp/combined-report.txt
fi

sendmail -t < /tmp/combined-report.txt
echo "Raporlar $REPORT_DIR dizininde kaydedildi."
sudo chmod +x /usr/local/bin/central-logwatch.sh
echo "0 7 * * * root /usr/local/bin/central-logwatch.sh" | sudo tee /etc/cron.d/central-logwatch

Güvenlik Odaklı Rapor Konfigürasyonu

Siber güvenlik perspektifinden Logwatch’ı optimize etmek için hangi servislere odaklanmalısınız:

  • sshd: SSH brute force denemeleri ve başarılı girişler
  • sudo: Yetkisiz yetki yükseltme girişimleri
  • pam: Pluggable Authentication Module olayları
  • postfix/sendmail: Spam ve mail relay denemeleri
  • iptables: Firewall log’ları ve engellenen bağlantılar
  • fail2ban: Otomatik engellemeler ve tetikleyiciler
  • audit: Linux audit daemon olayları
  • cron: Planlanmamış cron aktiviteleri

Güvenlik odaklı konfigürasyon:

# /etc/logwatch/conf/logwatch.conf - Güvenlik versiyonu
Output = mail
Format = html
MailTo = [email protected]
Range = yesterday
Detail = High
Service = sshd
Service = sudo
Service = pam_unix
Service = iptables
Service = fail2ban
Service = audit
Service = cron

Bu konfigürasyonla sadece güvenlikle ilgili logları içeren, yüksek detaylı bir rapor alırsınız. Genel sistem raporunu ayrı bir konfigürasyonla düşük detayla ayrı bir ekibe gönderin.

Çıktı Formatını Özelleştirme

HTML formatı e-posta istemcilerinde daha okunabilirdir ancak bazen düz metin tercih edilir. Slack veya Teams entegrasyonu için:

sudo nano /usr/local/bin/logwatch-to-slack.sh
#!/bin/bash
# Logwatch raporunu Slack'e gönder

SLACK_WEBHOOK="https://hooks.slack.com/services/XXXXXX/YYYYYYY/ZZZZZZZZ"
HOSTNAME=$(hostname -f)
DATE=$(date +%Y-%m-%d)

# Logwatch raporunu al ve kritik satırları filtrele
REPORT=$(logwatch --output stdout --format text --detail med --range yesterday 2>/dev/null | 
    grep -E "(Failed|Error|Warning|Critical|denied|refused)" | 
    head -50)

if [ -z "$REPORT" ]; then
    REPORT="Kritik olay bulunamadı. Sistem normal gorunuyor."
fi

# Slack'e gönder
curl -s -X POST "$SLACK_WEBHOOK" 
    -H 'Content-type: application/json' 
    --data "{
        "text": "*Günlük Log Özeti - $HOSTNAME ($DATE)*",
        "attachments": [{
            "color": "warning",
            "text": "```$REPORT```"
        }]
    }"

echo "Slack bildirimi gönderildi."
sudo chmod +x /usr/local/bin/logwatch-to-slack.sh
echo "0 8 * * * root /usr/local/bin/logwatch-to-slack.sh" | sudo tee /etc/cron.d/logwatch-slack

Sorun Giderme

Logwatch çalışmıyor mu? Kontrol sırası şöyle olmalı:

# Manuel çalıştır ve hata çıktısını gör
sudo logwatch --output stdout --detail high --range today 2>&1 | head -100

# Log dosyalarının okunabilir olduğunu kontrol et
ls -la /var/log/auth.log
ls -la /var/log/syslog

# sendmail ya da postfix çalışıyor mu?
sudo systemctl status postfix
# ya da
sudo systemctl status sendmail

# Test maili gönder
echo "Test" | mail -s "Logwatch Test" [email protected]

# Logwatch cache temizle
sudo rm -rf /var/cache/logwatch/*
sudo logwatch --output stdout --detail med --range today

Sık karşılaşılan bir sorun: “No output was generated” hatası. Bu genellikle Range parametresinin yanlış ayarlanmasından kaynaklanır. yesterday yerine today deneyin ya da log dosyalarının gerçekten o tarihte veri içerip içermediğini kontrol edin.

Bir diğer yaygın sorun e-posta gönderim problemidir. Sunucunuzda mail transfer agent (MTA) kurulu ve çalışıyor olmalı. Basit bir test için:

# Postfix durumu
sudo postfix status

# Mail kuyruğunu kontrol et
sudo mailq

# Son mail logları
sudo tail -50 /var/log/mail.log

Logrotate ile Entegrasyon

Logwatch, logrotate ile birlikte çalışır. Logrotate’in logları sıkıştırmadan önce Logwatch’ın onları işlediğinden emin olun. Cron job sıralaması önemlidir:

  • /etc/cron.daily/ altındaki dosyalar alfabetik sırayla çalışır
  • 00logwatch dosyası logrotate‘den önce çalışmalı
  • Bu yüzden 00logwatch adlandırması önemlidir
# Cron sıralamasını kontrol et
ls -la /etc/cron.daily/
# 00logwatch -> önce çalışır
# logrotate -> sonra çalışır, bu doğru sıra

Sonuç

Logwatch, öğrenmesi 30 dakika, kurması 15 dakika süren ama size günde saatler kazandıran bir araçtır. Küçük bir ekipte ya da büyük bir kurumsal ortamda çalışıyor olun, otomatik log analizi artık bir lüks değil zorunluluktur.

Başlangıç için tavsiyem şu olur: Önce tek bir kritik sunucuya kurun, bir hafta boyunca gelen raporları okuyun ve size ne söylediğini anlayın. Ardından detay seviyesini ve servisleri ihtiyacınıza göre ayarlayın. Sonra diğer sunuculara yaygınlaştırın.

Logwatch tek başına yeterli değildir elbette. Fail2ban ile brute force koruması, AIDE ile dosya bütünlüğü kontrolü ve Auditd ile sistem çağrılarının izlenmesi birlikte kullanıldığında gerçek anlamda proaktif bir güvenlik izleme altyapısı oluşturursunuz. Logwatch bu zincirin “raporlama ve özetleme” halkasını tamamlar.

Logları okumak can sıkıcı bir iş gibi görünebilir. Ama bir güvenlik olayını 3 gün sonra değil 12 saat içinde fark etmek, çoğu zaman felaketi ile küçük bir sorunun arasındaki farkı oluşturur. Logwatch size bu fırsatı verir.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir