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ä.