Поддержание актуальности пакетов на серверах Linux является критически важной задачей для обеспечения безопасности и стабильности системы. Однако подходы к автоматизации этого процесса часто бывают ошибочными, создавая либо уязвимости, либо риски сбоев в работе продуктивных систем. Стандартная практика запуска apt upgrade -y через cron от имени root может привести к неожиданным проблемам, включая поломку критически важных сервисов.

Правильным и безопасным решением для автоматического обновления пакетов на системах Ubuntu и Debian является использование системного демона unattended-upgrades. Это не просто скрипт, а полноценный демон, который позволяет обновлять только разрешенные пакеты, ведет подробные логи всех операций и может отправлять уведомления по электронной почте о произошедших изменениях.

Шаг 1: Установка необходимых пакетов

Для начала работы с автоматическими обновлениями необходимо установить пакет unattended-upgrades, а также apt-listchanges. Последний пакет особенно полезен, так как он информирует о значительных изменениях в пакетах, что может быть критично для понимания потенциальных рисков.

apt install unattended-upgrades apt-listchanges -y
systemctl enable unattended-upgrades
systemctl start unattended-upgrades

После установки демон unattended-upgrades будет включен и запущен, готовый к работе согласно конфигурации.

Шаг 2: Основная конфигурация unattended-upgrades

Основная конфигурация определяется в файле /etc/apt/apt.conf.d/50unattended-upgrades. В этом файле мы задаем, какие источники обновлений разрешены, какие пакеты следует исключить из автоматического обновления, а также настраиваем поведение системы, например, перезагрузку или отправку уведомлений.

Приведенная ниже конфигурация включает обновления из репозиториев безопасности, основных и обновлений для текущего дистрибутива. Особое внимание уделено списку исключений (Package-Blacklist), который включает критические компоненты, такие как ядро Linux, базы данных (MySQL, MariaDB, PostgreSQL), веб-серверы (Apache2, Nginx) и Docker. Эти пакеты рекомендуется обновлять вручную в рамках плановых работ, чтобы избежать неконтролируемых сбоев.

Также настроены параметры обработки прерванных операций dpkg, минимальное количество шагов для выполнения обновления, отключение автоматического удаления неиспользуемых зависимостей (чтобы избежать непредвиденных удалений) и, самое главное, отключена автоматическая перезагрузка (Automatic-Reboot "false"). Уведомления об изменениях (on-change) будут отправляться на указанный адрес электронной почты.

cat > /etc/apt/apt.conf.d/50unattended-upgrades << 'EOF'
Unattended-Upgrade::Allowed-Origins {
    "${distro_id}:${distro_codename}-security";
    "${distro_id}:${distro_codename}";
    "${distro_id}:${distro_codename}-updates";
};
Unattended-Upgrade::Package-Blacklist {
    "mysql*";
    "mariadb*";
    "postgresql*";
    "apache2*";
    "nginx*";
    "docker*";
    "linux-image*";
    "linux-headers*";
};
Unattended-Upgrade::AutoFixInterruptedDpkg "true";
Unattended-Upgrade::MinimalSteps "true";
Unattended-Upgrade::Remove-Unused-Dependencies "false";
Unattended-Upgrade::Automatic-Reboot "false";
Unattended-Upgrade::Mail "admin@company.com";
Unattended-Upgrade::MailReport "on-change";
EOF

Шаг 3: Настройка расписания автоматических операций

Расписание выполнения операций unattended-upgrades задается в файле /etc/apt/apt.conf.d/20auto-upgrades. Здесь мы определяем частоту обновления списков пакетов, выполнения самих автоматических обновлений и очистки кэша пакетов.

cat > /etc/apt/apt.conf.d/20auto-upgrades << 'EOF'
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
APT::Periodic::AutocleanInterval "7";
EOF

В данной конфигурации:

  • APT::Periodic::Update-Package-Lists "1": Списки пакетов будут обновляться ежедневно.
  • APT::Periodic::Unattended-Upgrade "1": Автоматические обновления будут запускаться ежедневно.
  • APT::Periodic::AutocleanInterval "7": Старые и неиспользуемые пакеты будут удаляться еженедельно.

Шаг 4: Проверка конфигурации (сухой запуск)

Перед тем как позволить системе выполнять реальные обновления, крайне рекомендуется провести сухой запуск (dry-run) для проверки настроек. Это позволит увидеть, какие пакеты будут обновлены, без фактического внесения изменений в систему. Флаг --debug предоставит подробную информацию.

apt-get update && unattended-upgrade --dry-run --debug 2>&1 | grep -E "Allowed|Packages that will be upgraded|No packages"

Внимательно изучите вывод этой команды, чтобы убедиться, что из автоматических обновлений исключены все критические пакеты, которые вы внесли в черный список.

Мониторинг логов

Все действия unattended-upgrades подробно логируются. Для отслеживания хода выполнения обновлений и выявления возможных проблем используйте следующую команду:

tail -f /var/log/unattended-upgrades/unattended-upgrades.log

Принудительный запуск обновления

Если требуется запустить процесс обновления немедленно, не дожидаясь срабатывания планировщика, можно использовать команду с флагом -v для подробного вывода:

unattended-upgrade -v

Заключение

Использование unattended-upgrades является оптимальным подходом для автоматического обновления серверов Ubuntu/Debian. Оно позволяет поддерживать систему в актуальном состоянии, защищая от известных уязвимостей, при этом минимизируя риски для стабильности критически важных сервисов. Помните, что ядро операционной системы и другие ключевые приложения, перечисленные в черном списке, следует обновлять вручную в специально отведенные окна обслуживания, чтобы обеспечить полный контроль над процессом и готовность к возможным внештатным ситуациям.