Aggiornamenti automatici di sicurezza su Ubuntu: come configurare unattended-upgrades su un VPS

Quando esce una patch critica come quella di PHP2Shell, il tempo che passa tra la pubblicazione e l’installazione è il periodo in cui il server è più esposto. Su un VPS gestito da una sola persona quel tempo dipende da quando ci si ricorda di collegarsi via SSH. Con unattended-upgrades Ubuntu scarica e installa da solo gli aggiornamenti di sicurezza, di notte, senza che tu debba fare nulla.

Funziona bene, ma ha un limite che su un server con OpenLiteSpeed conta parecchio, e lo vediamo dopo.

Leggi anche: PHP, aggiornamento di sicurezza critico: cosa fare su aaPanel e sul proprio server

Pubblicità

Cosa fa e cosa non fa per impostazione predefinita

Sulle installazioni server di Ubuntu il servizio è quasi sempre già presente e attivo. Di base installa solo gli aggiornamenti di sicurezza che arrivano dai repository ufficiali di Ubuntu. Non tocca i pacchetti che arrivano da repository esterni, e questo include openlitespeed e tutti i pacchetti lsphp, che provengono dal repository di LiteSpeed. Se ti affidi alla configurazione standard, il kernel e le librerie di sistema si aggiornano da soli, mentre PHP resta alla versione che hai installato a mano. Per una falla in PHP è il caso peggiore.

Leggi anche: Vulnerabilità PHP e Server Web: Come Aggiornare OpenLiteSpeed su VPS Ubuntu

1. Verificare che sia installato e attivo

sudo apt update
sudo apt install -y unattended-upgrades apt-listchanges
systemctl status unattended-upgrades
systemctl list-timers 'apt-daily*'

Se vuoi attivarlo con la procedura guidata:

sudo dpkg-reconfigure -plow unattended-upgrades

Il comando crea il file /etc/apt/apt.conf.d/20auto-upgrades con questo contenuto, che puoi controllare e correggere a mano se serve:

APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";

Il valore 1 significa una volta al giorno.

2. Le impostazioni personalizzate in un file a parte

Il file principale è /etc/apt/apt.conf.d/50unattended-upgrades, ma conviene non modificarlo. Se lo cambi e il pacchetto viene aggiornato, apt ti chiede cosa fare con le differenze e si finisce per confondersi. Crea invece un file tuo, che viene letto dopo:

sudo nano /etc/apt/apt.conf.d/52unattended-upgrades-local

Contenuto di partenza:

Unattended-Upgrade::Remove-Unused-Dependencies "true";
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "04:30";
Unattended-Upgrade::Mail "tuamail@tuodominio.it";
Unattended-Upgrade::MailReport "only-on-error";

Cosa fanno queste righe:

  • Remove-Unused-Dependencies elimina i pacchetti rimasti orfani dopo gli aggiornamenti, così il disco non si riempie di vecchi kernel.
  • Automatic-Reboot riavvia il server quando un aggiornamento lo richiede, in genere dopo un nuovo kernel. L’orario è fissato alle 4:30, quando di solito c’è meno traffico. Se il sito non può permettersi nemmeno un minuto di interruzione, metti "false" e controlla ogni tanto se esiste il file /var/run/reboot-required.
  • Mail e MailReport mandano un messaggio solo quando qualcosa va storto. Con "always" ricevi un resoconto ogni volta, con "on-change" solo quando viene installato qualcosa.

Per far arrivare le email il server deve avere un programma per spedirle. Senza, la riga viene ignorata senza errori. Se non hai già un MTA configurato, installa msmtp-mta o postfix in modalità solo invio.

3. Includere PHP e OpenLiteSpeed

Per far aggiornare automaticamente anche i pacchetti di LiteSpeed devi dire a unattended-upgrades di fidarsi di quel repository. Prima scopri come si identifica:

