Debian’da Güvenlik Güncellemelerini Otomatik Uygulama

Sunucularınızı güvenli tutmak, bir sistem yöneticisinin en temel sorumluluklarından biri. Ama gerçeği konuşalım: her gün onlarca sunucuya manuel olarak bağlanıp apt update && apt upgrade yazmak ne pratik ne de sürdürülebilir. İşte tam bu noktada Debian’ın unattended-upgrades paketi devreye giriyor. Bu yazıda, güvenlik güncellemelerini otomatik olarak uygulayan bir sistem kuracağız, yapılandırmayı derinlemesine inceleyeceğiz ve gerçek dünya senaryolarında karşılaşılan sorunları nasıl çözeceğimizi göreceğiz.

Neden Otomatik Güvenlik Güncellemesi?

2021 yılındaki Log4Shell açığını hatırlıyor musunuz? O dönemde binlerce sistem yöneticisi, gece yarısı acil güncelleme yapmak zorunda kaldı. Otomatik güvenlik güncellemeleri tam olarak bu tür senaryolarda hayat kurtarıcı olabiliyor. Ancak “otomatik güncelleme” kavramı bazı sysadminleri tedirgin ediyor. “Ya bir şeyleri bozarsa?” sorusu akla geliyor.

Bu endişe tamamen anlayışlı. Ama şunu da düşünmek gerekiyor: güvenlik açığı içeren bir paket, üretim ortamında günlerce beklemek bir güncellemenin potansiyel yan etkisinden çok daha tehlikeli. Yapacağımız yapılandırmayla sadece güvenlik yamalarını otomatik uygulayacak, büyük sürüm güncellemelerini ise manuel kontrole bırakacağız. Bu denge, hem güvenliği hem de istikrarı koruyor.

unattended-upgrades Paketi Nedir?

unattended-upgrades, Debian ve Ubuntu sistemlerde güvenlik güncellemelerini otomatik olarak indirip yükleyen resmi bir araç. APT altyapısını kullanıyor, yani sistemin geri kalanıyla tamamen entegre çalışıyor. Temel özellikleri şunlar:

  • Belirli repository’lerden (sadece güvenlik, ya da tümü) otomatik güncelleme
  • E-posta bildirimleri gönderebilme
  • Hatalı güncellemeleri geri alabilme (belirli durumlarda)
  • Güncelleme loglarını kaydetme
  • Yeniden başlatma gerektiren durumlarda esnek davranış seçenekleri

Kurulum

Debian sistemlerde bu paket genellikle önceden kurulu geliyor, ama emin olmak için kontrol edelim:

dpkg -l | grep unattended-upgrades

Eğer kurulu değilse:

apt update
apt install unattended-upgrades apt-listchanges -y

apt-listchanges paketini de yüklüyoruz çünkü güncellemeler hakkında değişiklik notlarını e-posta ile almak isteyeceğiz. Kurulum sonrası servisin durumunu kontrol edelim:

systemctl status unattended-upgrades

Servis aktif değilse etkinleştirelim:

systemctl enable --now unattended-upgrades

Temel Yapılandırma

Ana yapılandırma dosyası /etc/apt/apt.conf.d/50unattended-upgrades. Bu dosya oldukça kapsamlı ve içinde bir sürü yorum satırı var. Şimdi bu dosyanın önemli bölümlerini inceleyelim:

nano /etc/apt/apt.conf.d/50unattended-upgrades

Dosyanın içeriği şuna benziyor olacak:

Unattended-Upgrade::Allowed-Origins {
    "${distro_id}:${distro_codename}";
    "${distro_id}:${distro_codename}-security";
    "${distro_id}ESMApps:${distro_codename}-apps-security";
    "${distro_id}ESM:${distro_codename}-infra-security";
};

Buradaki ${distro_id} ve ${distro_codename} değişkenleri otomatik olarak dolduruluyor. Debian Bookworm (12) için bu şu anlama geliyor:

  • Debian:bookworm – Standart paketler
  • Debian:bookworm-security – Güvenlik güncellemeleri

Sadece güvenlik güncellemelerini otomatik uygulamak istiyorsak, diğer satırları yorum satırına çevirebiliriz:

Unattended-Upgrade::Allowed-Origins {
    "${distro_id}:${distro_codename}-security";
    // "${distro_id}:${distro_codename}-updates";
};

Belirli Paketleri Hariç Tutma

Bazı paketlerin otomatik güncellenmesini istemeyebilirsiniz. Örneğin, özel olarak yapılandırılmış bir web sunucusu veya veritabanı için bu çok önemli. Package-Blacklist bölümünü kullanın:

Unattended-Upgrade::Package-Blacklist {
    "nginx";
    "postgresql-14";
    "mysql-server";
    "php8.2";
    // Wildcard da kullanabilirsiniz:
    "linux-.*";
};

Burada linux-.* ile kernel güncellemelerini hariç tutabilirsiniz. Bu tartışmalı bir karar ama kernel güncellemeleri bazen özel kernel modülleriyle (DKMS, özel sürücüler) çakışabiliyor. Eğer test ortamınız varsa, önce orada deneyin.

E-posta Bildirimleri

Yapılan güncellemeler hakkında e-posta almak için:

Unattended-Upgrade::Mail "[email protected]";
Unattended-Upgrade::MailReport "on-change";

MailReport için üç seçenek var:

  • always: Her çalıştırmada e-posta gönder
  • only-on-error: Sadece hata durumunda gönder
  • on-change: Güncelleme yapıldığında veya hata oluştuğunda gönder

Üretim ortamı için on-change en mantıklı seçenek. Her gece “güncellenecek bir şey bulunamadı” e-postası almak istemezsiniz.

Otomatik Yeniden Başlatma

Kernel güncellemeleri veya bazı sistem kütüphaneleri (örn. glibc) değiştiğinde yeniden başlatma gerekiyor. Bu davranışı nasıl yönetirsiniz? İşte kritik yapılandırmalar:

// Otomatik yeniden başlatmayı etkinleştir
Unattended-Upgrade::Automatic-Reboot "true";

// Sistemi hangi saatte yeniden başlat (kullanıcı yoksa)
Unattended-Upgrade::Automatic-Reboot-Time "03:00";

// Aktif kullanıcı oturumu varsa bile yeniden başlat (DİKKATLİ KULLANIN!)
Unattended-Upgrade::Automatic-Reboot-WithUsers "false";

Uyarı: Üretim ortamında otomatik yeniden başlatmayı etkinleştirmeden önce iki kez düşünün. Yüksek trafikli bir web sunucusu veya veritabanı sunucusu için bu tercih edilemeyebilir. Bunun yerine, /var/run/reboot-required dosyasını izleyip manuel veya planlı bir yeniden başlatma yapabilirsiniz.

Güncelleme Zamanlaması

unattended-upgrades genellikle APT’nin apt.systemd.daily timer’ı tarafından tetikleniyor. İkinci bir yapılandırma dosyası olan /etc/apt/apt.conf.d/20auto-upgrades dosyası bu davranışı kontrol ediyor:

cat /etc/apt/apt.conf.d/20auto-upgrades

Bu dosyayı aşağıdaki gibi yapılandırabiliriz:

APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::AutocleanInterval "7";
APT::Periodic::Unattended-Upgrade "1";

Bu değerlerin birimi gün. Yani:

  • Update-Package-Lists “1”: Her gün paket listelerini güncelle
  • Download-Upgradeable-Packages “1”: Her gün güncellenebilir paketleri indir
  • AutocleanInterval “7”: Haftada bir eski paketleri temizle
  • Unattended-Upgrade “1”: Her gün otomatik güncellemeyi çalıştır

Bu dosyayı elle oluşturmak yerine dpkg-reconfigure ile de yapılandırabilirsiniz:

dpkg-reconfigure -plow unattended-upgrades

Bu komut size interaktif bir menü sunacak.

Systemd Timer ile Özelleştirme

Güncellemenin tam olarak ne zaman çalışacağını kontrol etmek istiyorsanız, systemd timer’ını özelleştirebilirsiniz:

systemctl cat apt-daily.timer
systemctl cat apt-daily-upgrade.timer

