Většina úspěšných průniků na servery se neděje přes rafinované exploity, ale přes zranitelnost, k níž vyšla záplata před několika měsíci. Příčinou obvykle není lenost: aktualizovat ručně je strašidelné, protože apt upgrade na provozním serveru občas restartuje to, co nikdo restartovat nežádal. Automatické aktualizace věc řeší, ale mají špatnou pověst — zaslouženou přesně v té míře, v jaké se nastavují narychlo.

Projděme si nastavení, při němž bezpečnostní záplaty přijíždějí samy a verze PHP se v noci nemění.

Instalace

sudo apt install unattended-upgrades apt-listchanges
sudo dpkg-reconfigure -plow unattended-upgrades

Dialog vytvoří /etc/apt/apt.conf.d/20auto-upgrades. Zkontrolujte, co v něm vzniklo:

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

Jedničky znamenají „denně“. Celé to spouští časovač systemd, ne klasický cron:

systemctl list-timers | grep apt

Hlavní věc: jen bezpečnost

Hlavní soubor je /etc/apt/apt.conf.d/50unattended-upgrades. Je v něm seznam Allowed-Origins (na Debianu Origins-Pattern) a ve výchozím stavu je tam zapnutý pouze bezpečnostní repozitář. Tak to nechte.

Pokušení odkomentovat řádek s -updates je velké — „ať se aktualizuje všechno“. Nedělejte to: repozitář aktualizací přináší nové verze, ne jen opravy, a právě odtud přilétají noční překvapení. Bezpečnost a novost jsou různé úkoly a druhý se lépe dělá ručně, když sedíte u klávesnice.

Pokud nějaký balíček nesmí být aktualizován automaticky, je pro to černá listina:

Unattended-Upgrade::Package-Blacklist {
    "mariadb-server";
    "php8.3-fpm";
};

Používejte ji uvědoměle: každý řádek zde znamená „tento balíček aktualizuji sám“ — a ten slib bude třeba plnit.

Restarty

Klíčový řádek:

Unattended-Upgrade::Automatic-Reboot "false";

Ponechat false je pro server s webem správné: restart ve tři ráno bez varování je horší než o den odložená záplata jádra. Toto rozhodnutí má ale povinnou druhou polovinu, na kterou se zapomíná.

Když se aktualizuje jádro, libc nebo openssl, systém vytvoří soubor /var/run/reboot-required. Dokud restart neproběhl, na disku leží opravená verze a v paměti běží stará — zranitelnost tedy nikam nezmizela, ačkoli balíček je veden jako aktualizovaný. Kontrolovat je nutné výslovně:

ls -l /var/run/reboot-required
cat /var/run/reboot-required.pkgs

Druhý soubor vyjmenovává, kvůli čemu přesně je restart potřeba. Pravidlo je jednoduché: uviděli jste příznak — naplánujte okno na nejbližší den až dva, ne „někdy“.

Zvláštním případem jsou knihovny. Aktualizoval se openssl, ale nginx a PHP-FPM dál běží se starou verzí v paměti a přitom se žádný příznak restartu neobjeví. Kdo přesně restart potřebuje, ukáže needrestart:

sudo apt install needrestart
sudo needrestart -b

Jen ho přepněte do režimu „ukazovat, ne ptát se“ — jinak se začne ptát uprostřed neinteraktivní instalace a zasekne ji. K tomu se do /etc/needrestart/conf.d/ uloží soubor s řádkem $nrconf{restart} = 'l';.

Ověřit, že to vůbec funguje

Zkušební běh bez instalace:

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

Ve výstupu je vidět, které balíčky vyhovují pravidlům a které byly zamítnuty a proč. Co se skutečně dělo — v logách:

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

Kolik aktualizací čeká právě teď:

apt list --upgradable 2>/dev/null | grep -i security

Poslední příkaz je ze všech nejužitečnější. Nastavené automatické aktualizace mají ve zvyku se tiše rozbít: došlo místo na /boot, repozitář změnil klíč, časovač byl po nějaké ruční úpravě vypnut. Navenek je vše v pořádku a záplaty se neinstalují měsíce.

Místo na /boot

Klasika: stará jádra se nemažou, oddíl /boot se zaplní, instalace nového jádra selže a aktualizace se zastaví úplně. Jednou za pár měsíců stojí za to nahlédnout:

df -h /boot
sudo apt autoremove --purge

Nebo zapnout automatické čištění ve stejném 50unattended-upgrades: Remove-Unused-Kernel-Packages "true" a Remove-Unused-Dependencies "true".

Co zůstává na člověku

Automatické aktualizace zbavují rutiny, ale nenahrazují sledování. Dvě otázky, na které je třeba umět kdykoli odpovědět: kolik bezpečnostních aktualizací čeká na instalaci a zda je nastavený příznak restartu. Obě odpovědi jsou jeden řádek na stránce a celý smysl je v tom, aby ten řádek padl do oka sám, a ne z vaší iniciativy jednou za čtvrtletí.