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