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