grep -h -E "^(Origin|Label|Suite|Codename):" /var/lib/apt/lists/*litespeed*Release

Ti restituisce righe come Origin: e Codename:. Usa i valori che trovi tu, non quelli di un esempio, perché devono corrispondere esattamente. Poi aggiungi nel file 52unattended-upgrades-local, sostituendo VALORE_ORIGIN con il testo che compare dopo Origin::

Unattended-Upgrade::Origins-Pattern {
    "origin=VALORE_ORIGIN,codename=${distro_codename}";
};

Fai una prova prima di fidarti:

sudo unattended-upgrade --dry-run --debug 2>&1 | grep -i -E "lsphp|litespeed|allowed origins"

Nell’elenco delle origini consentite deve comparire anche quella di LiteSpeed. Se i pacchetti lsphp risultano aggiornabili, vedrai che verrebbero installati.

Prima di attivare tutto questo, valuta una cosa. Gli aggiornamenti dei pacchetti lsphp restano nello stesso ramo (8.3 resta 8.3), quindi i rischi di incompatibilità sono bassi, ma non nulli. Se gestisci siti per clienti e un plugin vecchio potrebbe reagire male, puoi lasciare PHP fuori dagli aggiornamenti automatici e programmare tu un controllo settimanale. In quel caso la procedura con snapshot e rollback che trovi nella guida all’aggiornamento di lsphp su OpenLiteSpeed è il metodo giusto.

4. Il riavvio dopo l’aggiornamento di PHP

C’è un dettaglio che si dimentica facilmente. Quando un pacchetto lsphp viene aggiornato, i processi PHP già in esecuzione continuano a usare il codice vecchio fino a quando non vengono riavviati. Una patch installata ma non ancora caricata non ti protegge. Il riavvio automatico dell’intero server alle 4:30 risolve il problema solo quando c’è un nuovo kernel. Per essere sicuro puoi programmare un riavvio notturno di OpenLiteSpeed:

sudo crontab -e
30 4 * * * /usr/local/lsws/bin/lswsctrl restart

È un riavvio che non interrompe le connessioni in corso e dura pochi secondi.

5. Escludere pacchetti delicati

Se ci sono pacchetti che preferisci aggiornare a mano, per esempio il database, puoi escluderli:

Unattended-Upgrade::Package-Blacklist {
    "mariadb-server";
    "mysql-server";
};

Un riavvio del database fatto in automatico, nel momento sbagliato, può interrompere un’operazione di scrittura. Per molti è meglio decidere quando farlo.

6. Controllare che stia funzionando

La prima prova è il test a secco, che mostra cosa verrebbe fatto senza installare niente:

sudo unattended-upgrade --dry-run --debug

Dopo qualche giorno guarda il registro delle operazioni:

sudo tail -n 50 /var/log/unattended-upgrades/unattended-upgrades.log

Per vedere se serve un riavvio:

cat /var/run/reboot-required 2>/dev/null

Se il file non esiste, il server è aggiornato e non c’è nulla in sospeso.

Dove ti protegge e dove no

Gli aggiornamenti automatici coprono il sistema operativo e, se li hai configurati come sopra, anche PHP e OpenLiteSpeed. Non toccano WordPress, i plugin e i temi, che si aggiornano a parte. Per quelli puoi usare gli aggiornamenti automatici integrati di WordPress oppure WP-CLI da cron. Se vuoi approfondire le opzioni lato WordPress, trovi le costanti utili nella guida ai comandi per wp-config.php.

Leggi anche: PHP2Shell: come limitare i danni di una falla PHP con disable_functions e blocco dei file in uploads

Tieni sempre uno snapshot recente del VPS. L’aggiornamento automatico è comodo, ma è l’unico caso in cui qualcosa cambia sul server mentre non ci sei. Se una notte va storto qualcosa, ripristinare è molto più veloce che cercare la causa.

Altro per te

PHP
PHP Compatibility Checker
Controlla il tuo plugin WordPress prima di aggiornare PHP Verifica la compatibilità con PHP 8.0–8.5 Scopri eventuali problemi nel codice PHP Analizza il tuo plugin WordPress online Preparati a PHP 8.5
Verifica ora →
PDF Strumenti PDF gratis Nel browser, senza upload Apri gli strumenti

🔒

Contenuto riservato

Per scaricare questo file devi prima registrarti oppure accedere con il tuo account.

XWhatsAppTelegram