В этом руководстве рассмотрим, как настроить автоматическое применение обновлений безопасности и контролируемое внедрение пакетов в дистрибутивах Ubuntu и Debian. Расскажем, в каких случаях достаточно стандартных инструментов системы, а где требуется строгое соблюдение процессов: тестирование в промежуточной среде, планирование технических окон, процедуры отката и постоянное наблюдение за состоянием.
Разбор построен на примерах типичной конфигурации в Timeweb Cloud: вы разворачиваете виртуальные инстансы под веб-приложения, базы данных, очереди задач или фоновые процессы и стремитесь обеспечить их защищенность без постоянного участия вручную.
Почему важна автоматизация обновлений Linux-серверов
Главное преимущество автоматизированных процессов — это уменьшение периода, в течение которого система остается незащищенной. В случае выхода важного исправления безопасности у вас есть возможность внедрить его до того, как уязвимость станет объектом массовых атак. Чем меньше этот интервал, тем надежнее функционирует ИТ-инфраструктура.
Автоматизация особенно важна при наличии множества однотипных узлов. Однако даже для одного хоста она значительно экономит ресурсы: не приходится вспоминать, когда в последний раз ставились обновления безопасности, и нет нужды вручную отслеживать, работает ли инструмент управления пакетами корректно.
Что дает бизнесу автоматизация обновлений:
-
меньше инцидентов из-за известных уязвимостей и, как следствие, меньше простоев;
-
прогнозируемые окна обслуживания вместо внезапных ночных работ;
-
стабильность: одинаковые правила патчинга для всех узлов;
-
контроль затрат: меньше ручных действий, меньше «пожаров» у команды;
-
соответствие требованиям безопасности и внутренним политикам.
Важно различать зоны ответственности. Автообновления не заменяют контроль над изменениями. Они покрывают лишь работу с системными компонентами, но не гарантируют совместимость приложений, корректность миграций или поведение сервисов после рестарта.
Встроенные инструменты: unattended-upgrades
unattended-upgrades — это типовой инструмент в Ubuntu и Debian для фоновой установки апдейтов. Он позволяет выбирать каналы (например, только безопасность), сохранять логи, отправлять уведомления и при необходимости выполнять перезагрузку в заданный период.
На Ubuntu автоматическое обновление часто активно по умолчанию, но для прод-среды стоит перепроверить параметры и адаптировать их под ваш цикл релизов и SLA.
Установка и базовая настройка
Сначала установим утилиту (в большинстве современных версий Ubuntu, например 24.04, она уже установлена по умолчанию) и включим проверку обновлений, которая происходит автоматически. Для Ubuntu и Debian команды одинаковые.
Проверим, есть ли утилита на сервере, с помощью команды:
dpkg -l | grep unattended-upgrades
Если вывод такой, пропустите установку утилиты:
unattended-upgrades 2.9.1+nmu4ubuntu1 all automatic installation of security upgrades
Обновляем пакеты:
sudo apt update
Устанавливаем утилиту:
sudo apt install unattended-upgrades
Запускаем базовую настройку:
sudo dpkg-reconfigure -plow unattended-upgrades
После запуска базовой настройки обычно включается регулярная установка обновлений. Дальше имеет смысл открыть основные конфиги и убедиться, что они соответствуют вашей политике.
Ключевые файлы, о которых стоит знать:
-
/etc/apt/apt.conf.d/20auto-upgrades— как часто запускать обновления; -
/etc/apt/apt.conf.d/50unattended-upgrades— что именно устанавливать и как вести себя при ошибках; -
/var/log/unattended-upgrades/— логи работы механизма.
Если вы разворачиваете серверы в Timeweb Cloud из шаблонов, удобно сразу в cloud-init включить unattended-upgrades и прописать единые настройки. Это снижает объем ручной работы при росте инфраструктуры.
Проверяем установку и запуск автообновлений
Перед тем как включать параметр security-only, проверьте ключевые файлы и таймеры APT. Так вы сразу увидите, что механизм действительно работает, а лог пишется в ожидаемое место.
Проверяем домашнюю директорию, куда будем писать log2.txt:
echo $HOME
Проверяем, что ключевые файлы и каталог логов существуют:
ls -l /etc/apt/apt.conf.d/20auto-upgrades /etc/apt/apt.conf.d/50unattended-upgrades ls -ld /var/log/unattended-upgrades
Проверяем, что таймеры APT включены и видны в systemd:
systemctl list-timers | grep apt
Проверяем, что сервис unattended-upgrades запущен:
systemctl status unattended-upgrades --no-pager
Настройка только security-обновлений
Самый безопасный старт для рабочей среды — автоматически устанавливать только обновления безопасности, а остальные обновления (с новыми функциями и исправлениями ошибок) разворачивать по расписанию после проверки на тестовом окружении. В Debian для этого удобно ограничивать источники через Origins-Pattern, в Ubuntu — через Allowed-Origins, суть одна: автоматизируем только обновления безопасности.
Пример ниже — это bash-скрипт, который устанавливает необходимые пакеты, применяет минимальную конфигурацию автоматических обновлений и сохраняет все логи в ~/log2.txt.
#!/usr/bin/env bash
set -euo pipefail
# Лог-файл (под root). Можно поменять путь/имя как нужно.
LOG="/root/unattended-upgrades-setup-$(date +%F_%H-%M-%S).log"
say() { echo -e "$*" | tee -a "$LOG"; }
say "=== Настройка unattended-upgrades (security-only) ==="
say "Пользователь: $(whoami)"
say "Домашний каталог: $HOME"
say "Дата: $(date -u)"
say "\n===== Установка пакетов ====="
apt-get update -qq >>"$LOG" 2>&1
apt-get install -y -qq unattended-upgrades apt-listchanges >>"$LOG" 2>&1
say "\n===== Включаем периодические задачи APT ====="
cat >/etc/apt/apt.conf.d/20auto-upgrades <<'EOF'
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
EOF
# Определяем дистрибутив и codename
. /etc/os-release
DISTRO_ID="${ID:-}"
CODENAME="${VERSION_CODENAME:-}"
if [[ -z "${DISTRO_ID}" || -z "${CODENAME}" ]]; then
say "\nОШИБКА: Не удалось определить ID/VERSION_CODENAME из /etc/os-release"
exit 1
fi
say "\n===== Security-only конфигурация unattended-upgrades ====="
if [[ "${DISTRO_ID}" == "ubuntu" ]]; then
# Ubuntu: используем Allowed-Origins и только -security (без -updates/-backports)
cat >/etc/apt/apt.conf.d/50unattended-upgrades <<EOF
Unattended-Upgrade::Allowed-Origins {
"\${distro_id}:\${distro_codename}-security";
};
Unattended-Upgrade::Automatic-Reboot "false";
Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";
Unattended-Upgrade::Remove-New-Unused-Dependencies "true";
Unattended-Upgrade::Remove-Unused-Dependencies "true";
EOF
else
# Debian (и прочие): Origins-Pattern, только security
cat >/etc/apt/apt.conf.d/50unattended-upgrades <<EOF
Unattended-Upgrade::Origins-Pattern {
"origin=Debian,codename=${CODENAME}-security,label=Debian-Security";
};
Unattended-Upgrade::Automatic-Reboot "false";
Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";
Unattended-Upgrade::Remove-New-Unused-Dependencies "true";
Unattended-Upgrade::Remove-Unused-Dependencies "true";
EOF
fi
say "\n===== systemd timers (apt) ====="
# В терминале выводится только короткая выжимка, а полный лог записываем в файл.
systemctl list-timers --all >>"$LOG" 2>&1
systemctl list-timers --all | grep -E "apt-daily|apt-daily-upgrade" | tee -a "$LOG" || true
say "\n===== DRY-RUN unattended-upgrades (лог, без спама в консоль) ====="
# ВАЖНО: --debug очень многословный. Пишем его только в лог.
unattended-upgrades --dry-run --debug >>"$LOG" 2>&1
say "DRY-RUN debug сохранён в: $LOG"
say "\n===== Последние записи лога unattended-upgrades ====="
tail -n 50 /var/log/unattended-upgrades/unattended-upgrades.log >>"$LOG" 2>&1
tail -n 20 /var/log/unattended-upgrades/unattended-upgrades.log | tee -a "$LOG" || true
say "\nГотово. Полный лог: $LOG"
После выполнения bash-скрипта система будет настроена для автоматической установки обновлений безопасности. Редактировать скрипт не требуется — автоматическая установка обновлений выполняется через таймеры systemd: apt-daily.timer и apt-daily-upgrade.timer.
В bash-скрипте мы создали файл /etc/apt/apt.conf.d/20auto-upgrades с содержимым:
APT::Periodic::Update-Package-Lists "1"; APT::Periodic::Unattended-Upgrade "1";
Это позволяет автоматически запускать обновления безопасности, которые настроил наш bash-скрипт.
Убедимся, что таймер активен:
systemctl status apt-daily-upgrade.timer

