A sikeres szerverbetörések többsége nem kifinomult exploitokon keresztül történik, hanem olyan sebezhetőségen, amelyhez hónapokkal ezelőtt jelent meg javítás. Az ok általában nem lustaság: kézzel frissíteni ijesztő, mert az apt upgrade egy éles szerveren néha olyat is újraindít, amit senki nem kért. Az automatikus frissítések megoldják a kérdést, de rossz hírük van — pontosan olyan mértékben megérdemelten, amennyire kapkodva állítják be őket.

Nézzük végig azt a beállítást, amelynél a biztonsági javítások maguktól érkeznek, a PHP verziója viszont éjjel nem változik meg.

Telepítés

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

A párbeszédablak létrehozza az /etc/apt/apt.conf.d/20auto-upgrades fájlt. Ellenőrizd, mi került bele:

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

Az egyesek jelentése „naponta”. Mindezt systemd-időzítő indítja, nem a klasszikus cron:

systemctl list-timers | grep apt

A lényeg: csak biztonság

A fő fájl az /etc/apt/apt.conf.d/50unattended-upgrades. Ebben van az Allowed-Origins lista (Debianon Origins-Pattern), és alapból kizárólag a biztonsági tároló van bekapcsolva. Hagyd is így.

A kísértés nagy, hogy kikommentezd a -updates sort — „frissüljön minden”. Ne tedd: a frissítési tároló új verziókat hoz, nem csak javításokat, és éppen onnan érkeznek az éjszakai meglepetések. A biztonság és a frissesség különböző feladatok, és a másodikat jobb kézzel elvégezni, amikor a billentyűzetnél ülsz.

Ha valamelyik csomagot nem szabad automatikusan frissíteni, van rá feketelista:

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

Tudatosan használd: minden sor itt azt jelenti, hogy „ezt a csomagot magam frissítem” — és ezt az ígéretet teljesíteni is kell.

Újraindítások

A kulcssor:

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

A false meghagyása helyes egy webhelyet futtató szerveren: a hajnali három órai, előzetes figyelmeztetés nélküli újraindítás rosszabb, mint egy nappal elhalasztott kernelfrissítés. Ennek a döntésnek azonban van egy kötelező második fele, amelyről meg szoktak feledkezni.

Amikor a kernel, a libc vagy az openssl frissül, a rendszer létrehozza a /var/run/reboot-required fájlt. Amíg nem történt újraindítás, a lemezen a javított verzió van, a memóriában viszont a régi fut — a sebezhetőség tehát sehová nem tűnt, noha a csomag frissítettként szerepel. Ezt kifejezetten ellenőrizni kell:

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

A második fájl felsorolja, pontosan mi miatt szükséges az újraindítás. A szabály egyszerű: ha látod a jelzést — tervezz ablakot a következő egy-két napra, ne „valamikorra”.

Külön eset a könyvtárak. Frissült az openssl, az nginx és a PHP-FPM viszont továbbra is a régi verzióval fut a memóriában, és eközben semmilyen újraindítási jelzés nem jelenik meg. Hogy pontosan mit kell újraindítani, azt a needrestart mutatja meg:

sudo apt install needrestart
sudo needrestart -b

Csak állítsd át „mutasson, ne kérdezzen” üzemmódba — különben nem interaktív telepítés közepén kezd kérdezni, és megakasztja azt. Ehhez az /etc/needrestart/conf.d/ könyvtárba kerül egy fájl a $nrconf{restart} = 'l'; sorral.

Ellenőrizd, hogy egyáltalán működik-e

Próbafuttatás telepítés nélkül:

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

A kimenetben látszik, mely csomagok felelnek meg a szabályoknak, és melyeket vetett el, és miért. Hogy valójában mi történt — a naplókban:

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

Hány frissítés vár éppen most:

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

Ez az utolsó parancs a leghasznosabb mind közül. A beállított automatikus frissítéseknek megvan az a szokásuk, hogy csendben elromlanak: elfogyott a hely a /boot partíción, a tároló kulcsot cserélt, az időzítőt egy kézi módosítás után kikapcsolták. Kívülről minden rendben, a javítások viszont hónapokig nem települnek.

Hely a /boot partíción

Klasszikus: a régi kernelek nem törlődnek, a /boot partíció megtelik, az új kernel telepítése elbukik, és a frissítések teljesen leállnak. Néhány havonta érdemes ránézni:

df -h /boot
sudo apt autoremove --purge

Vagy kapcsold be az automatikus takarítást ugyanabban az 50unattended-upgrades fájlban: Remove-Unused-Kernel-Packages "true" és Remove-Unused-Dependencies "true".

Mi marad az emberre

Az automatikus frissítések leveszik a rutint, de nem helyettesítik a figyelést. Két kérdés, amelyre bármikor tudni kell a választ: hány biztonsági frissítés vár telepítésre, és fel van-e állítva az újraindítási jelzés. Mindkét válasz egyetlen sor egy oldalon, és az egész lényeg az, hogy ez a sor magától kerüljön a szemed elé, ne a te kezdeményezésedre negyedévente egyszer.