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 paketlerDebian: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-upgradeslogları zamanla büyüyebilir./etc/logrotate.d/unattended-upgradesdosyası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.