Если таймер находится в состоянии enabled и active, обновления будут выполняться автоматически по расписанию.
Пример: как выглядит логирование до и после security-only
В логировании есть три вещи, которые необходимо фиксировать при настройке обновлений безопасности:
- Какие источники для обновлений разрешены (
Allowed origins); - Включены ли параметры
APT::Periodic; - Активны ли таймеры
apt-daily/apt-daily-upgrade.
Ниже представлены примеры из реального лога.
Файлы на диске (пример):
-rw-r--r-- 1 root root 80 Feb 4 12:04 /etc/apt/apt.conf.d/20auto-upgrades -rw-r--r-- 1 root root 344 Feb 10 11:41 /etc/apt/apt.conf.d/50unattended-upgrades drwxr-x--- 2 root adm 4096 Feb 5 00:25 /var/log/unattended-upgrades
До настройки в Allowed origins есть и основной репозиторий, и security:
2026-02-10 06:38:47,698 INFO Allowed origins are: origin=Debian,codename=bookworm,label=Debian, origin=Debian,codename=bookworm,label=Debian-Security, origin=Debian,codename=bookworm-security,label=Debian-Security
После настройки security-only остается только security:
2026-02-10 11:41:40,093 INFO Allowed origins are: origin=Debian,codename=bookworm-security,label=Debian-Security
Если обновления безопасности уже были настроены до запуска скрипта, фрагменты «до/после» будут одинаковыми — это нормально: настройка идемпотентная.
Если при тестовом запуске выполнить команду sudo unattended-upgrades --dry-run --debug, в выводе можно увидеть строки вида Marking not allowed. Это означает, что источники обновлений, не входящие в разрешенный список, исключаются через механизм pinning и не рассматриваются для установки. Такое поведение является ожидаемым и подтверждает, что заданные ограничения действительно применяются и работают корректно.
Логирование и мониторинг
Автоматизация без мониторинга превращается в лотерею: обновления могут тихо применяться, либо тихо сломали нужную вам зависимость. Поэтому логирование и мониторинг обновлений — обязательная часть настройки.
Где можно посмотреть логирование unattended-upgrades:
-
/var/log/unattended-upgrades/unattended-upgrades.log— общие запуски; -
/var/log/unattended-upgrades/unattended-upgrades-dpkg.log— подробности установки пакетов; -
/var/log/apt/history.log и /var/log/dpkg.log— история установок на уровне apt и dpkg.
Быстрая проверка, что обновления действительно запускаются:
Проверьте таймеры:
systemctl list-timers --all | grep -E "apt-daily|apt-daily-upgrade"
Посмотрите статус сервиса:
systemctl status unattended-upgrades
Пробный запуск (подробности — только в файл):
sudo unattended-upgrades --dry-run --debug > /var/log/unattended-upgrades/dry-run-debug.log 2>&1 tail -n 50 /var/log/unattended-upgrades/dry-run-debug.log
Автоматизация запуска обновлений безопасности
unattended-upgrades закрывает типовой сценарий, но иногда требуется более управляемая логика: обновлять пакеты только в окно обслуживания, делать предварительную проверку, писать отчеты в чат или запускать скрипт после апдейта.
Для автоматизации установки обновлений можно использовать таймеры systemd. В актуальных версиях Ubuntu за работу с обновлениями отвечают задания apt-daily.timer и apt-daily-upgrade.timer. Перед тем как добавлять собственные задания или изменять расписание обновлений, стоит разобраться, как устроены стандартные таймеры systemd.
Что важно учитывать:
-
apt-daily.timerобновляет индекс пакетов (по сути, выполняет функциюapt update); -
apt-daily-upgrade.timerпозволяет инициировать установку доступных обновлений, включаяunattended-upgrades; -
оба задания запускаются со случайной паузой, чтобы большое количество серверов не обращалось к репозиториям одновременно.
Проверить текущее расписание и конфигурацию можно так:
systemctl list-timers | grep apt-daily systemctl cat apt-daily.timer systemctl cat apt-daily-upgrade.timer
Если вам требуется строгое фиксированное обслуживание, можно создать собственный таймер systemd и назначить точное время запуска обновлений. К примеру, назначить выполнение обновления каждую субботу в 03:15 с сохранением вывода в лог, чтобы повысить надежность.
Создайте сервис /etc/systemd/system/apt-weekly-upgrade.service:
sudo tee /etc/systemd/system/apt-weekly-upgrade.service >/dev/null <<'EOF' [Unit] Description=Weekly APT upgrade [Service] Type=oneshot ExecStart=/usr/bin/apt-get update ExecStart=/usr/bin/apt-get -y upgrade ExecStart=/usr/bin/apt-get -y autoremove EOF
Создайте таймер /etc/systemd/system/apt-weekly-upgrade.timer:
sudo tee /etc/systemd/system/apt-weekly-upgrade.timer >/dev/null <<'EOF' [Unit] Description=Run APT upgrade weekly [Timer] OnCalendar=Sat *-*-* 03:15:00 Persistent=true [Install] WantedBy=timers.target EOF
Включите таймер:
sudo systemctl daemon-reload && sudo systemctl enable --now apt-weekly-upgrade.timer
Проверьте:
systemctl list-timers | grep apt-weekly-upgrade systemctl status apt-weekly-upgrade.timer
Таймеры systemd удобны тем, что их проще мониторить: у них есть статус, журнал выполнения и единый механизм настройки расписания. Это делает их предпочтительным способом автоматизации запуска обновлений на отдельных серверах.
Методы автоматизации обновлений: сравнение
В таблице ниже приведены основные подходы к автоматизации обновлений и их особенности: области применения, уровень контроля, сложность внедрения и возможные риски.
|
Подход |
Где применяют |
Контроль окна |
Отчеты |
Сложность |
Риск |
|
unattended-upgrades |
1-20 серверов, базовый патчинг |
Средний |
Встроенные email, логи |
Низкая |
Низкий при security-only |
|
Таймер systemd /cron |
Кастомные окна и сценарии |
Высокий |
Что напишете в скрипте |
Средняя |
Зависит от качества скрипта |
|
Ansible |
Парки серверов, staged rollout |
Высокий |
Централизованные отчеты |
Средняя |
Низкий при тестировании |
|
Puppet/Chef |
Большие организации, строгие политики |
Высокий |
Централизованные отчеты |
Высокая |
Низкий при зрелых процессах |
Заключение
Автоматические обновления безопасности — это простой способ сократить окно уязвимости и убрать рутину из администрирования серверов. unattended-upgrades закрывает базовые риски на уровне пакетов, если ограничить его только security-репозиториями и включить логирование. Главное — помнить, что автообновления не заменяют процессы тестирования, мониторинга и управления изменениями, а лишь дополняют их.
