Ubuntu Güvenlik Güncellemeleri ve unattended-upgrades ile Otomatik Güncelleme Yönetimi

Sunucularınızı güvende tutmak için en temel görevlerden biri güvenlik güncellemelerini zamanında uygulamaktır. Ama gerçekçi olalım: onlarca, belki yüzlerce sunucuyu yönetiyorsanız her birine tek tek bağlanıp apt upgrade yazmak hem zaman kaybı hem de insan hatasına açık bir süreç. İşte tam bu noktada Ubuntu’nun unattended-upgrades paketi hayat kurtarıcı oluyor. Bu yazıda güvenlik güncellemelerini otomatize etmenin tüm detaylarını, dikkat etmeniz gereken noktaları ve gerçek dünya senaryolarını ele alacağız.

unattended-upgrades Nedir ve Neden Kullanmalısınız?

unattended-upgrades, Ubuntu ve Debian tabanlı sistemlerde güvenlik güncellemelerini otomatik olarak indirip uygulayan bir araçtır. Temel amacı, sistem yöneticisinin müdahalesi olmadan kritik güvenlik yamalarının sisteme uygulanmasını sağlamaktır.

Peki neden bu kadar önemli? Şöyle düşünün: 2021 yılında Log4Shell açığı duyurulduğunda, yaması yayınlandıktan sonraki ilk 12 saat içinde aktif saldırılar başladı. O 12 saatte manuel güncelleme yapma şansınız olmayabilir. Ama unattended-upgrades yapılandırılmışsa, sistem sabah 6’da uyurken kendini yamıştır bile.

Faydaları şöyle sıralayabiliriz:

  • Zaman tasarrufu: Her sunucuya tek tek bağlanma zorunluluğu ortadan kalkar
  • Hız: Güvenlik açıkları duyurulduğu anda yama uygulanır
  • Tutarlılık: İnsan hatası minimize edilir
  • Denetim: Tüm güncellemeler loglanır, izlenebilir

Tabii ki bu araçla her şeyi otomatize etmek istemeyebilirsiniz. Üretim ortamında çekirdek güncellemeleri veya büyük paket yükseltmeleri dikkatli ele alınmalı. Bunu nasıl yapılandıracağınızı da bu yazıda göreceğiz.

Kurulum

Ubuntu 20.04 ve 22.04’te unattended-upgrades genellikle önceden kurulu gelir. Ama her ihtimale karşı kontrol edelim ve gerekirse kuralım:

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

apt-listchanges paketini de kuruyoruz çünkü güncelleme öncesinde değişiklik notlarını görmek ve e-posta bildirimi almak için işimize yarayacak.

Kurulumdan sonra servisi etkinleştirmek için:

sudo systemctl enable unattended-upgrades
sudo systemctl start unattended-upgrades
sudo systemctl status unattended-upgrades

Temel Yapılandırma

Ana yapılandırma dosyası /etc/apt/apt.conf.d/50unattended-upgrades dosyasıdır. Bu dosyayı bir metin editörüyle açalım:

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

Dosyanın içeriği ilk açıldığında biraz korkutucu görünebilir ama aslında oldukça mantıklı bir yapısı var. En kritik bölüm Unattended-Upgrade::Allowed-Origins bloğu:

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

Burada // ile başlayan satırlar yorum satırıdır, yani devre dışıdır. Varsayılan olarak sadece -security deposu aktif gelir ki bu çoğu üretim ortamı için doğru yaklaşımdır.

Eğer -updates deposundan da güncelleme almak istiyorsanız (ki bazı ortamlarda mantıklı olabilir), o satırın başındaki // işaretlerini kaldırmanız yeterli.

Önemli Yapılandırma Parametreleri

Dosyadaki diğer kritik parametreleri inceleyelim:

// Otomatik reboot - DİKKATLİ KULLANIN
Unattended-Upgrade::Automatic-Reboot "false";

// Otomatik reboot için saat belirleme
Unattended-Upgrade::Automatic-Reboot-Time "02:00";

// Güncelleme sırasında kullanıcı bağlıysa ne yapılsın
Unattended-Upgrade::Automatic-Reboot-WithUsers "false";

// Kullanılmayan bağımlılıkları temizle
Unattended-Upgrade::Remove-Unused-Dependencies "true";

// E-posta bildirimi için
Unattended-Upgrade::Mail "[email protected]";

