Більшість успішних зламів серверів відбувається не через хитромудрі експлойти, а через уразливість, латка до якої вийшла кілька місяців тому. Причина зазвичай не в лінощах: оновлювати руками робочий сервер страшно, бо 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".

Що лишається людині

Автоматичні оновлення прибирають рутину, але не спостереження. Два питання, на які ви маєте вміти відповісти будь-якої миті: скільки оновлень безпеки чекає і чи виставлено прапорець перезавантаження. Обидві відповіді — по рядку на сторінці, і весь сенс у тому, щоб цей рядок сам потрапляв вам на очі, а не за вашою ініціативою раз на квартал.