Self-hosted Apps

HashiCorp Vault

Хранилище секретов для приложений: выдаёт пароли, ключи и сертификаты по запросу, с ограниченным сроком жизни и полным аудитом обращений.

Что такое HashiCorp Vault

Vault — система управления секретами от HashiCorp. Секрет — это всё, что даёт доступ: пароль к базе, API-ключ, приватный ключ сертификата, токен платёжного шлюза. Vault хранит их в зашифрованном виде и выдаёт приложениям по запросу — после проверки, кто спрашивает, и с записью в журнал аудита.

Проблема, которую он решает, знакома всем: пароль от продовой базы лежит в .env, тот попал в репозиторий, а сменить его теперь страшно, потому что непонятно, кто им пользуется. Vault превращает это в управляемый процесс.

Сразу важное разграничение: Vault — не менеджер паролей для людей. Это хранилище для машин. Людям — Bitwarden, сервисам — Vault.

Что он умеет сверх «зашифрованного хранилища»

  • KV-хранилище — то, чего все ждут: положить секрет по пути, забрать по пути. Версия v2 хранит историю изменений.
  • Динамические секреты — главная фича. Vault сам создаёт учётку в PostgreSQL на 30 минут под конкретное приложение и сам удаляет её по истечении. Постоянного пароля, который можно украсть, просто не существует.
  • PKI — Vault работает как внутренний удостоверяющий центр и выпускает SSL-сертификаты для внутренних сервисов по запросу.
  • Transit — шифрование как сервис: приложение отправляет данные, получает шифротекст, ключ при этом не покидает Vault. Так шифруют поля в БД, не доверяя приложению ключ.
  • Аудит — каждое обращение к каждому секрету пишется в лог. При инциденте это единственный способ понять, что именно утекло.

Ключевые понятия

Понятие Что это
Secrets engine модуль, отвечающий за тип секретов: kv, database, pki, transit
Auth method как доказать, кто ты: AppRole, Kubernetes, OIDC, LDAP, token
Policy правила доступа к путям, описанные в HCL
Lease срок жизни выданного секрета; по истечении — отзыв
Seal / Unseal запечатанное и распечатанное состояние хранилища

Модель прав в Vault строится на путях, а не на объектах — по сути это RBAC поверх дерева путей:

path "database/creds/app-readonly" {
  capabilities = ["read"]
}

path "secret/data/app/*" {
  capabilities = ["read", "list"]
}

Seal и unseal — то, что удивляет новичков

После старта Vault запечатан: он не может расшифровать собственное хранилище и не отвечает на запросы, пока его не распечатают. Мастер-ключ при инициализации разбивается по схеме Шамира на несколько частей, и для распечатывания нужно предъявить не все, а заданный порог — например, три ключа из пяти. Части раздают разным людям.

Смысл в том, что ни один администратор в одиночку не поднимет Vault и не прочитает секреты. Оборотная сторона — после каждого перезапуска нужны живые люди с ключами. Поэтому в продакшене включают auto-unseal через облачный KMS или HSM: Vault сам распечатывается ключом, который хранится вне его.

Это же — главный операционный риск: Vault становится единой точкой отказа. Он лёг — приложения не получат пароли к базам. Разворачивают его кластером из нескольких узлов (штатное хранилище — Integrated Storage на Raft), и бэкап снапшотов Raft должен существовать до того, как понадобится.

Как приложение получает секрет

# аутентификация по AppRole: role_id + secret_id -> токен
vault write auth/approle/login \
  role_id="$ROLE_ID" secret_id="$SECRET_ID"

# запрос временной учётки к БД
vault read database/creds/app-readonly
# username  v-approle-app-x9k2...
# password  A1a-BcD3fG...
# lease_duration  30m

В Kubernetes это делается прозрачнее: под аутентифицируется своим service account, а Vault Agent подкладывает секрет в файл — приложение вообще не знает про Vault. Аналогично в CI/CD, где Vault заменяет вечные переменные окружения в настройках раннера.

Порт по умолчанию — 8200.

Лицензия и альтернативы

В 2023 году HashiCorp сменила лицензию своих продуктов с MPL на BSL — исходники остались открытыми, но использование в конкурирующем продукте запретили. В ответ сообщество сделало форк OpenBao под эгидой Linux Foundation. Для внутреннего использования в компании BSL ничего не меняет, для тех, кто продаёт Vault как услугу, — меняет всё.

Другие варианты: Infisical (проще, современнее), SOPS и sealed-secrets (шифрование секретов прямо в Git, подход GitOps), облачные AWS Secrets Manager и аналоги. Vault сложнее почти всех, но динамические секреты, PKI и transit в одном продукте больше не даёт никто.

Связанные термины

Готовы запустить GPU-задачу?

Запустить GPU-сервер