// Sadece hata durumunda mı mail atılsın?
Unattended-Upgrade::MailOnlyOnError "false";

// Minimum disk alanı (MB cinsinden)
Unattended-Upgrade::MinimalSteps "true";

Automatic-Reboot parametresi hakkında özellikle durmak istiyorum. Üretim sunucularında bunu false bırakmanızı şiddetle tavsiye ederim. Çekirdek güncellemesi sonrası reboot gerektiğinde bunu kendiniz planlayın, bir bakım penceresi açın. Ama test ortamında veya kritik olmayan sunucularda true yapıp saatini gece 2-3’e ayarlayabilirsiniz.

Güncelleme Zamanlaması Ayarları

İkinci önemli yapılandırma dosyası /etc/apt/apt.conf.d/20auto-upgrades dosyasıdır:

sudo nano /etc/apt/apt.conf.d/20auto-upgrades

İçeriği şu şekilde olmalı:

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

Bu parametreler şu anlama geliyor:

  • Update-Package-Lists “1”: Paket listelerini her gün güncelle
  • Download-Upgradeable-Packages “1”: Güncellemeleri her gün indir
  • AutocleanInterval “7”: 7 günde bir eski paketleri temizle
  • Unattended-Upgrade “1”: Her gün otomatik güncelleme yap

Buradaki sayılar gün cinsinden. Örneğin "2" yazarsanız her 2 günde bir çalışır. "0" ise devre dışı anlamına gelir.

Alternatif olarak bu dosyayı dpkg-reconfigure ile de oluşturabilirsiniz:

sudo dpkg-reconfigure -plow unattended-upgrades

Bu komut sizden interactive olarak “otomatik güncellemeleri etkinleştir mi?” diye sorar ve dosyayı otomatik oluşturur.

Belirli Paketleri Hariç Tutma

Bazı paketlerin otomatik güncellenmesini istemeyebilirsiniz. Örneğin özel bir MySQL versiyonuna bağımlı bir uygulamanız var ve MySQL’in otomatik güncellenmesi sorun çıkarabilir. Bu durumda blacklist kullanabilirsiniz:

Unattended-Upgrade::Package-Blacklist {
    "mysql-server";
    "mysql-client";
    "nginx";
    "php8.1-fpm";
    "linux-image";
    "linux-headers";
};

Bu bloğu /etc/apt/apt.conf.d/50unattended-upgrades dosyasına ekleyin. Regex de kullanabilirsiniz:

Unattended-Upgrade::Package-Blacklist {
    "mysql.*";
    "php.*";
};

Bu sayede tüm MySQL ve PHP paketleri otomatik güncelleme kapsamı dışında kalır.

Yapılandırmayı Test Etme

Yapılandırmanızın doğru çalışıp çalışmadığını test etmek için --dry-run parametresini kullanın. Bu parametre gerçekte hiçbir şey yapmaz, sadece ne yapacağını gösterir:

sudo unattended-upgrade --dry-run --debug

Çıktıda hangi paketlerin güncelleneceğini, hangilerinin blacklist nedeniyle atlandığını görebilirsiniz. Bu komutu bir değişiklik yaptıktan sonra mutlaka çalıştırın.

Gerçek bir güncelleme yapmak istiyorsanız (zamanlanmayı beklemeden):

sudo unattended-upgrade --debug

Log Takibi

Sistemin ne yaptığını takip etmek için log dosyalarını düzenli kontrol etmelisiniz:

# Ana unattended-upgrades log dosyası
cat /var/log/unattended-upgrades/unattended-upgrades.log

# Son 50 satır
tail -50 /var/log/unattended-upgrades/unattended-upgrades.log

# Gerçek zamanlı takip
tail -f /var/log/unattended-upgrades/unattended-upgrades.log

Bir de dpkg log dosyasına bakabilirsiniz, burası tüm paket kurulum/güncelleme işlemlerini kaydeder:

grep "upgrade" /var/log/dpkg.log | tail -30

Sağlıklı bir unattended-upgrades log çıktısı şuna benzer:

2024-01-15 06:32:15,847 INFO Starting unattended upgrades script
2024-01-15 06:32:16,203 INFO Allowed origins are: [...]
2024-01-15 06:32:18,445 INFO Packages that will be upgraded: libssl3 openssl
2024-01-15 06:32:45,112 INFO All upgrades installed

Reboot Gerektiren Güvenceleri Yönetme