Zamanlamayı değiştirmek için bir override dosyası oluşturun:

mkdir -p /etc/systemd/system/apt-daily-upgrade.timer.d/
cat > /etc/systemd/system/apt-daily-upgrade.timer.d/override.conf << 'EOF'
[Timer]
OnCalendar=
OnCalendar=02:00
RandomizedDelaySec=0
EOF
systemctl daemon-reload

Bu yapılandırmayla güncelleme her gece tam 02:00’de çalışacak, rastgele gecikme olmayacak.

Logları İzleme ve Kontrol

Otomatik güncelleme sistemi kurulduğunda, ne yaptığını takip etmek çok önemli. Log dosyaları şurda:

# Güncelleme logları
cat /var/log/unattended-upgrades/unattended-upgrades.log

# Hata logları
cat /var/log/unattended-upgrades/unattended-upgrades-dpkg.log

# Son güncelleme durumunu görmek için
tail -50 /var/log/unattended-upgrades/unattended-upgrades.log

Canlı log takibi için:

journalctl -u unattended-upgrades -f

Tipik bir başarılı log çıktısı şöyle görünür:

2024-01-15 02:00:47,832 INFO Starting unattended upgrades script
2024-01-15 02:00:48,112 INFO Allowed origins are: [...]
2024-01-15 02:00:52,445 INFO Packages that will be upgraded: libssl3 openssl
2024-01-15 02:01:15,678 INFO All upgrades installed

Manuel Test ve Kuru Çalıştırma

Yapılandırmanızı uygulamadan önce test etmek isteyebilirsiniz. --dry-run seçeneği bunu sağlıyor:

unattended-upgrade --dry-run --debug

Bu komut gerçekten bir şey yüklemez, sadece ne yapacağını gösterir. Çıktıda hangi paketlerin güncelleneceğini, hangi kaynakların kullanıldığını ve olası hataları görebilirsiniz.

Manuel olarak çalıştırmak için:

unattended-upgrade -v

-v (verbose) seçeneği daha detaylı çıktı verir.

Gelişmiş Senaryo: Çoklu Sunucu Yönetimi

Gerçek dünyada onlarca veya yüzlerce sunucu yönetiyorsunuz. Her sunucuya ayrı ayrı bağlanmak yerine, merkezi bir yaklaşım kullanabilirsiniz.

Ansible ile Toplu Yapılandırma

# Bu bir Ansible playbook örneği
cat > /tmp/unattended-upgrades.yml << 'EOF'
---
- name: Configure unattended-upgrades on Debian servers
  hosts: debian_servers
  become: yes
  tasks:
    - name: Install unattended-upgrades
      apt:
        name: 
          - unattended-upgrades
          - apt-listchanges
        state: present
        update_cache: yes

    - name: Configure 50unattended-upgrades
      template:
        src: 50unattended-upgrades.j2
        dest: /etc/apt/apt.conf.d/50unattended-upgrades
        owner: root
        group: root
        mode: '0644'

    - name: Enable automatic updates
      copy:
        content: |
          APT::Periodic::Update-Package-Lists "1";
          APT::Periodic::Unattended-Upgrade "1";
          APT::Periodic::AutocleanInterval "7";
        dest: /etc/apt/apt.conf.d/20auto-upgrades

    - name: Ensure unattended-upgrades is running
      systemd:
        name: unattended-upgrades
        enabled: yes
        state: started
EOF

Reboot Gerektiren Sunucuları Tespit Etme

Birden fazla sunucunuzu izlerken, hangilerinin yeniden başlatma beklediğini bilmek önemli:

#!/bin/bash
# check_reboot_required.sh
# Bu scripti tüm sunucularda çalıştırın

SERVERS=("web01" "web02" "db01" "db02" "cache01")

for server in "${SERVERS[@]}"; do
    result=$(ssh "$server" "test -f /var/run/reboot-required && echo 'REBOOT REQUIRED' || echo 'OK'")
    echo "$server: $result"
done

Bu script sayesinde hangi sunucuların maintenance window’da yeniden başlatılması gerektiğini kolayca görebilirsiniz.

Yaygın Sorunlar ve Çözümleri

