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

0
5
Обложка статьи: 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 требует процесса с приоритетами и сроками: автоматическая установка обновлений безопасности закрывает значительную часть базовой ОС, а контроль таймеров и сторонних источников показывает, где автоматика не работает.

Как проверить

  1. apt-config dump показывает ожидаемые источники (только безопасность или то, что вы выбрали) без лишних шаблонов.
  2. unattended-upgrade --dry-run -d заканчивается ожидаемым результатом, а в журнале есть запуск не старше 2 суток.
  3. У таймеров apt-daily заполнено время следующего запуска; в мониторинге есть проверка давности запусков.
  4. Для сторонних репозиториев и контейнеров есть отдельный график обновлений; перезагрузки после обновления ядра планируются.

Источники

  • Методика оценки уровня зрелости кибербезопасности компании, Группа Сбер: 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. Международная практика, не российский норматив.

Оставьте свой ответ