Çekirdek güncellemeleri ve bazı kritik kütüphane güncellemeleri (libssl gibi) sistem yeniden başlatması gerektirir. Bunu /var/run/reboot-required dosyasından anlayabilirsiniz:

ls -la /var/run/reboot-required
cat /var/run/reboot-required.pkgs

reboot-required dosyası mevcutsa yeniden başlatma bekleniyor demektir. reboot-required.pkgs dosyası ise hangi paketlerin bu gereksinimi tetiklediğini listeler.

Bu kontrolü otomatize etmek için bir script yazabilirsiniz:

#!/bin/bash
# /usr/local/bin/check-reboot.sh

if [ -f /var/run/reboot-required ]; then
    PKGS=$(cat /var/run/reboot-required.pkgs)
    HOSTNAME=$(hostname)
    echo "UYARI: $HOSTNAME sunucusu yeniden baslama bekliyor!"
    echo "Sebep olan paketler:"
    echo "$PKGS"
    # Buraya mail veya Slack bildirimi ekleyebilirsiniz
fi

Bu scripti crontab’a ekleyerek sabah 8’de size bildirim gönderebilirsiniz:

0 8 * * * /usr/local/bin/check-reboot.sh | mail -s "Reboot Gerekli: $(hostname)" [email protected]

Gerçek Dünya Senaryosu: Çok Sunuculu Ortam

Diyelim ki 20 Ubuntu sunucunuzu yönetiyorsunuz. Hepsine aynı yapılandırmayı uygulamak için Ansible kullanabilirsiniz. İşte basit bir Ansible task örneği:

# Önce yapılandırma dosyasını hazırlayın
# /etc/ansible/roles/unattended-upgrades/files/50unattended-upgrades

# Sonra sunuculara dağıtmak için:
ansible all -m apt -a "name=unattended-upgrades state=present" -b
ansible all -m copy -a "src=50unattended-upgrades dest=/etc/apt/apt.conf.d/50unattended-upgrades" -b
ansible all -m systemd -a "name=unattended-upgrades enabled=yes state=started" -b

Ansible yoksa basit bir SSH döngüsüyle de yapabilirsiniz:

#!/bin/bash
# deploy-unattended-upgrades.sh

SERVERS="web01 web02 web03 db01 db02"

for SERVER in $SERVERS; do
    echo "Yapilandiriliyor: $SERVER"
    scp /etc/apt/apt.conf.d/50unattended-upgrades $SERVER:/tmp/
    ssh $SERVER "sudo mv /tmp/50unattended-upgrades /etc/apt/apt.conf.d/ && sudo systemctl restart unattended-upgrades"
    echo "$SERVER tamamlandi"
done

Güvenlik Güncellemelerini Manuel Kontrol Etme

Otomatik güncelleme var diye elle kontrol yapmayı bırakmayın. Haftada bir kez şu komutla bekleyen güncellemelere bakın:

sudo apt list --upgradable 2>/dev/null | grep -i security

Ya da apt-get ile daha detaylı bir kontrol:

sudo apt-get -s upgrade | grep "^Inst" | grep -i security

-s parametresi simulate anlamına gelir, gerçekte bir şey yapılmaz.

Ubuntu Security Notices’ı da takip etmelisiniz. USN (Ubuntu Security Notice) sistemi kritik güvenlik açıklarını duyurur. ubuntu-security-notices paketini kurarak bunları e-posta ile alabilirsiniz, ya da RSS feed’ini takip edebilirsiniz.

E-posta Bildirimi Yapılandırması

unattended-upgrades‘in e-posta göndermesi için sistemde bir mail transfer agent (MTA) kurulu olması gerekir. En yaygın ve basit çözüm postfix + mailutils kombinasyonu ya da sadece bir SMTP relay:

sudo apt install postfix mailutils -y

Kurulum sırasında “Internet Site” veya “Satellite System” seçeneğini tercih edebilirsiniz. Eğer bir SMTP relay (Gmail, SendGrid vb.) kullanacaksanız /etc/postfix/main.cf dosyasını buna göre yapılandırın.

Sonra 50unattended-upgrades dosyasında mail ayarını aktif edin:

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

MailReport için seçenekler:

  • “always”: Her güncelleme sonrası mail gönder
  • “only-on-error”: Sadece hata olursa mail gönder
  • “on-change”: Güncelleme yapıldığında mail gönder

Test etmek için:

echo "Test mail" | mail -s "Unattended-Upgrades Test" [email protected]

