Хранилище секретов после перезапуска закрыто и не отдаёт данные
Хранилища секретов после запуска находятся в закрытом состоянии: ключи шифрования не в памяти, данные не отдаются. Это не сбой, а защита. Проблема возникает, когда от службы ждут автоматической готовности после перезагрузки, а зависящие от неё службы падают на пустых секретах.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Хранилище не открыто после перезапуска
Состояние закрыто по умолчанию. Служба отвечает на проверки здоровья, но отдаёт отказ на запросы данных.
-
Зависящие службы стартуют раньше готовности
Служба считается запущенной, как только слушает порт. Закрытое состояние для systemd неотличимо от готового.
-
Данные хранилища на непостоянном разделе
Если каталог состояния попадает во временную файловую систему, после перезагрузки хранилище оказывается пустым, а не просто закрытым.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Состояние хранилища в виде ответа проверки здоровья.
curl -s http://127.0.0.1:8200/v1/sys/healthСообщения о запуске и состоянии.
journalctl -u vault -n 30 --no-pager | grep -iE "seal|unseal|core"Где хранятся данные и от кого работает служба.
systemctl show vault -p StateDirectory -p UserРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Состояние закрыто по умолчанию. Служба отвечает на проверки здоровья, но отдаёт отказ на запросы данных.
- Как проверить
-
Посмотрите состояние хранилища.
curl -s http://127.0.0.1:8200/v1/sys/health | head -c 300; echo journalctl -u vault -n 20 --no-pager | grep -i seal
- Как исправить
- Откройте хранилище штатной процедурой. Для автоматического открытия применяют внешний хранитель ключа — держать ключ рядом со службой на диске означает потерю смысла шифрования.
- Почему происходит
- Служба считается запущенной, как только слушает порт. Закрытое состояние для systemd неотличимо от готового.
- Как проверить
-
Посмотрите порядок запуска зависящих служб.
systemctl list-dependencies --reverse vault --no-pager 2>/dev/null | head systemctl show myapp.service -p After
- Как исправить
- Добавьте в зависящие службы ожидание реальной готовности: отдельная проверяющая команда перед запуском или перезапуск при сбое с задержкой.
- Почему происходит
- Если каталог состояния попадает во временную файловую систему, после перезагрузки хранилище оказывается пустым, а не просто закрытым.
- Как проверить
-
Посмотрите, где лежат данные и какая там файловая система.
systemctl show vault -p StateDirectory -p WorkingDirectory findmnt -T /opt/vault/data -o TARGET,FSTYPE 2>/dev/null
- Как исправить
-
Перенесите данные на постоянный раздел и объявите каталог состояния через
StateDirectory=: systemd создаст его с верными правами и не потеряет при перезагрузке.
Пример вывода
После перезагрузки хранилище закрыто, зависящая служба падает. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
vault[5000]: ==> Vault server started! Log data will stream in below:
vault[5000]: core: security barrier not initialized
myapp[5100]: fatal: read secret: 503 Service Unavailable (Vault is sealed)
systemd[1]: myapp.service: Main process exited, code=exited, status=1/FAILURE
Связанные ошибки
- status=243/CREDENTIALS в systemd Код 243/CREDENTIALS: не удалось подготовить учётные данные службы из LoadCredential=, SetCredential= или ImportCredential=.
- Служба не запускается вместе с зависимостью After= без Wants= не запускает зависимость. Разбор частой путаницы между порядком и необходимостью.
- status=233/RUNTIME_DIRECTORY в systemd Код 233/RUNTIME_DIRECTORY: не удалось подготовить каталог службы в /run из RuntimeDirectory=. Права, режим, удаление при остановке.
- Connection refused в журнале службы Соединение отклонено: служба не может подключиться к базе, кешу или другому сервису. Порядок запуска, адрес, брандмауэр.
- Found ordering cycle: циклическая зависимость при загрузке systemd нашёл цикл в порядке запуска и разорвал его, отбросив одну зависимость. Как найти цикл и правильно расставить After и Requires.
- Служба запускается раньше монтирования своих данных Служба стартует и не находит файлов: зависимость от точки монтирования не объявлена.
- Apache: Invalid command — не включён модуль Apache не запускается: директива требует модуль, который не подключён. Как найти нужный модуль и включить.
- Apache: could not bind to address Apache не занимает порт: конфликт с nginx, порт занят, нет прав на привилегированный порт.
Источники
- Документация Vault: состояние хранилища
-
systemd.exec(5)
StateDirectory= и постоянное хранение данных службы. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено перезагрузкой машины с хранилищем и зависящей службой.