dnf-automatic ile Otomatik Güvenlik Güncellemeleri

Sunucu yönetiminde en sık ihmal edilen konuların başında güvenlik güncellemeleri geliyor. “Şimdi değil, hafta sonu yaparım” diye ertelenen güncellemeler, bir süre sonra kritik açıkların kapısını aralıyor. dnf-automatic tam da bu noktada devreye giriyor: sisteminizi otomatik olarak güncel tutuyor, siz de gece rahat uyuyabiliyorsunuz.

Bu yazıda CentOS Stream 8/9 ve Rocky Linux üzerinde dnf-automatic kurulumunu, yapılandırmasını ve gerçek dünya senaryolarına göre nasıl özelleştireceğinizi adım adım ele alacağız.

dnf-automatic Nedir ve Neden Kullanmalısınız?

dnf-automatic, DNF paket yöneticisinin bir eklentisidir. Temel görevi, belirlediğiniz kriterlere göre (yalnızca güvenlik güncellemeleri, tüm güncellemeler vb.) sisteminizi otomatik olarak güncellemek ve bu işlem hakkında sizi bilgilendirmektir.

Manuel güncelleme sürecini düşünelim: Onlarca sunucu yönetiyorsunuz, her birinde ayrı ayrı dnf update çalıştırmanız gerekiyor. Birini atladınız, o sunucuda kritik bir CVE var, haberin bile olmuyor. dnf-automatic bu senaryoyu ortadan kaldırıyor.

Aracın sunduğu temel özellikler şöyle:

  • Esnek güncelleme tipleri: Yalnızca güvenlik, güvenlik + hata düzeltme veya tüm güncellemeler
  • Çoklu bildirim kanalları: E-posta, MOTD (Message of the Day), özel komutlar
  • Systemd timer entegrasyonu: Cron yerine modern systemd zamanlayıcıları
  • Random delay desteği: Çok sayıda sunucuda aynı anda yük oluşturmayı önleme

Kurulum

Rocky Linux 8/9 ve CentOS Stream üzerinde kurulum oldukça basit:

# Kurulum
sudo dnf install -y dnf-automatic

# Servis durumunu kontrol et
systemctl status dnf-automatic.timer

Kurulumla birlikte birkaç farklı systemd timer birimi gelir:

  • dnf-automatic.timer: Genel amaçlı timer, yapılandırmaya göre çalışır
  • dnf-automatic-install.timer: Güncellemeleri otomatik indirir ve kurar
  • dnf-automatic-download.timer: Sadece indirir, kurmaz
  • dnf-automatic-notifyonly.timer: Sadece bildirim gönderir, hiçbir şey yapmaz

Hangisini kullanacağınız tamamen ihtiyacınıza göre değişir. Ben genellikle kritik üretim sunucularında dnf-automatic-notifyonly.timer ile başlayıp ekibin alışması için birkaç hafta bekliyorum, sonra dnf-automatic-install.timer‘a geçiyorum.

Yapılandırma Dosyasını Anlamak

Ana yapılandırma dosyası /etc/dnf/automatic.conf konumundadır. Varsayılan hali oldukça iyi belgelenmiş durumda, ama her bölümü iyi anlamak önemli:

# Önce yedek al, sonra düzenle
sudo cp /etc/dnf/automatic.conf /etc/dnf/automatic.conf.bak
sudo nano /etc/dnf/automatic.conf

Dosyanın içeriği bölümler halinde geliyor. Şimdi her bölümü inceleyelim.

[commands] Bölümü

[commands]
# Güncelleme tipi: default, security, security-severity:Critical,
# minimal, minimal-security, minimal-security-severity:Critical
upgrade_type = security

# Rastgele bekleme süresi (saniye cinsinden)
# Birden fazla sunucuda aynı anda yük oluşturmamak için
random_sleep = 3600

# Güncellemeleri indir
download_updates = yes

# Güncellemeleri uygula
apply_updates = yes

# Reboot gerekiyorsa ne yapılsın: never, when-changed, when-needed
reboot = never
reboot_command = "shutdown -r +5 'Güvenlik güncellemesi nedeniyle 5 dakika sonra yeniden başlatılıyor'"