Sorun Giderme

Zaman zaman unattended-upgrades beklendiği gibi çalışmayabilir. İşte yaygın sorunlar ve çözümleri:

Servis çalışmıyor:

sudo systemctl status unattended-upgrades
sudo journalctl -u unattended-upgrades -n 50

Lock dosyası sorunu: Bazen dpkg kilidi açık kalır:

sudo lsof /var/lib/dpkg/lock-frontend
sudo rm /var/lib/dpkg/lock-frontend
sudo dpkg --configure -a

Güncelleme yapılmıyor ama hata da yok: apt-daily timer’larını kontrol edin:

systemctl list-timers | grep apt
sudo systemctl status apt-daily.timer
sudo systemctl status apt-daily-upgrade.timer

Bu timer’lar beklenmedik bir durumda devre dışı kalmış olabilir. Aktif etmek için:

sudo systemctl enable apt-daily.timer
sudo systemctl enable apt-daily-upgrade.timer
sudo systemctl start apt-daily.timer
sudo systemctl start apt-daily-upgrade.timer

Güvenlik Güncellemeleri Sonrası Doğrulama

Güncelleme yapıldıktan sonra sistemin sağlıklı olduğunu doğrulamak önemlidir. Bunun için basit bir health check scripti yazabilirsiniz:

#!/bin/bash
# /usr/local/bin/post-update-check.sh

echo "=== Sistem Saglik Kontrolu ==="
echo "Tarih: $(date)"
echo ""

# Kritik servisleri kontrol et
SERVICES="nginx mysql postgresql ssh"
for SVC in $SERVICES; do
    if systemctl is-active --quiet $SVC 2>/dev/null; then
        echo "[OK] $SVC calisiyor"
    else
        echo "[UYARI] $SVC calısmiyor!"
    fi
done

# Disk alanı kontrolü
echo ""
echo "=== Disk Alani ==="
df -h / | tail -1

# Reboot gerekiyor mu?
echo ""
if [ -f /var/run/reboot-required ]; then
    echo "[BILGI] Sistem yeniden baslatma bekliyor"
    cat /var/run/reboot-required.pkgs
else
    echo "[OK] Yeniden baslatma gerekmiyor"
fi

Bu scripti unattended-upgrades‘in çalıştığı saatin hemen sonrasına crontab’a ekleyin. Güncellemeler genellikle sabah 6-7 arasında çalışır, siz de 7:30’da kontrol yapın.

Üretim Ortamı için Önerilen Yapılandırma

Yıllarca Ubuntu sunucu yönetimi sonucunda geldiğim ideal yapılandırmayı paylaşayım:

Güvenlik güncellemeleri her zaman otomatik uygulanır. Yalnızca güvenlik deposu aktif bırakılır. Blacklist’e MySQL, PostgreSQL, Nginx ve PHP gibi uygulama kritik paketler eklenir. Çekirdek güncellemeleri de blacklist’e alınıp bakım pencerelerinde manuel uygulanır. E-posta bildirimi açık tutulur ve her güncelleme loglanır. Reboot asla otomatik yapılmaz, her yeniden başlatma için bakım penceresi açılır.

Bu yaklaşım hem güvenliği hem de servislerin sürekliliğini dengeler. Kritik bir güvenlik açığı yamalanırken uygulamanız çökmez.

Sonuç

unattended-upgrades, Ubuntu sunucu güvenliğinin temel taşlarından biridir. Doğru yapılandırıldığında sizi günlük güncelleme yükünden kurtarır, güvenlik açıklarını hızla kapatır ve sistemlerinizi saldırılara karşı daha dirençli kılar.

Önemli olan denge kurmaktır: Güvenlik güncellemelerini otomatize edin ama uygulama kritik güncellemeleri için manuel kontrol mekanizması bulundurun. Log dosyalarını düzenli takip edin, e-posta bildirimlerini aktif tutun ve reboot gereksinimlerini gözden kaçırmayın.

Şunu da unutmayın: unattended-upgrades bir güvenlik çözümü değil, güvenlik araçlarından biridir. Güvenlik duvarı, intrusion detection, log analizi gibi diğer katmanlarla birlikte kullanıldığında gerçek anlamda değer kazanır. Ama bu katmanların hepsinin temeli, yama yönetimiyle başlar. Ve o temeli atmak için bugün daha iyi bir zaman yoktur.

Yorum yapın