Log Saklama Politikası: Yasal Gereksinimler ve Pratik Uygulamalar

Bir gün production sunucunuzda ciddi bir güvenlik ihlali yaşandı ve saldırganın ne zaman, nasıl girdiğini anlamak istiyorsunuz. Log dosyalarına bakıyorsunuz ama kritik dönemin logları silinmiş ya da üzerine yazılmış. Ya da tam tersi senaryo: Depolama alanınız log dosyalarıyla dolup taşıyor, yeni servislerin ayağa kalkmasını engelliyor. Her iki durum da sysadmin kariyerinizde kabusunuz olabilir. İşte bu yüzden log saklama politikası, sadece “ne kadar süre saklayalım” sorusundan çok daha fazlasıdır.

Log Saklama Politikası Neden Bu Kadar Kritik?

Log yönetimi iki farklı baskıyla karşı karşıya kalır: Yasal uyumluluk ve operasyonel gerçekler. Yasal düzenlemeler size “en az şu kadar sakla” derken, depolama kapasitesi “fazla yer kaplıyor, sil” diye bağırır. Ortada kalan sysadmin olarak ikisini dengelemeniz gerekir.

Yasal açıdan bakıldığında Türkiye’de 5651 sayılı İnternet Kanunu, internet servis sağlayıcıları ve içerik sağlayıcılar için belirli log saklama yükümlülükleri getirir. KVKK (Kişisel Verilerin Korunması Kanunu) ise kişisel veriye erişim loglarının saklanmasını zorunlu kılar. PCI DSS uyumluluğu gerektiren ortamlarda en az 12 ay log tutma zorunluluğu vardır, bunun 3 ayı anlık erişilebilir olmalıdır. HIPAA kapsamındaki sağlık sistemlerinde bu süre 6 yıla çıkabilir.

Pratik açıdan ise bir olayı incelerken genellikle 30-90 gün geriye gitmeniz gerekir. Çoğu saldırı hemen fark edilmez; bir APT (Advanced Persistent Threat) saldırısı aylar boyunca fark edilmeden sürebilir.

Hangi Logları Ne Kadar Süre Saklayalım?

Tüm logları aynı kategoride değerlendirmek hem yasal açıdan yanlış hem de operasyonel açıdan verimsizdir. Logları önem ve içeriklerine göre kategorilere ayırmanız gerekir.

Güvenlik logları (auth.log, secure, Windows Security Event Log):

  • Minimum saklama süresi: 1 yıl
  • Önerilen süre: 2 yıl
  • Gerekçe: Yasal soruşturmalar, KVKK uyumluluğu

Web sunucu erişim logları (Apache/Nginx access.log):

  • Minimum saklama süresi: 6 ay
  • Önerilen süre: 1 yıl
  • Gerekçe: DDoS analizi, hukuki delil

Uygulama logları:

  • Minimum saklama süresi: 3 ay
  • Önerilen süre: 6 ay
  • Gerekçe: Hata ayıklama, performans analizi

Sistem logları (syslog, dmesg):

  • Minimum saklama süresi: 1 ay
  • Önerilen süre: 3 ay
  • Gerekçe: Donanım sorunları, kernel hataları

Veritabanı audit logları:

  • Minimum saklama süresi: 1 yıl
  • Önerilen süre: 3 yıl
  • Gerekçe: Veri ihlali soruşturmaları, KVKK

Linux’ta Log Rotation Yapılandırması

Linux sistemlerde log rotation’ın temel aracı logrotate‘tir. Varsayılan yapılandırma çoğu zaman ihtiyaçlarınızı karşılamaz, özelleştirmeniz gerekir.

# /etc/logrotate.d/custom-security dosyası
/var/log/auth.log
/var/log/secure
/var/log/sudo.log
{
    daily
    rotate 730
    compress
    delaycompress
    missingok
    notifempty
    create 0640 root adm
    dateext
    dateformat -%Y%m%d
    sharedscripts
    postrotate
        /usr/bin/systemctl reload rsyslog > /dev/null 2>&1 || true
    endscript
}