upgrade_type parametresi kritik öneme sahip. Üretim ortamında genellikle security kullanırım. Bu şekilde yalnızca güvenlik açığı içeren paketler güncelleniyor. default seçeneği tüm güncellemeleri alıyor, bu da bazen beklenmedik davranışlara yol açabiliyor.

[emitters] Bölümü

[emitters]
# Bildirim yöntemi: stdio, email, motd, command
emit_via = email

# Sistemi tanımlayan isim (e-posta konusunda görünür)
system_name = web-prod-01

# E-posta gönderenin adresi
email_from = [email protected]

# Bildirim alacak adresler (virgülle ayrılmış)
email_to = [email protected], [email protected]

# SMTP sunucusu
email_host = smtp.sirketiniz.com:587

[base] Bölümü

[base]
# DNF debuglevel ayarı
debuglevel = 1

Gerçek Dünya Senaryosu 1: Küçük Şirket, Minimal Risk Yaklaşımı

Diyelim ki 5-10 sunucu yönetiyorsunuz, ekibiniz küçük ve güvenlik yamalarını takip etmek için zaman bulamıyorsunuz. Bu durumda en mantıklı yaklaşım yalnızca güvenlik güncellemelerini otomatik uygulamak ve her gün sabah rapor almak.

sudo tee /etc/dnf/automatic.conf << 'EOF'
[commands]
upgrade_type = security
random_sleep = 1800
download_updates = yes
apply_updates = yes
reboot = never

[emitters]
emit_via = email
system_name = prod-server-01
email_from = [email protected]
email_to = [email protected]
email_host = localhost

[base]
debuglevel = 1
EOF

Sonra timer’ı aktif edip başlatıyoruz:

sudo systemctl enable --now dnf-automatic-install.timer

# Timer durumunu kontrol et
systemctl status dnf-automatic-install.timer

# Bir sonraki çalışma zamanını gör
systemctl list-timers dnf-automatic-install.timer

Varsayılan olarak timer her gün saat 06:00’da çalışıyor. Bu saati değiştirmek için timer dosyasını override etmek gerekiyor.

Systemd Timer Özelleştirme

Timer zamanlamasını değiştirmek için systemd override mekanizmasını kullanın. Direkt timer dosyasını düzenlemek yerine override kullanmak, paket güncellemelerinde değişikliklerinizin kaybolmamasını sağlar:

# Override dizini oluştur
sudo mkdir -p /etc/systemd/system/dnf-automatic-install.timer.d/

# Override dosyası oluştur
sudo tee /etc/systemd/system/dnf-automatic-install.timer.d/override.conf << 'EOF'
[Timer]
# Mevcut OnCalendar'ı temizle
OnCalendar=
# Yeni zaman ayarla: Her gün 02:30'da
OnCalendar=*-*-* 02:30:00
# Sistem başladıktan 15 dakika sonra da çalıştır
OnBootSec=15min
EOF

# Systemd'yi yeniden yükle
sudo systemctl daemon-reload

# Timer durumunu kontrol et
systemctl status dnf-automatic-install.timer

Haftanın belirli günlerinde çalıştırmak istiyorsanız OnCalendar sözdizimini şöyle kullanabilirsiniz:

# Sadece Salı ve Perşembe 03:00'da
OnCalendar=Tue,Thu *-*-* 03:00:00

# Her Pazartesi 01:00'da
OnCalendar=Mon *-*-* 01:00:00

# Her gün 04:00 ile 06:00 arasında rastgele (AccuracySec ile birlikte)
OnCalendar=*-*-* 04:00:00
AccuracySec=2h

Gerçek Dünya Senaryosu 2: Çok Sunuculu Ortam, Merkezi Bildirim

20+ sunucu yönetiyorsanız, her sunucudan ayrı ayrı e-posta almak kaos yaratır. Bu durumda bildirimleri bir log sunucusuna göndermek veya özel bir script ile toplamak daha mantıklı.

Önce her sunucuda /etc/dnf/automatic.conf dosyasını yapılandırıyoruz:

