etckeeper: контроль изменений конфигурации в /etc через git

Карточка изменения из общего процесса управления изменениями фиксирует, что должно было поменяться. А что поменялось в самом каталоге /etc на самом деле — обычно никто не фиксирует: конфигурации правят вручную, и через полгода никто не вспомнит, кто и зачем изменил параметр. etckeeper решает это просто: держит /etc под версионным контролем git и коммитит изменения автоматически. Ниже установка, типовой сценарий и результаты проверки.
Статья опирается на логику направления «Управление изменениями» из методики зрелости Группы Сбер (источник); это методика для крупных компаний, мы используем её как ориентир и пересказываем своими словами. Проверка выполнена в контейнере Debian 12 (etckeeper 1.18.20), после неё всё удалено.
Что должно получиться
| Уровень | Что это значит на практике |
|---|---|
| 2. Гигиенический | Изменения конфигурации системы видны как история: кто, когда и что именно изменил, с возможностью откатить конкретную правку |
Критерии сформулированы нами по мотивам методики, это ориентир, а не оценка соответствия.
Установка и автоматическая инициализация
apt install etckeeper git
Пакет сам создаёт репозиторий git в /etc и делает первый коммит со всем содержимым каталога — отдельно вызывать etckeeper init не нужно, это уже сделано post-install хуком пакета. В тесте сразу после установки git log в /etc показал «Initial commit» с сотнями файлов. Задайте, от чьего имени будут коммиты:
git config --file /etc/.git/config user.email "root@host"
git config --file /etc/.git/config user.name "root"
Как это работает
etckeeper подключается к менеджеру пакетов через хуки apt:
DPkg::Pre-Invoke { "if [ -x /usr/bin/etckeeper ]; then etckeeper pre-install; fi"; };
DPkg::Post-Invoke { "if [ -x /usr/bin/etckeeper ]; then etckeeper post-install; fi"; };
Поэтому любая установка или обновление пакета, меняющие файлы в /etc, автоматически попадают в историю отдельным коммитом с сообщением вида «committing changes in /etc after apt run». Для изменений, которые вы вносите вручную, коммит нужно делать самостоятельно:
etckeeper commit "описание изменения"
Кроме того, установлен systemd-таймер etckeeper.timer (заход раз в сутки, первый запуск через 15 минут после загрузки) — он подхватывает изменения, сделанные в обход apt и без ручного коммита. Полагаться только на него не стоит: ежедневный коммит объединит несколько правок за день в одну запись и усложнит разбор истории.
Результат проверки: diff и откат
Изменили тестовый конфигурационный файл и закоммитили:
sed -i 's/port=8080/port=9090/' /etc/myapp/app.conf
sed -i 's/debug=false/debug=true/' /etc/myapp/app.conf
etckeeper commit "change app config to debug mode"
Просмотр разницы между версиями:
git -C /etc show HEAD -- myapp/app.conf
-port=8080
-debug=false
+port=9090
+debug=true
Откат именно этого изменения, без потери более поздних правок других файлов:
git -C /etc revert --no-edit HEAD
Команда создала новый коммит «Revert “change app config to debug mode”», и содержимое файла вернулось к исходному (port=8080, debug=false). История при этом не переписывается: видно и то, что изменили, и то, что откатили, и когда.
Важная ловушка: git revert не сработает на файле, который на самом деле является точкой монтирования, а не обычным файлом (так бывает, например, с /etc/hostname в контейнере) — команда вернёт «Device or resource busy». Для обычных конфигурационных файлов на сервере, не являющихся bind-монтированием, этой проблемы нет.
Что делать с историей
- Разбор инцидента или сбоя:
git -C /etc log -p -- путь/к/файлупокажет все изменения файла по порядку с содержимым каждого. - Сверка с карточкой изменения: сообщение коммита для ручных правок должно содержать номер заявки, чтобы историю можно было сопоставить с официальным процессом.
- Регулярный просмотр: раз в неделю бегло просмотреть коммиты за ручными изменениями (не от apt) — изменение без заявки в сообщении коммита повод для вопроса.
- Резервная копия самого репозитория: каталог
/etc/.gitнужно включить в общую стратегию копирования, иначе история изменений пропадёт вместе с сервером.
Порядок внедрения
- Установите
etckeeperна серверах, где конфигурацию правят вручную, а не только через конфигурационный менеджмент. - Задайте имя и почту для коммитов, по возможности разные для каждого администратора (не общий
root), чтобы в истории было видно, кто правил. - Включите привычку коммитить вручную сразу после правки с осмысленным сообщением, а не полагаться на суточный таймер.
- Добавьте каталог
.gitв резервное копирование вместе с остальным/etc. - Используйте историю при разборе инцидентов и сверяйте ручные изменения с карточками в системе управления изменениями.
Диагностика
| Симптом | Причина и что делать |
|---|---|
fatal: detected dubious ownership in repository |
Git новых версий не доверяет репозиторию с другим владельцем. Добавьте git config --global --add safe.directory /etc |
| В истории только безликие коммиты от apt | Ручные изменения не коммитятся сразу. Возьмите за привычку вызывать etckeeper commit сразу после правки |
git revert даёт «Device or resource busy» |
Файл на самом деле является точкой монтирования (характерно для контейнеров). На обычном сервере этой проблемы нет |
| Один суточный коммит содержит много несвязанных изменений | Таймер отработал раз, пока правки не коммитили вручную весь день. Снизьте интервал или коммитьте сразу |
| В истории оказались секреты (пароли в конфигурации) | git хранит их в истории даже после последующего удаления файла. Смените скомпрометированные значения, историю репозитория потребуется переписывать отдельно |
Ограничения
etckeeper фиксирует только то, что лежит в /etc на диске, и не видит состояние, которое система хранит иначе (память работающих служб, записи в базах, таблицы файрвола, не сохранённые в файл). Он также не заменяет процесс управления изменениями с согласованием и окном работ: это журнал фактических изменений файлов, а не система согласования. Для контроля несанкционированных изменений за пределами коммитов используйте отдельный инструмент: AIDE.
Где это в модели зрелости
Материал относится к направлению «Управление изменениями» (материалы направления, карта зрелости). Уровень 2 требует, чтобы изменения были отслеживаемы и обратимы: журнал в git делает это для конфигурации на уровне файлов и дополняет карточку изменения технической деталью — что именно изменилось в байтах, а не только в описании.
Как проверить
- В
/etcесть репозиторий git с историей коммитов от установки пакетов. - Ручные изменения коммитятся с осмысленным сообщением сразу после правки.
- Каталог
.gitвнутри/etcвходит в резервное копирование сервера. - Откат тестового изменения через
git revertработает и не затрагивает более поздние правки других файлов.
Источники
- Методика оценки уровня зрелости кибербезопасности компании, Группа Сбер: sberbank.ru.
- Документация etckeeper: etckeeper.branchable.com.


