Bu yapılandırmada rotate 730 parametresi 730 gün (2 yıl) boyunca logları saklar. dateext ve dateformat parametreleri sayesinde her rotated log dosyası tarih damgasıyla adlandırılır, bu da hangi tarihe ait olduğunu bulmayı kolaylaştırır.

Web sunucu logları için farklı bir strateji izleyebilirsiniz:

# /etc/logrotate.d/nginx
/var/log/nginx/*.log {
    daily
    rotate 365
    compress
    delaycompress
    missingok
    notifempty
    create 0644 www-data adm
    dateext
    dateformat -%Y%m%d-%H%M%S
    sharedscripts
    prerotate
        if [ -d /etc/logrotate.d/httpd-prerotate ]; then 
            run-parts /etc/logrotate.d/httpd-prerotate; 
        fi 
    endscript
    postrotate
        invoke-rc.d nginx rotate >/dev/null 2>&1
    endscript
}

Merkezi Log Yönetimi: rsyslog ile Uzak Sunucuya Yönlendirme

Tek bir sunucuda log saklamak güvenlik açısından risklidir. Saldırgan sisteme girdiğinde ilk yapacağı şeylerden biri logları temizlemektir. Bu yüzden logları merkezi bir log sunucusuna yönlendirin.

# /etc/rsyslog.conf - Kaynak sunucu yapılandırması
# TCP ile güvenli iletim
*.* @@log-server.internal:514

# Ya da TLS ile şifreli iletim (önerilir)
*.* action(type="omfwd"
    target="log-server.internal"
    port="6514"
    protocol="tcp"
    action.resumeRetryCount="-1"
    queue.type="linkedList"
    queue.size="10000"
    queue.filename="fwdRule1"
    queue.saveOnShutdown="on"
    StreamDriver="gtls"
    StreamDriverMode="1"
    StreamDriverAuthMode="x509/name"
    StreamDriverPermittedPeers="log-server.internal")

Log sunucusunda ise gelen logları düzenli bir yapıda saklayın:

# /etc/rsyslog.d/remote-logs.conf - Log sunucusu yapılandırması
# Gelen bağlantıları dinle
module(load="imtcp")
input(type="imtcp" port="514")

# Her sunucu için ayrı dizin oluştur
$template RemoteLogs,"/var/log/remote/%HOSTNAME%/%PROGRAMNAME%-%$YEAR%-%$MONTH%-%$DAY%.log"
*.* ?RemoteLogs
& stop

Log Sıkıştırma ve Arşivleme Stratejisi

Logları sıkıştırarak saklama alanından ciddi tasarruf sağlayabilirsiniz. Metin tabanlı log dosyaları gzip ile %70-90 oranında küçülebilir.

#!/bin/bash
# /usr/local/bin/log-archive.sh
# Eski logları sıkıştırıp arşive taşıyan script

LOGDIR="/var/log"
ARCHIVEDIR="/archive/logs"
RETENTION_DAYS=730  # 2 yıl
COMPRESS_AFTER_DAYS=7  # 7 günden eski logları sıkıştır

# 7 günden eski, henüz sıkıştırılmamış logları sıkıştır
find "$LOGDIR" -name "*.log.*" -not -name "*.gz" 
    -mtime +"$COMPRESS_AFTER_DAYS" 
    -exec gzip -9 {} ;

# 90 günden eski sıkıştırılmış logları arşive taşı
find "$LOGDIR" -name "*.gz" -mtime +90 | while read -r logfile; do
    # Dizin yapısını koru
    relative_path="${logfile#$LOGDIR/}"
    archive_path="$ARCHIVEDIR/$(date +%Y/%m)/$relative_path"
    mkdir -p "$(dirname "$archive_path")"
    mv "$logfile" "$archive_path"
    echo "$(date): Arşivlendi: $logfile -> $archive_path" >> /var/log/archive-operations.log
done

# Saklama süresini aşan logları sil
find "$ARCHIVEDIR" -name "*.gz" -mtime +"$RETENTION_DAYS" -delete
echo "$(date): Retention temizliği tamamlandı" >> /var/log/archive-operations.log

Bu scripti crontab’a ekleyin:

# Crontab kaydı - Her gece 02:00'de çalıştır
0 2 * * * /usr/local/bin/log-archive.sh >> /var/log/archive-script.log 2>&1

Log Bütünlüğünü Doğrulama

Logların değiştirilmediğini kanıtlamak, özellikle yasal süreçlerde kritik önem taşır. Hash değerleri alarak log bütünlüğünü koruyabilirsiniz.

#!/bin/bash
# /usr/local/bin/log-integrity-check.sh
# Log dosyalarının hash değerlerini hesaplar ve doğrular

LOGDIR="/var/log"
HASHFILE="/var/lib/log-hashes/checksums.sha256"
HASHDIR="/var/lib/log-hashes"

mkdir -p "$HASHDIR"

case "$1" in
    "generate")
        # Mevcut logların hash değerlerini oluştur
        find "$LOGDIR" -name "*.log" -o -name "*.log.*.gz" | sort | 
            xargs sha256sum > "$HASHFILE"
        # Hash dosyasının kendisini de imzala
        sha256sum "$HASHFILE" > "$HASHDIR/checksums.sha256.sig"
        echo "$(date): Hash değerleri oluşturuldu: $(wc -l < $HASHFILE) dosya"
        ;;
    "verify")
        # Hash değerlerini doğrula
        if sha256sum -c "$HASHFILE" 2>&1 | grep -v "OK$"; then
            echo "UYARI: Bazı log dosyaları değiştirilmiş olabilir!"
            logger -p security.alert "Log bütünlük kontrolü başarısız!"
        else
            echo "$(date): Tüm log dosyaları bütünlük kontrolünden geçti"
        fi
        ;;
    *)
        echo "Kullanım: $0 {generate|verify}"
        exit 1
        ;;
esac

Windows Ortamında Log Saklama

Windows Server ortamlarında Event Log yönetimi için PowerShell ve Windows Event Forwarding (WEF) kullanabilirsiniz.

# Windows Event Log maksimum boyut ve retention ayarları
# PowerShell ile yapılandırma

# Security log için boyut ve davranış ayarla
# MaximumKilobytes: 1GB
# OverflowAction: OverwriteOlder (eski kayıtların üstüne yaz)
Limit-EventLog -LogName Security -MaximumSize 1073741824
$logConfig = Get-WinEvent -ListLog Security
$logConfig.MaximumSizeInBytes = 1073741824  # 1 GB
$logConfig.LogMode = [System.Diagnostics.Eventing.Reader.LogMode]::Retain
$logConfig.SaveChanges()

# Audit policy - hangi olayların loglanacağını belirle
auditpol /set /category:"Logon/Logoff" /success:enable /failure:enable
auditpol /set /category:"Account Logon" /success:enable /failure:enable
auditpol /set /category:"Object Access" /success:enable /failure:enable
auditpol /set /category:"Privilege Use" /success:enable /failure:enable
auditpol /set /category:"System" /success:enable /failure:enable

# Mevcut audit policy'yi görüntüle
auditpol /get /category:*

Write-Host "Windows audit policy yapılandırması tamamlandı"

ELK Stack ile Merkezi Log Yönetimi

Büyük ortamlarda Elasticsearch, Logstash ve Kibana üçlüsü log yönetiminin fiili standardı haline gelmiştir. Index lifecycle management (ILM) ile log saklama politikalarını otomatize edebilirsiniz.

# Elasticsearch ILM policy oluşturma - curl ile API çağrısı
curl -X PUT "localhost:9200/_ilm/policy/log-retention-policy" 
  -H 'Content-Type: application/json' 
  -d '{
  "policy": {
    "phases": {
      "hot": {
        "min_age": "0ms",
        "actions": {
          "rollover": {
            "max_primary_shard_size": "50gb",
            "max_age": "7d"
          }
        }
      },
      "warm": {
        "min_age": "30d",
        "actions": {
          "shrink": {
            "number_of_shards": 1
          },
          "forcemerge": {
            "max_num_segments": 1
          }
        }
      },
      "cold": {
        "min_age": "90d",
        "actions": {
          "freeze": {}
        }
      },
      "delete": {
        "min_age": "730d",
        "actions": {
          "delete": {}
        }
      }
    }
  }
}'

Bu ILM policy ile loglarınız otomatik olarak lifecycle’ı takip eder: İlk 30 gün aktif (hot) depolamada, 30-90 gün arası sıkıştırılmış (warm) depolamada, 90-730 gün arası dondurulmuş (cold) depolamada tutulur ve 730 gün sonra otomatik silinir.

Gerçek Dünya Senaryosu: Log Politikası Olmayan Bir Şirkette Yaşananlar

Orta ölçekli bir e-ticaret şirketinde çalıştığınızı düşünün. Güvenlik ekibi size bir müşterinin kredi kartı bilgilerinin çalındığını rapor etti. PCI DSS gereği olayı araştırmanız ve ilgili kart şemalarına bildirmeniz gerekiyor. Forensic inceleme başlatıyorsunuz ama:

  • Web sunucu logları sadece 7 gün saklanmış, saldırı 3 hafta önce gerçekleşmiş
  • Veritabanı erişim logları hiç tutulmamış
  • Auth logları 30 gün sonra silinmiş

Bu durumda PCI DSS uyumsuzluğu nedeniyle ciddi cezalar, kart şemasından çıkarılma riski ve hukuki sorunlarla karşı karşıya kalırsınız. Dahası saldırının nasıl gerçekleştiğini anlayamadan aynı açığın tekrar kullanılmasını engelleyemezsiniz.

Öte yandan başka bir senaryo: Logları hiç temizlemeyen bir şirket, 500 GB’lık log yığınıyla karşılaşır ve kritik production diskinin dolmasıyla servislerin çökmesine neden olur. Gece 3’te aranırsınız, sorun “sadece disk dolu” olarak görünür ama asıl sorun log politikasının yokluğudur.

Log Saklama Maliyetlerini Optimize Etme

Depolama maliyetleri göz ardı edilemez. Akıllıca bir tier stratejisiyle hem uyumlu hem ekonomik olabilirsiniz.

#!/bin/bash
# Log boyutu analiz scripti - hangi servislerin ne kadar yer kapladığını gösterir

echo "=== Log Boyutu Analizi ==="
echo "Tarih: $(date)"
echo ""

echo "--- Dizin bazında kullanım ---"
du -sh /var/log/*/ 2>/dev/null | sort -rh | head -20

