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ışır00logwatchdosyasılogrotate‘den önce çalışmalı- Bu yüzden
00logwatchadlandı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.
