Başarılı sunucu sızmalarının çoğu zekice istismarlarla değil, yaması aylar önce çıkmış bir açıkla gerçekleşir. Nedeni genellikle tembellik değildir: çalışan bir sunucuda elle güncelleme yapmak korkutucudur, çünkü apt upgrade bazen kimsenin yeniden başlatmasını istemediği şeyleri yeniden başlatır. Otomatik güncellemeler bu meseleyi kapatır, ama kötü bir üne sahiptirler — tam da aceleyle yapılandırıldıkları ölçüde hak edilmiş bir ün.
Güvenlik yamalarının kendiliğinden geldiği ve PHP sürümünün gece boyunca değişmediği bir kurulumu adım adım geçelim.
Kurulum
sudo apt install unattended-upgrades apt-listchanges
sudo dpkg-reconfigure -plow unattended-upgrades
Diyalog /etc/apt/apt.conf.d/20auto-upgrades dosyasını oluşturur. Ondan ne çıktığını kontrol edin:
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
Birler «günlük» anlamına gelir. Bunların tamamını klasik cron değil, bir systemd zamanlayıcısı yürütür:
systemctl list-timers | grep apt
Asıl mesele: yalnızca güvenlik
Ana dosya /etc/apt/apt.conf.d/50unattended-upgrades dosyasıdır. İçinde bir Allowed-Origins listesi (Debian’da Origins-Pattern) bulunur ve varsayılan olarak orada yalnızca güvenlik deposu etkindir. Öyle bırakın.
-updates satırının yorumunu kaldırma isteği — «bırak her şey güncellensin» — güçlüdür. Yapmayın: güncelleme deposu yalnızca düzeltmeleri değil, yeni sürümleri de getirir ve gece sürprizleri tam olarak oradan çıkar. Güvenlik ile güncellik farklı işlerdir ve ikincisi klavye başındayken elle yapılsa daha iyidir.
Bir paket otomatik olarak güncellenmemeliyse, bunun için bir kara liste vardır:
Unattended-Upgrade::Package-Blacklist {
"mariadb-server";
"php8.3-fpm";
};
Bilinçli kullanın: buradaki her satır «bunu ben kendim güncellerim» demektir — ve bu, tutmanız gereken bir sözdür.
Yeniden başlatmalar
Anahtar satır:
Unattended-Upgrade::Automatic-Reboot "false";
Bunu false bırakmak, sitesi olan bir sunucu için doğrudur: gecenin üçünde habersiz bir yeniden başlatma, bir gün ertelenmiş bir yamadan daha kötüdür. Ama bu kararın zorunlu bir ikinci yarısı vardır ve unutulan da o yarıdır.
Çekirdek, libc ya da openssl güncellendiğinde sistem /var/run/reboot-required dosyasını oluşturur. Yeniden başlatma gerçekleşene kadar düzeltilmiş sürüm diskte, eskisi ise bellekte çalışır durumdadır — yani paket güncellenmiş sayılsa da açık hiçbir yere gitmemiştir. Bunu açıkça kontrol edin:
ls -l /var/run/reboot-required
cat /var/run/reboot-required.pkgs
İkinci dosya, yeniden başlatmayı tam olarak neyin gerekli kıldığını listeler. Kural basittir: bayrağı gördüğünüz anda «bir ara» değil, önümüzdeki bir iki gün içinde bir pencere planlayın.
Kütüphaneler ayrı bir durumdur. openssl güncellenir, nginx ve PHP-FPM ise bellekteki eski sürümle çalışmaya devam eder ve hiçbir yeniden başlatma bayrağı belirmez. Kimin yeniden başlatılması gerektiğini needrestart gösterir:
sudo apt install needrestart
sudo needrestart -b
Onu yalnızca «bildir, sorma» kipine alın — aksi halde etkileşimsiz bir kurulumun ortasında soru sormaya başlar ve kurulumu askıda bırakır. Bunun için /etc/needrestart/conf.d/ içine $nrconf{restart} = 'l'; satırını içeren bir dosya bırakın.
Hiç çalışıp çalışmadığını kontrol edin
Kurulum yapmadan bir deneme çalıştırması:
sudo unattended-upgrade --dry-run --debug
Çıktı hangi paketlerin kurallara uyduğunu, hangilerinin neden reddedildiğini gösterir. Gerçekte ne olduğu günlüklerdedir:
sudo tail -50 /var/log/unattended-upgrades/unattended-upgrades.log
Şu anda kaç güncellemenin beklediği:
apt list --upgradable 2>/dev/null | grep -i security
Bu son komut hepsinin içinde en faydalı olanıdır. Yapılandırılmış otomatik güncellemelerin sessizce bozulma huyu vardır: /boot doldu, bir depo anahtarını değiştirdi, elle bir düzenlemeden sonra zamanlayıcı kapandı. Dışarıdan her şey yolundadır ve aylardır yama kurulmamıştır.
/boot üzerindeki alan
Klasik bir durum: eski çekirdekler silinmez, /boot bölümü dolar, yeni çekirdeğin kurulumu başarısız olur ve güncellemeler bütünüyle durur. Birkaç ayda bir bakmaya değer:
df -h /boot
sudo apt autoremove --purge
Ya da aynı 50unattended-upgrades içinde otomatik temizliği açın: Remove-Unused-Kernel-Packages "true" ve Remove-Unused-Dependencies "true".
İnsana ne kalır
Otomatik güncellemeler rutini ortadan kaldırır, izlemeyi değil. Her an yanıtlayabilmeniz gereken iki soru: kaç güvenlik güncellemesi bekliyor ve yeniden başlatma bayrağı kalkmış mı. İki yanıt da bir sayfadaki birer satırdır ve bütün mesele, o satırın üç ayda bir sizin girişimizle değil, kendiliğinden gözünüze çarpmasıdır.