Повечето успешни пробиви на сървъри стават не чрез изтънчени експлойти, а чрез уязвимост, за която кръпката е излязла преди няколко месеца. Причината обикновено не е мързел: да се обновява ръчно е страшно, защото 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".
Какво остава за човека
Автоматичните обновявания махат рутината, но не отменят наблюдението. Два въпроса, на които трябва да можете да отговорите по всяко време: колко обновявания за сигурност чакат инсталиране и вдигнат ли е флагът за рестарт. И двата отговора са по един ред на страница, а целият смисъл е този ред да попада пред очите сам, а не по ваша инициатива веднъж на тримесечие.