[commands]
upgrade_type = security
random_sleep = 7200
download_updates = yes
apply_updates = yes
reboot = never

[emitters]
emit_via = command
system_name = web-01.prod.sirket.local

[base]
debuglevel = 1

emit_via = command seçeneği kullanıldığında, command parametresine belirttiğiniz komut çalışıyor ve güncelleme çıktısı stdin üzerinden bu komuta gönderiliyor. Özel bir script yazarak bunu Slack, Teams veya merkezi log sistemine yönlendirebilirsiniz:

# /usr/local/bin/dnf-update-notify.sh
sudo tee /usr/local/bin/dnf-update-notify.sh << 'EOF'
#!/bin/bash

HOSTNAME=$(hostname -f)
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
LOG_FILE="/var/log/dnf-automatic-report.log"
WEBHOOK_URL="https://hooks.slack.com/services/XXXXXXXXX/XXXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXXXX"

# Stdin'den içeriği oku
UPDATE_OUTPUT=$(cat)

# Yerel log'a yaz
echo "=== $TIMESTAMP - $HOSTNAME ===" >> "$LOG_FILE"
echo "$UPDATE_OUTPUT" >> "$LOG_FILE"
echo "" >> "$LOG_FILE"

# Eğer güncelleme varsa Slack'e bildir
if echo "$UPDATE_OUTPUT" | grep -q "packages upgraded"; then
    PAYLOAD=$(jq -n 
        --arg text "✅ *$HOSTNAME* - Güvenlik güncellemeleri uygulandın```$UPDATE_OUTPUT```" 
        '{text: $text}')
    
    curl -s -X POST -H 'Content-type: application/json' 
        --data "$PAYLOAD" 
        "$WEBHOOK_URL"
fi
EOF

sudo chmod +x /usr/local/bin/dnf-update-notify.sh

Sonra automatic.conf dosyasında komutu belirtiyoruz:

[emitters]
emit_via = command
command = /usr/local/bin/dnf-update-notify.sh

Güncelleme Geçmişini İzleme

dnf-automatic’in ne yaptığını takip etmek için birkaç komut:

# dnf güncelleme geçmişi
sudo dnf history list

# Belirli bir işlemin detayı
sudo dnf history info <işlem-id>

# Sadece dnf-automatic işlemlerini filtrele
sudo dnf history list | grep -A2 "System Upgrade"

# Systemd journal'dan dnf-automatic loglarını çek
sudo journalctl -u dnf-automatic-install.service --since "7 days ago"

# Son çalışmayı kontrol et
sudo journalctl -u dnf-automatic-install.service -n 50

Gerçek Dünya Senaryosu 3: Otomatik Yeniden Başlatma Yönetimi

Bazı güncellemeler (kernel, glibc, openssl gibi) yeniden başlatma gerektiriyor. Üretim ortamında bunu otomatik yapmak riskli olabilir, ama dikkatli bir yapılandırmayla yönetilebilir.

needs-restarting aracını kullanarak reboot gerekip gerekmediğini kontrol eden bir wrapper script yazalım:

sudo tee /usr/local/bin/dnf-auto-update.sh << 'EOF'
#!/bin/bash

LOG_FILE="/var/log/dnf-auto-update.log"
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
NOTIFY_EMAIL="[email protected]"
HOSTNAME=$(hostname -f)

log() {
    echo "[$TIMESTAMP] $1" | tee -a "$LOG_FILE"
}

log "Güvenlik güncellemeleri kontrol ediliyor: $HOSTNAME"

# Mevcut güvenlik güncellemelerini listele
UPDATES=$(dnf check-update --security -q 2>/dev/null)
UPDATE_COUNT=$(echo "$UPDATES" | grep -c "^" 2>/dev/null || echo 0)

if [ -z "$UPDATES" ]; then
    log "Uygulanacak güvenlik güncellemesi yok."
    exit 0
fi

log "Toplam $UPDATE_COUNT güvenlik güncellemesi bulundu."

# Güncellemeleri uygula
dnf upgrade --security -y >> "$LOG_FILE" 2>&1
EXIT_CODE=$?

