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.