Useimmat onnistuneet palvelinmurrot eivät tapahdu hienostuneiden hyväksikäyttöjen kautta vaan haavoittuvuuden kautta, johon korjaus julkaistiin kuukausia sitten. Syy ei ole yleensä laiskuus: käsin päivittäminen tuntuu riskiltä, koska apt upgrade tuotantopalvelimella toisinaan käynnistää uudelleen asioita, joita ei pyydetty. Automaattiset päivitykset ratkaisevat asian, mutta niillä on huono maine — ansaittu täsmälleen siinä määrin kuin ne asetetaan hätäisesti.

Käydään läpi kokoonpano, jossa tietoturvakorjaukset saapuvat itsestään eikä PHP:n versio vaihdu yöllä.

Asennus

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

Valintaikkuna luo tiedoston /etc/apt/apt.conf.d/20auto-upgrades. Tarkista, mitä sinne päätyi:

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

Ykköset tarkoittavat ”päivittäin”. Kaiken tämän käynnistää systemd-ajastin, ei klassinen cron:

systemctl list-timers | grep apt

Tärkeintä: vain tietoturva

Päätiedosto on /etc/apt/apt.conf.d/50unattended-upgrades. Siinä on lista Allowed-Origins (Debianissa Origins-Pattern), ja oletuksena päällä on vain tietoturvavarasto. Anna sen olla niin.

Houkutus poistaa kommenttimerkki riviltä -updates on suuri — ”päivittyköön kaikki”. Älä tee sitä: päivitysvarasto tuo uusia versioita eikä vain korjauksia, ja juuri sieltä yön yllätykset tulevat. Turvallisuus ja tuoreus ovat eri tehtäviä, ja jälkimmäinen hoidetaan parhaiten käsin, kun istut näppäimistön ääressä.

Jos jotain pakettia ei saa päivittää automaattisesti, sitä varten on mustalista:

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

Käytä sitä tietoisesti: jokainen rivi tässä tarkoittaa ”tämän paketin päivitän itse” — ja se lupaus on pidettävä.

Uudelleenkäynnistykset

Avainrivi:

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

Arvon false jättäminen on oikein palvelimelle, jolla on sivusto: uudelleenkäynnistys kolmelta yöllä ilman varoitusta on pahempi kuin vuorokaudella siirretty ytimen korjaus. Mutta tuolla päätöksellä on pakollinen toinen puoli, joka unohtuu.

Kun ydin, libc tai openssl päivittyy, järjestelmä luo tiedoston /var/run/reboot-required. Niin kauan kuin uudelleenkäynnistystä ei ole tehty, levyllä on korjattu versio ja muistissa pyörii vanha — haavoittuvuus on siis yhä olemassa, vaikka paketti lasketaan päivitetyksi. Tämä on tarkistettava nimenomaisesti:

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

Toinen tiedosto luettelee, mistä uudelleenkäynnistys tarkalleen johtuu. Sääntö on yksinkertainen: kun näet lipun — suunnittele huoltoikkuna vuorokauden tai kahden sisään, ei ”joskus”.

Erikoistapaus ovat kirjastot. openssl päivittyy, kun taas nginx ja PHP-FPM jatkavat vanhalla versiolla muistissa, eikä mitään uudelleenkäynnistyslippua ilmesty. Kuka todella tarvitsee uudelleenkäynnistyksen, näyttää needrestart:

sudo apt install needrestart
sudo needrestart -b

Aseta se vain tilaan ”näytä, älä kysy” — muuten se alkaa kysellä keskellä ei-interaktiivista asennusta ja jumittaa sen. Sitä varten hakemistoon /etc/needrestart/conf.d/ laitetaan tiedosto, jossa on rivi $nrconf{restart} = 'l';.

Tarkista, että se ylipäätään toimii

Koeajo ilman asennusta:

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

Tulosteesta näkyy, mitkä paketit vastaavat sääntöjä ja mitkä on hylätty ja miksi. Mitä todella tapahtui, näkyy lokeissa:

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

Kuinka monta päivitystä odottaa juuri nyt:

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

Viimeinen komento on kaikista hyödyllisin. Asetetuilla automaattipäivityksillä on tapana hajota hiljaa: /boot-osion tila loppui, varasto vaihtoi avaimen, ajastin kytkettiin pois jonkin käsin tehdyn muutoksen jälkeen. Päältä päin kaikki on kunnossa, eikä korjauksia asennu kuukausiin.

Tila /boot-osiolla

Klassikko: vanhoja ytimiä ei poisteta, osio /boot täyttyy, uuden ytimen asennus epäonnistuu ja päivitykset pysähtyvät kokonaan. Muutaman kuukauden välein kannattaa vilkaista:

df -h /boot
sudo apt autoremove --purge

Tai kytke automaattinen siivous samassa tiedostossa 50unattended-upgrades: Remove-Unused-Kernel-Packages "true" ja Remove-Unused-Dependencies "true".

Mitä ihmiselle jää

Automaattipäivitykset poistavat rutiinin mutta eivät tarvetta seurata. Kaksi kysymystä, joihin pitää osata vastata milloin tahansa: kuinka monta tietoturvapäivitystä odottaa ja onko uudelleenkäynnistyslippu pystyssä. Molemmat vastaukset ovat yksi rivi sivulla, ja koko pointti on siinä, että tuo rivi osuu silmiin itsestään eikä omasta aloitteestasi kerran neljänneksessä.