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

Что остаётся человеку

Автообновления снимают рутину, но не отменяют наблюдения. Два вопроса, на которые нужно уметь ответить в любой момент: сколько обновлений безопасности ждёт установки и стоит ли флаг перезагрузки. Оба ответа — одна строка на странице, и весь смысл в том, чтобы эта строка попадалась на глаза сама, а не по вашей инициативе раз в квартал.