Повечето успешни пробиви на сървъри стават не чрез изтънчени експлойти, а чрез уязвимост, за която кръпката е излязла преди няколко месеца. Причината обикновено не е мързел: да се обновява ръчно е страшно, защото apt upgrade на работещ сървър понякога рестартира това, което никой не е искал да рестартира. Автоматичните обновявания решават въпроса, но имат лоша слава — заслужена точно дотолкова, доколкото се настройват набързо.

Да разгледаме настройка, при която кръпките за сигурност идват сами, а версията на PHP не се сменя през нощта.

Инсталиране

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

Диалогът създава /etc/apt/apt.conf.d/20auto-upgrades. Проверете какво се е получило там:

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

Единиците означават „ежедневно“. Всичко това се стартира от systemd таймер, а не от класически cron:

systemctl list-timers | grep apt

Главното: само сигурност

Основният файл е /etc/apt/apt.conf.d/50unattended-upgrades. В него има списък Allowed-Origins (на Debian — Origins-Pattern), и по подразбиране е включено само хранилището за сигурност. Така и го оставете.

Изкушението да разкоментирате реда с -updates е голямо — „нека всичко се обновява“. Не го правете: хранилището за обновявания носи нови версии, а не само поправки, и точно оттам идват нощните изненади. Сигурността и свежестта са различни задачи, а втората е по-добре да се прави ръчно, когато сте на клавиатурата.

Ако някой пакет не бива да се обновява автоматично, за това има черен списък:

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

Ползвайте го съзнателно: всеки ред тук означава „този пакет го обновявам сам“ — и това обещание трябва да се спазва.

Рестартирания

Ключовият ред:

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

Да се остави false е правилно за сървър със сайт: рестарт в три през нощта без предупреждение е по-лош от отложена с ден кръпка на ядрото. Но това решение има задължителна втора половина, за която се забравя.

Когато се обновяват ядрото, libc или openssl, системата създава файла /var/run/reboot-required. Докато рестартът не е направен, на диска лежи поправената версия, а в паметта работи старата — тоест уязвимостта никъде не е изчезнала, макар пакетът да се води обновен. Проверява се изрично:

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

Вторият файл изброява заради какво точно е нужен рестартът. Правилото е просто: видяхте флага — планирайте прозорец в следващите едно-две денонощия, а не „някога“.

Отделен случай са библиотеките. Обновил се е openssl, а nginx и PHP-FPM продължават да работят със старата версия в паметта, при това никакъв флаг за рестарт не се появява. Кой точно се нуждае от рестарт, показва needrestart:

sudo apt install needrestart
sudo needrestart -b

Само го превключете в режим „показвай, а не питай“ — иначе ще започне да задава въпроси насред неинтерактивна инсталация и ще я блокира. За целта в /etc/needrestart/conf.d/ се слага файл с реда $nrconf{restart} = 'l';.

Проверете, че изобщо работи

Пробно изпълнение без инсталиране:

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

В изхода се вижда кои пакети отговарят на правилата и кои са отхвърлени и защо. Какво реално се е случвало — в журналите:

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

Колко обновявания чакат точно сега:

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

Последната команда е най-полезната от всички. Настроените автоматични обновявания имат навика тихо да се чупят: свършило е мястото на /boot, хранилището е сменило ключа, таймерът е изключен след някаква ръчна промяна. Отвън всичко е наред, а кръпките не се инсталират с месеци.

Място на /boot

Класика: старите ядра не се изтриват, дялът /boot се запълва, инсталирането на новото ядро се проваля и обновяванията спират напълно. Веднъж на няколко месеца си струва да се погледне:

df -h /boot
sudo apt autoremove --purge

Или включете автоматично почистване в същия 50unattended-upgrades: Remove-Unused-Kernel-Packages "true" и Remove-Unused-Dependencies "true".

Какво остава за човека

Автоматичните обновявания махат рутината, но не отменят наблюдението. Два въпроса, на които трябва да можете да отговорите по всяко време: колко обновявания за сигурност чакат инсталиране и вдигнат ли е флагът за рестарт. И двата отговора са по един ред на страница, а целият смисъл е този ред да попада пред очите сам, а не по ваша инициатива веднъж на тримесечие.