Sorun 1: Paket Kilidi (Lock File)

Bazen unattended-upgrades çalışırken başka bir APT işlemi de çalışıyor olabilir. Bu durumda log’da şöyle bir hata görürsünüz:

E: Could not get lock /var/lib/dpkg/lock-frontend

Bu durumda çalışan APT işlemlerini kontrol edin:

ps aux | grep apt
lsof /var/lib/dpkg/lock-frontend

Eğer gerçekten sıkışmış bir işlem varsa:

kill -9 <PID>
rm /var/lib/dpkg/lock-frontend
dpkg --configure -a

Sorun 2: Eksik Bağımlılıklar

Bazen bir güncelleme, başka paketlerin de güncellenmesini gerektiriyor ama unattended-upgrades bunu otomatik çözmüyor. Bu durumu logda görebilirsiniz. Çözüm:

apt --fix-broken install
apt full-upgrade

Sorun 3: E-posta Gelmiyor

mailutils veya sendmail kurulu olmayabilir:

apt install mailutils -y
# Veya postfix ile:
apt install postfix mailutils -y

Test için:

echo "Test mail" | mail -s "unattended-upgrades test" [email protected]

Güvenlik ve En İyi Pratikler

Otomatik güncelleme sistemini kurarken dikkat etmeniz gereken bazı önemli noktalar var:

  • Test ortamında önce deneyin: Yeni yapılandırmayı önce test sunucularında etkinleştirin, birkaç hafta izleyin, sonra üretim ortamına geçirin.
  • Kritik servisler için bakım penceresi planlayın: Veritabanı sunucularında, yük dengeleyicilerde otomatik yeniden başlatmayı açmak yerine, belirli maintenance window’larında kontrollü güncelleme yapın.
  • Kernel güncellemelerini ayrı değerlendirin: Kernel güncellemeleri özellikle DKMS modülleri kullanan sistemlerde (GPU sürücüleri, özel ağ kartları) sorun çıkarabilir.
  • Log rotasyonunu kontrol edin: unattended-upgrades logları zamanla büyüyebilir. /etc/logrotate.d/unattended-upgrades dosyasını kontrol edin.
  • Monitoring sisteminiziyle entegre edin: Başarısız güncellemeleri Zabbix, Nagios veya Grafana’da alert olarak tanımlayın.
  • Rollback planınız olsun: Özellikle kritik paketlerin güncellenmesi durumunda bir önceki versiyona dönme prosedürünüzü bilmeniz gerekiyor.

Konfigürasyonu Doğrulama

Her şeyi kurduğunuzda, yapılandırmanın doğru çalışıp çalışmadığını doğrulamak için şu komutu kullanabilirsiniz:

apt-config dump APT::Periodic

Çıktı şöyle görünmeli:

APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::AutocleanInterval "7";
APT::Periodic::Unattended-Upgrade "1";

Ayrıca hangi paketlerin güncelleme kuyruğunda olduğunu görmek için:

apt list --upgradable 2>/dev/null

Sonuç

Debian sunucularınızda otomatik güvenlik güncellemelerini yapılandırmak, sistem güvenliğinizi artırmanın en verimli yollarından biri. unattended-upgrades paketi, doğru yapılandırıldığında güvenlik yamalarını otomatik uygularken sisteminizin istikrarını koruyabilir.

Özetlemek gerekirse kritik adımlar şunlar: paketi kurun, /etc/apt/apt.conf.d/50unattended-upgrades dosyasında sadece güvenlik kaynaklarını etkinleştirin, e-posta bildirimlerini yapılandırın, yeniden başlatma davranışını ortamınıza göre ayarlayın ve düzenli olarak logları kontrol edin.

Otomatik güncelleme sistemi bir kez kurulunca “kur ve unut” mantığıyla çalışmaz. Düzenli log kontrolü, test ortamında doğrulama ve monitoring entegrasyonu bu sistemin sağlıklı çalışması için şart. Ama doğru kurulduğunda, gecenin 3’ünde Log4Shell benzeri bir açık için sunuculara acele bağlanmak yerine huzur içinde uyuyabilirsiniz.

Yorum yapın