unattended-upgrades: автоматические обновления безопасности Debian и Ubuntu

Автоматические обновления безопасности — самая дешёвая мера против эксплуатации известных уязвимостей: пакет обновляется без участия администратора. Но «настроено» не значит «работает»: источники могут быть шире или уже, чем вы думаете, сторонние репозитории не обновляются вовсе, а таймеры могут перестать запускаться. Ниже порядок настройки unattended-upgrades, проверка результата на живой системе и список мест, где автообновления молча не работают.
Статья опирается на логику направления «Управление уязвимостями» из методики зрелости Группы Сбер (источник); это методика для крупных компаний, мы используем её как ориентир и пересказываем своими словами. Проверка выполнена на Debian 12 с пакетом unattended-upgrades 2.9: изучены настройки (apt-config dump), пробный запуск --dry-run и журналы; пакеты не устанавливались. Общий процесс закрытия уязвимостей и сроки: управление уязвимостями.
Что должно получиться
| Уровень | Что это значит на практике |
|---|---|
| 2. Гигиенический | Есть процесс с приоритетами и сроками; для базовой ОС обновления безопасности ставятся автоматически, исключения оформляются |
Критерии сформулированы нами по мотивам методики, это ориентир, а не оценка соответствия.
Как это устроено
| Элемент | Роль |
|---|---|
apt-daily.timer |
Дважды в сутки обновляет списки пакетов и загружает обновления (с случайной задержкой до 12 часов) |
apt-daily-upgrade.timer |
Запускает unattended-upgrade: установка разрешённых обновлений |
/etc/apt/apt.conf.d/20auto-upgrades |
Включает периодические действия (APT::Periodic::...) |
/etc/apt/apt.conf.d/50unattended-upgrades |
Основные настройки: источники, перезагрузка, уведомления, исключения |
/var/log/unattended-upgrades/ |
Журналы работы и установки пакетов |
Установка: sudo apt install unattended-upgrades; включение запросом sudo dpkg-reconfigure -plow unattended-upgrades или готовым файлом 20auto-upgrades:
// /etc/apt/apt.conf.d/20auto-upgrades
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::AutocleanInterval "7";
Свои настройки и ловушка со списками
Не правьте 50unattended-upgrades (его перезапишет обновление пакета), а добавьте файл 52unattended-upgrades-local с большим номером: он читается позже. Пример:
// /etc/apt/apt.conf.d/52unattended-upgrades-local: свои настройки поверх 50unattended-upgrades
// Источники обновлений: только обновления безопасности Debian (сторонние репозитории не включены).
// Строка #clear обязательна: без неё элементы списка ДОБАВЛЯЮТСЯ к уже заданным в 50unattended-upgrades.
#clear Unattended-Upgrade::Origins-Pattern;
Unattended-Upgrade::Origins-Pattern {
"origin=Debian,codename=${distro_codename},label=Debian-Security";
"origin=Debian,codename=${distro_codename}-security,label=Debian-Security";
};
// Уборка после обновления
Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";
Unattended-Upgrade::Remove-Unused-Dependencies "true";
// Перезагрузку выполняет человек в окно работ (после обновления ядра или библиотек)
Unattended-Upgrade::Automatic-Reboot "false";
// Сообщать о том, что установлено (нужен настроенный почтовый агент)
Unattended-Upgrade::Mail "root";
Unattended-Upgrade::MailReport "on-change";
// Пакеты, которые нельзя обновлять автоматически (пример)
Unattended-Upgrade::Package-Blacklist {
// "mariadb-server";
};
Ловушка. Для параметров-списков (Origins-Pattern, Allowed-Origins, Package-Blacklist) значения из нового файла добавляются к уже заданным, а не заменяют их. Проверка командой apt-config dump с моим файлом без строки #clear показала такой результат: к стандартным шаблонам Debian (в том числе общему label=Debian, то есть обычным обновлениям стабильной ветки, а не только безопасности) добавились мои два, и в итоге остались все пять. Со строкой #clear Unattended-Upgrade::Origins-Pattern; в начале файла остались только два шаблона безопасности, шаблонов с общим label=Debian нет. Всегда проверяйте итог: apt-config dump | grep Unattended-Upgrade::Origins-Pattern.
Также ошибка синтаксиса в файле настроек (например, отсутствие точки с запятой в конце строки) выдаётся сообщением вида E: Syntax error ...: Extra junk at end of file при любом вызове apt-config: проверяйте файл сразу после правки: apt-config dump > /dev/null.
Чем обновлять: только безопасность или всё
- Только безопасность (как в примере) — меньше риск неожиданных изменений поведения служб; подходит для серверов с важными службами.
- Безопасность плюс обычные обновления стабильной ветки — серверы получают исправления ошибок без вашего участия; подходит для однотипных некритичных узлов, если есть откат.
- Критичные службы (базы данных) можно добавить в
Package-Blacklistи обновлять вручную в окно работ с проверкой: управление изменениями.
Перезагрузка
Обновление ядра и ключевых библиотек вступает в силу только после перезагрузки или перезапуска служб. Параметр Automatic-Reboot "true" перезагружает сервер сам (можно задать время Automatic-Reboot-Time "04:00"), что приемлемо для узлов с резервированием, но опасно для единственного сервера. Рекомендуемый порядок для малой команды: автоматическая перезагрузка отключена, а нужность перезагрузки проверяется: файл /var/run/reboot-required существует, если требуется перезагрузка. Включите оповещение о таком файле в мониторинге: мониторинг в Zabbix. Для служб, использующих обновлённые библиотеки без перезагрузки, утилита needrestart показывает, какие процессы работают на старых версиях.
Проверка работы
1. Настройки
apt-config dump | grep -E "^APT::Periodic|^Unattended-Upgrade::(Origins-Pattern|Automatic-Reboot|Mail)"
Ожидаемый результат: APT::Periodic::Update-Package-Lists "1", APT::Periodic::Unattended-Upgrade "1", нужные шаблоны источников, Automatic-Reboot "false".
2. Пробный запуск без установки
sudo unattended-upgrade --dry-run -d
Ожидаемый результат в конце вывода при актуальной системе: No packages found that can be upgraded unattended and no pending auto-removals. Если есть что обновлять, вы увидите список пакетов и источников. Опция -d печатает подробности: полезно, чтобы понять, почему пакет не подходит (источник не разрешён, конфликт конфигурации).
3. Что реально установлено
grep -E "^Start-Date|^Commandline|^Upgrade" /var/log/apt/history.log | tail
tail -n 20 /var/log/unattended-upgrades/unattended-upgrades.log
Записи с командой /usr/bin/unattended-upgrade показывают, когда автоматические обновления реально ставились. Если последняя запись старше недели, а обновления выходят, автоматика не работает.
4. Таймеры
systemctl list-timers --all | grep -E "NEXT|apt"
systemctl show apt-daily.timer apt-daily-upgrade.timer -p NextElapseUSecRealtime -p LastTriggerUSec
Ожидаемый результат: у таймеров заполнены колонки NEXT и LEFT и поле NextElapseUSecRealtime. На проверенной нами системе обе колонки были пустыми, а последние срабатывания были шесть–семь дней назад, хотя таймеры значились включёнными и активными. Пустое значение следующего запуска означает, что таймер не запланирован, и обновления не придут. Обычно помогает перезапуск таймеров: sudo systemctl restart apt-daily.timer apt-daily-upgrade.timer; после него убедитесь, что поле NextElapseUSecRealtime заполнилось и появилась запись в журнале. Причину сбоя установите отдельно (журнал journalctl -u apt-daily.timer, версия systemd). Добавьте в мониторинг проверку: «последний запуск не старше 2 суток».
Что автообновления не обновляют
Пробный запуск на той же системе сказал «нечего обновлять», тогда как apt list --upgradable показывал 19 доступных обновлений. Они относились к сторонним репозиториям (Docker, панель управления хостингом): их источников нет в разрешённых шаблонах, поэтому unattended-upgrade их не трогает, а обновлений безопасности Debian среди них не было. Выводы:
| Что | Как обновлять |
|---|---|
| Пакеты Debian и Ubuntu (безопасность) | Автоматически: unattended-upgrades |
| Docker, базы данных и другие сторонние репозитории | Вручную по расписанию (раз в неделю–месяц) в окно работ, либо добавить источник в шаблоны сознательно, с оценкой риска |
| Образы контейнеров | Пересборка и обновление образов: ограничения контейнеров, проверка зависимостей |
| Приложения и плагины (CMS, библиотеки) | Отдельный процесс обновлений |
| Ядро и библиотеки (применение) | Перезагрузка или перезапуск служб |
Если в списке «обновимых» есть пакеты с доступной версией, а в отчёте сканера они считаются уязвимыми, их нужно закрывать вручную: как читать отчёт сканера.
Уведомления
Параметр Mail "root" с MailReport "on-change" присылает письмо при изменениях и ошибках; нужен установленный почтовый агент и перенаправление почты root (или используйте журнал и мониторинг). Если почта не настроена, параметр бесполезен: проверьте доставку тестовым письмом.
Диагностика
| Симптом | Причина и что делать |
|---|---|
| Пакет с обновлением безопасности не ставится | Источник не в разрешённых шаблонах. Запустите --dry-run -d и найдите строку о пакете; сверьте с apt-cache policy ПАКЕТ |
| Ставятся обычные обновления, хотя хотели только безопасность | Список источников дополнили, а не заменили. Добавьте #clear Unattended-Upgrade::Origins-Pattern; |
| Обновления не приходят неделями, хотя настройки верные | Таймеры не запланированы. Проверьте NextElapseUSecRealtime, перезапустите таймеры, добавьте контроль в мониторинг |
| Обновление остановилось на вопросе о файле конфигурации | Конфликт с изменённой конфигурацией: пакет попадает в список блокировки (Packages blacklist due to conffile prompts). Обновите вручную |
| Служба после обновления работает по-старому | Не перезапущена. Используйте needrestart и плановые перезапуски |
Где это в модели зрелости
Материал относится к направлению «Управление уязвимостями» (материалы направления, карта зрелости). Уровень 2 требует процесса с приоритетами и сроками: автоматическая установка обновлений безопасности закрывает значительную часть базовой ОС, а контроль таймеров и сторонних источников показывает, где автоматика не работает.
Как проверить
apt-config dumpпоказывает ожидаемые источники (только безопасность или то, что вы выбрали) без лишних шаблонов.unattended-upgrade --dry-run -dзаканчивается ожидаемым результатом, а в журнале есть запуск не старше 2 суток.- У таймеров
apt-dailyзаполнено время следующего запуска; в мониторинге есть проверка давности запусков. - Для сторонних репозиториев и контейнеров есть отдельный график обновлений; перезагрузки после обновления ядра планируются.
Источники
- Методика оценки уровня зрелости кибербезопасности компании, Группа Сбер: sberbank.ru.
- Документация Debian: автоматические обновления безопасности (
unattended-upgrades): wiki.debian.org;man apt.conf,man unattended-upgrade. - NIST SP 800-40 Rev. 4, Guide to Enterprise Patch Management Planning: csrc.nist.gov. Международная практика, не российский норматив.






