if [ $EXIT_CODE -eq 0 ]; then
    log "Güncellemeler başarıyla uygulandı."
    
    # Yeniden başlatma gerekiyor mu?
    if needs-restarting -r 2>/dev/null; then
        log "Yeniden başlatma GEREKMİYOR."
    else
        log "UYARI: Yeniden başlatma gerekiyor!"
        # E-posta ile bildir ama otomatik yeniden başlatma
        echo "Sunucu $HOSTNAME üzerinde güvenlik güncellemesi uygulandı ve yeniden başlatma gerekiyor.
        
Güncellemeler:
$UPDATES

Lütfen uygun bir maintenance window'da sunucuyu yeniden başlatın." | 
        mail -s "[$HOSTNAME] REBOOT GEREKİYOR - Güvenlik Güncellemesi" "$NOTIFY_EMAIL"
    fi
else
    log "HATA: Güncellemeler uygulanırken sorun oluştu. Exit code: $EXIT_CODE"
    echo "Sunucu $HOSTNAME üzerinde otomatik güvenlik güncellemesi BAŞARISIZ oldu.
    
Log dosyasını inceleyin: $LOG_FILE" | 
    mail -s "[$HOSTNAME] HATA - Otomatik Güncelleme Başarısız" "$NOTIFY_EMAIL"
fi
EOF

sudo chmod +x /usr/local/bin/dnf-auto-update.sh

Bu script’i bir systemd service ile çalıştırabilirsiniz:

sudo tee /etc/systemd/system/dnf-security-update.service << 'EOF'
[Unit]
Description=Otomatik Güvenlik Güncellemesi
After=network-online.target
Wants=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/dnf-auto-update.sh
StandardOutput=journal
StandardError=journal
EOF

sudo tee /etc/systemd/system/dnf-security-update.timer << 'EOF'
[Unit]
Description=Günlük Güvenlik Güncellemesi Timer
Requires=dnf-security-update.service

[Timer]
OnCalendar=*-*-* 03:00:00
RandomizedDelaySec=1800
Persistent=true

[Install]
WantedBy=timers.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now dnf-security-update.timer

Belirli Paketleri Hariç Tutma

Otomatik güncellemelerden bazı paketleri hariç tutmak isteyebilirsiniz. Örneğin, özel yapılandırılmış bir nginx veya özel derlenmiş bir kernel kullanıyorsanız.

Bu ayarı /etc/dnf/dnf.conf dosyasına yapıyoruz, automatic.conf’a değil:

sudo nano /etc/dnf/dnf.conf
[main]
# Bu paketler güncellemelerden hariç tutulur
exclude=kernel* nginx mysql-server postgresql14-server

Veya belirli paket gruplarını tutmak için:

# Test amaçlı: Neyin güncelleneceğini görüntüle, uygulamadan
sudo dnf check-update --security

# Belirli bir paketi bu oturumda hariç tut
sudo dnf upgrade --security --exclude=kernel* -y

MOTD ile Hızlı Durum Gösterimi

Sunucuya SSH ile bağlandığınızda güncelleme durumunu görmek için MOTD entegrasyonu kullanabilirsiniz:

sudo tee /etc/update-motd.d/90-dnf-updates << 'EOF'
#!/bin/bash

# Sadece root veya sudo kullanıcıları için göster
SECURITY_UPDATES=$(dnf check-update --security -q 2>/dev/null | grep -c "^[a-zA-Z]" || echo 0)
ALL_UPDATES=$(dnf check-update -q 2>/dev/null | grep -c "^[a-zA-Z]" || echo 0)

if [ "$SECURITY_UPDATES" -gt 0 ]; then
    echo ""
    echo "  ⚠️  GÜVENLİK UYARISI: $SECURITY_UPDATES güvenlik güncellemesi bekliyor!"
    echo "  Toplam $ALL_UPDATES paket güncellenebilir."
    echo "  'sudo dnf upgrade --security -y' komutunu çalıştırın."
    echo ""
