Οι περισσότερες επιτυχημένες παραβιάσεις διακομιστών δεν γίνονται με έξυπνες εκμεταλλεύσεις αλλά μέσω μιας ευπάθειας της οποίας η διόρθωση είχε βγει αρκετούς μήνες νωρίτερα. Η αιτία συνήθως δεν είναι η τεμπελιά: η χειροκίνητη ενημέρωση σε διακομιστή σε λειτουργία είναι τρομακτική, επειδή το apt upgrade ενίοτε επανεκκινεί πράγματα που κανείς δεν του ζήτησε. Οι αυτόματες ενημερώσεις κλείνουν το ζήτημα, αλλά έχουν κακή φήμη — δικαιολογημένη ακριβώς στον βαθμό που ρυθμίζονται βιαστικά.
Ας δούμε μια διάταξη όπου οι διορθώσεις ασφαλείας έρχονται μόνες τους και η έκδοση της PHP δεν αλλάζει μέσα στη νύχτα.
Εγκατάσταση
sudo apt install unattended-upgrades apt-listchanges
sudo dpkg-reconfigure -plow unattended-upgrades
Ο διάλογος δημιουργεί το /etc/apt/apt.conf.d/20auto-upgrades. Ελέγξτε τι προέκυψε από αυτόν:
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
Οι μονάδες σημαίνουν «καθημερινά». Όλα αυτά τα οδηγεί ένας χρονομετρητής systemd και όχι το κλασικό cron:
systemctl list-timers | grep apt
Το κύριο: μόνο ασφάλεια
Το βασικό αρχείο είναι το /etc/apt/apt.conf.d/50unattended-upgrades. Περιέχει λίστα Allowed-Origins (στο Debian, Origins-Pattern) και από προεπιλογή είναι ενεργό εκεί μόνο το αποθετήριο ασφαλείας. Αφήστε το έτσι.
Ο πειρασμός να αφαιρέσετε το σχόλιο από τη γραμμή -updates — «ας ενημερώνονται όλα» — είναι ισχυρός. Μην το κάνετε: το αποθετήριο ενημερώσεων φέρνει νέες εκδόσεις, όχι μόνο διορθώσεις, και από εκεί ακριβώς έρχονται οι νυχτερινές εκπλήξεις. Η ασφάλεια και η φρεσκάδα είναι διαφορετικές δουλειές, και η δεύτερη γίνεται καλύτερα με το χέρι όσο είστε μπροστά στο πληκτρολόγιο.
Αν κάποιο πακέτο δεν πρέπει να ενημερώνεται αυτόματα, υπάρχει μαύρη λίστα γι' αυτό:
Unattended-Upgrade::Package-Blacklist {
"mariadb-server";
"php8.3-fpm";
};
Χρησιμοποιήστε τη συνειδητά: κάθε γραμμή εδώ σημαίνει «αυτό το ενημερώνω μόνος μου» — και είναι μια υπόσχεση που θα πρέπει να τηρήσετε.
Επανεκκινήσεις
Η κρίσιμη γραμμή:
Unattended-Upgrade::Automatic-Reboot "false";
Το να την αφήσετε σε false είναι σωστό για διακομιστή με ιστότοπο: μια απροειδοποίητη επανεκκίνηση στις τρεις τα ξημερώματα είναι χειρότερη από μια διόρθωση που καθυστέρησε μία μέρα. Αλλά αυτή η απόφαση έχει υποχρεωτικό δεύτερο μισό, και είναι το μισό που ξεχνιέται.
Όταν ενημερώνεται ο πυρήνας, η libc ή το openssl, το σύστημα δημιουργεί το αρχείο /var/run/reboot-required. Μέχρι να γίνει επανεκκίνηση, η διορθωμένη έκδοση βρίσκεται στον δίσκο ενώ η παλιά τρέχει στη μνήμη — δηλαδή η ευπάθεια δεν πήγε πουθενά, αν και το πακέτο θεωρείται ενημερωμένο. Ελέγξτε ρητά:
ls -l /var/run/reboot-required
cat /var/run/reboot-required.pkgs
Το δεύτερο αρχείο απαριθμεί ακριβώς τι κατέστησε αναγκαία την επανεκκίνηση. Ο κανόνας είναι απλός: μόλις δείτε τη σημαία, προγραμματίστε παράθυρο μέσα στην επόμενη μία δυο μέρες, όχι «κάποια στιγμή».
Οι βιβλιοθήκες είναι ξεχωριστή περίπτωση. Το openssl ενημερώνεται ενώ ο nginx και το PHP-FPM συνεχίζουν να τρέχουν με την παλιά έκδοση στη μνήμη, και δεν εμφανίζεται καμία σημαία επανεκκίνησης. Ποιος χρειάζεται επανεκκίνηση το δείχνει το needrestart:
sudo apt install needrestart
sudo needrestart -b
Βάλτε το απλώς σε λειτουργία «ανάφερε, μη ρωτάς» — αλλιώς θα αρχίσει να κάνει ερωτήσεις στη μέση μιας μη διαδραστικής εγκατάστασης και θα την κρεμάσει. Γι' αυτό, αφήστε ένα αρχείο στο /etc/needrestart/conf.d/ με τη γραμμή $nrconf{restart} = 'l';.
Ελέγξτε ότι δουλεύει καν
Δοκιμαστική εκτέλεση χωρίς εγκατάσταση:
sudo unattended-upgrade --dry-run --debug
Η έξοδος δείχνει ποια πακέτα ταιριάζουν με τους κανόνες και ποια απορρίφθηκαν και γιατί. Τι έγινε πραγματικά βρίσκεται στα αρχεία καταγραφής:
sudo tail -50 /var/log/unattended-upgrades/unattended-upgrades.log
Πόσες ενημερώσεις περιμένουν αυτή τη στιγμή:
apt list --upgradable 2>/dev/null | grep -i security
Αυτή η τελευταία εντολή είναι η πιο χρήσιμη από όλες. Οι ρυθμισμένες αυτόματες ενημερώσεις έχουν τη συνήθεια να χαλάνε αθόρυβα: το /boot γέμισε, ένα αποθετήριο άλλαξε κλειδί, ο χρονομετρητής απενεργοποιήθηκε μετά από κάποια χειροκίνητη αλλαγή. Εξωτερικά όλα καλά, και διορθώσεις δεν έχουν εγκατασταθεί εδώ και μήνες.
Χώρος στο /boot
Κλασικό: οι παλιοί πυρήνες δεν αφαιρούνται, το διαμέρισμα /boot γεμίζει, η εγκατάσταση νέου πυρήνα αποτυγχάνει και οι ενημερώσεις σταματούν συνολικά. Μία φορά κάθε λίγους μήνες αξίζει μια ματιά:
df -h /boot
sudo apt autoremove --purge
Ή ενεργοποιήστε τον αυτόματο καθαρισμό στο ίδιο 50unattended-upgrades: Remove-Unused-Kernel-Packages "true" και Remove-Unused-Dependencies "true".
Τι μένει για τον άνθρωπο
Οι αυτόματες ενημερώσεις αφαιρούν τη ρουτίνα αλλά όχι την παρακολούθηση. Δύο ερωτήματα που πρέπει να μπορείτε να απαντήσετε ανά πάσα στιγμή: πόσες ενημερώσεις ασφαλείας περιμένουν και αν έχει τεθεί η σημαία επανεκκίνησης. Και οι δύο απαντήσεις είναι μία γραμμή σε μια σελίδα, και όλο το νόημα είναι η γραμμή να τραβά το βλέμμα σας από μόνη της αντί με δική σας πρωτοβουλία μία φορά το τρίμηνο.