echo ""
echo "--- En büyük log dosyaları ---"
find /var/log -name "*.log" -o -name "*.log.*.gz" 2>/dev/null | 
    xargs du -sh 2>/dev/null | sort -rh | head -20

echo ""
echo "--- Aylık büyüme tahmini ---"
# Son 7 günün log yazma hızını hesapla
TOTAL_WRITTEN=$(find /var/log -newer /var/log -name "*.log" 
    -exec du -sb {} ; 2>/dev/null | awk '{sum+=$1} END {print sum}')
DAILY_RATE=$((TOTAL_WRITTEN / 7))
MONTHLY_RATE=$((DAILY_RATE * 30))
echo "Günlük ortalama: $(numfmt --to=iec $DAILY_RATE)"
echo "Aylık tahmini: $(numfmt --to=iec $MONTHLY_RATE)"
echo "Yıllık tahmini: $(numfmt --to=iec $((DAILY_RATE * 365)))"

Tier stratejisi için düşünce yapısı şu şekilde olabilir:

  • Hot tier (SSD/NVMe): Son 30 günün logları, anlık erişim gereksinimi
  • Warm tier (HDD RAID): 30-180 gün arası loglar, düşük gecikmeyle erişim
  • Cold tier (Object Storage/Tape): 180 gün – yasal maksimum, nadir erişim
  • Archive (Offsite/Cloud): Yasal minimum aşıldıktan sonra felaket kurtarma kopyası