elif [ "$ALL_UPDATES" -gt 0 ]; then
    echo ""
    echo "  ℹ️  $ALL_UPDATES paket güncellenebilir (güvenlik güncellemesi yok)."
    echo ""
fi
EOF

sudo chmod +x /etc/update-motd.d/90-dnf-updates

Not: Bu script her SSH bağlantısında dnf check-update çalıştırdığından biraz yavaş olabilir. Bunu önlemek için sonucu bir dosyaya cache’leyip oradan okuyabilirsiniz.

Yapılandırmayı Test Etme

Sistemi gerçekten güncellemeden önce çalışıp çalışmadığını test etmek kritik:

# Manuel olarak çalıştır ve çıktıyı izle
sudo dnf-automatic /etc/dnf/automatic.conf --verbose

# Sadece indirme adımını test et (apply_updates = no gibi davranır)
sudo dnf-automatic --no-apply /etc/dnf/automatic.conf

# Timer'ı hemen çalıştır (test için)
sudo systemctl start dnf-automatic-install.service

# Anlık logları izle
sudo journalctl -f -u dnf-automatic-install.service

E-posta Gönderimi için Postfix Yapılandırması

E-posta bildirimleri için sistemde bir MTA olması gerekiyor. Basit relay yapılandırması:

# Postfix kurulumu
sudo dnf install -y postfix mailx

# Basit relay yapılandırması
sudo tee -a /etc/postfix/main.cf << 'EOF'

# Relay yapılandırması
relayhost = [smtp.sirketiniz.com]:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
EOF

# SMTP kimlik bilgileri
echo "[smtp.sirketiniz.com]:587 kullanici:sifre" | sudo tee /etc/postfix/sasl_passwd
sudo postmap /etc/postfix/sasl_passwd
sudo chmod 600 /etc/postfix/sasl_passwd

sudo systemctl enable --now postfix

# Test maili gönder
echo "Test mesajı" | mail -s "DNF-Automatic Test" [email protected]

Sık Karşılaşılan Sorunlar ve Çözümleri

Timer çalışıyor ama güncelleme yapılmıyor:

# Önce journal loglarını incele
sudo journalctl -u dnf-automatic-install.service --since "24 hours ago"

# Lock dosyası var mı kontrol et
ls -la /var/cache/dnf/*.lock 2>/dev/null

# DNF cache'i temizle ve tekrar dene
sudo dnf clean all
sudo dnf makecache

E-posta gönderilmiyor:

# Postfix mail queue'yu kontrol et
sudo mailq

# Postfix loglarını incele
sudo journalctl -u postfix --since "1 hour ago"

# Test maili elle gönder
echo "test" | sendmail -v [email protected]

Belirli bir sunucuda güncelleme geç yapılıyor:

random_sleep değerini kontrol edin. 3600 saniye (1 saat) ayarladıysanız, timer belirtilen saatten itibaren 1 saate kadar rastgele bir gecikmeyle çalışır. Bu normal bir davranıştır.

Sonuç

dnf-automatic, doğru yapılandırıldığında güvenlik operasyonlarının önemli bir yükünü ortadan kaldırıyor. Kritik noktaları özetleyecek olursam:

  • Üretim ortamında her zaman upgrade_type = security ile başlayın, tüm güncellemeleri otomatik uygulamayın
  • Timer override’larını doğrudan dosyayı düzenleyerek değil, .d dizini aracılığıyla yapın
  • Loglama ve bildirim mekanizmasını mutlaka kurun, güncellemenin gerçekten yapıldığını doğrulamadan sisteme güvenmeyin
  • random_sleep parametresini çok sunuculu ortamlarda kullanarak aynı anda yük oluşturmaktan kaçının
  • needs-restarting komutunu entegre ederek kernel güncellemeleri sonrası reboot ihtiyacını takip edin

Güvenlik güncellemelerini ertelemek her zaman daha büyük riskler doğurur. dnf-automatic ile bu riski minimize edebilir, ekibinizin zamanını daha stratejik işlere ayırabilirsiniz. Sistemi kurun, test edin ve birkaç hafta sonra “neden daha önce kurmadım ki” diyeceksiniz.

Yorum yapın