Οι περισσότερες επιτυχημένες παραβιάσεις διακομιστών δεν γίνονται με έξυπνες εκμεταλλεύσεις αλλά μέσω μιας ευπάθειας της οποίας η διόρθωση είχε βγει αρκετούς μήνες νωρίτερα. Η αιτία συνήθως δεν είναι η τεμπελιά: η χειροκίνητη ενημέρωση σε διακομιστή σε λειτουργία είναι τρομακτική, επειδή το 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".

Τι μένει για τον άνθρωπο

Οι αυτόματες ενημερώσεις αφαιρούν τη ρουτίνα αλλά όχι την παρακολούθηση. Δύο ερωτήματα που πρέπει να μπορείτε να απαντήσετε ανά πάσα στιγμή: πόσες ενημερώσεις ασφαλείας περιμένουν και αν έχει τεθεί η σημαία επανεκκίνησης. Και οι δύο απαντήσεις είναι μία γραμμή σε μια σελίδα, και όλο το νόημα είναι η γραμμή να τραβά το βλέμμα σας από μόνη της αντί με δική σας πρωτοβουλία μία φορά το τρίμηνο.