Log Politikasını Dokümante Etme

Teknik yapılandırma kadar önemli olan bir diğer konu, politikanın yazılı olarak dokümante edilmesidir. Bir denetimde veya hukuki süreçte “log politikamız var” demeniz yetmez, neyi neden ne kadar süre sakladığınızı kanıtlamanız gerekir.

Log politikası belgesi şu başlıkları içermelidir:

  • Kapsam: Hangi sistemler ve log türleri bu politika kapsamındadır
  • Saklama süreleri: Her log kategorisi için minimum ve maksimum süreler
  • Yasal gerekçe: Hangi düzenlemenin hangi saklama süresini gerektirdiği
  • Erişim kontrolü: Kimlerin hangi loglara erişebildiği
  • Şifreleme: Aktarım ve depolamada şifreleme gereksinimleri
  • Bütünlük kontrolü: Hash doğrulama prosedürleri
  • İmha prosedürü: Saklama süresi dolan logların nasıl güvenli silineceği
  • Revizyon tarihi: Politikanın son güncellenme tarihi ve gözden geçirme takvimi

Uyum Denetimi İçin Log Raporu Oluşturma

#!/bin/bash
# /usr/local/bin/log-compliance-report.sh
# Aylık uyum raporu oluşturur

REPORT_FILE="/var/reports/log-compliance-$(date +%Y-%m).txt"
mkdir -p /var/reports

{
echo "========================================="
echo "LOG SAKLAMA UYUM RAPORU"
echo "Rapor tarihi: $(date '+%Y-%m-%d %H:%M:%S')"
echo "Sunucu: $(hostname)"
echo "========================================="
echo ""

echo "1. MEVCUT LOG SAKLAMA DURUMU"
echo "-----------------------------------------"
for logdir in /var/log /archive/logs; do
    if [ -d "$logdir" ]; then
        echo "Dizin: $logdir"
        echo "Toplam boyut: $(du -sh $logdir 2>/dev/null | cut -f1)"
        echo "En eski log: $(find $logdir -name "*.gz" -printf '%T+ %pn' 2>/dev/null | sort | head -1)"
        echo "En yeni log: $(find $logdir -name "*.log" -printf '%T+ %pn' 2>/dev/null | sort -r | head -1)"
        echo ""
    fi
done

echo "2. SON 30 GÜNDEKİ GÜVENLİK OLAYLARI"
echo "-----------------------------------------"
echo "Başarısız SSH denemeleri:"
grep "Failed password" /var/log/auth.log 2>/dev/null | 
    awk '{print $1, $2}' | sort | uniq -c | sort -rn | head -10

echo ""
echo "Sudo kullanımı:"
grep "sudo:" /var/log/auth.log 2>/dev/null | 
    grep "COMMAND" | wc -l | xargs echo "Toplam sudo komutu:"

echo ""
echo "3. LOG ROTATION DURUMU"
echo "-----------------------------------------"
logrotate -d /etc/logrotate.conf 2>&1 | grep -E "(rotating|error)" | head -20

} > "$REPORT_FILE"

echo "Rapor oluşturuldu: $REPORT_FILE"
# Raporu yöneticiye e-posta ile gönder (mail komutu kurulu olmalı)
# mail -s "Aylık Log Uyum Raporu - $(hostname)" [email protected] < "$REPORT_FILE"

Sonuç

Log saklama politikası, bir sysadmin’in “yaparım bir gün” listesinde bırakabileceği türden bir görev değildir. Yasal uyumsuzluk ciddi para cezaları ve hukuki sorumluluklar doğururken, yetersiz saklama güvenlik olaylarını aydınlatamamanıza neden olur. Öte yandan kontrolsüz log birikimi operasyonel problemlere yol açar.

Pratik yaklaşım şu üç adımla özetlenebilir: Önce hangi düzenlemelere tabi olduğunuzu belirleyin ve minimum saklama sürelerinizi o düzenlemelere göre netleştirin. Sonra merkezi log yönetimi altyapısını kurun; logları üretildikleri sunucuda saklamak hem güvensiz hem de yönetilmez bir yaklaşımdır. Son olarak tüm bu konfigürasyonları politika belgesi haline getirin ve düzenli aralıklarla test edin.

Teknoloji değişse de, hangi platformda çalışırsanız çalışın, loglarınız hem operasyonel belleğinizdir hem de yasal koruyucunuzdur. Onlara sahip çıkın.

Benzer Konular

Bir yanıt yazın

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