3. Аутентификация
Цель — подключить Vault к инфраструктуре: кто и как получает доверенную сессию в Vault без «вечных» root token и без секретов в Git. Ниже — основные auth methods, типовые сценарии (CI/CD, Kubernetes, люди через SSO) и короткие примеры команд/API.
Auth methods: обзор
| Метод | Типичный сценарий | Production-комментарий |
|---|---|---|
| Token | Сервисные аккаунты Vault, break-glass, bootstrap | Не основной способ для приложений: короткий TTL, выдача через другой auth. |
| AppRole | Машины, CI/CD, VM без нативного identity | Must know: role_id + secret_id, ограничения по TTL и политикам. |
| Kubernetes | Pod → Vault по ServiceAccount | Роль с bound_service_account_*, проверка issuer/CA. |
| LDAP | Корпоративные пользователи (каталог) | Группы → политики; чаще в legacy / закрытый периметр. |
| OIDC (SSO) | Люди: Okta, Keycloak, Entra ID… | Группы/claims → identity + policies; единый вход. |
Правило: аутентификация отвечает на «кто вы», политики — на «что можно». Один метод может выдавать токен с несколькими политиками и метаданными.
Сценарии
| Сценарий | Рекомендуемый путь | Идея |
|---|---|---|
| CI/CD | AppRole (или OIDC workload в пайплайне, если доступен) | Разный role на dev/prod; secret_id не хранить в репозитории. |
| Pod в Kubernetes | Kubernetes auth | Доверие к API K8s + привязка к namespace/SA. |
| Человек | OIDC (+ MFA на стороне IdP) | Аудит по субъекту IdP, отзыв через IdP. |
Token: напоминание
Токен Vault — это credential после успешного login (или ручная выдача оператором). В production:
- минимальный TTL,
renewableтолько где осмысленно; - не протаскивать root/service token в переменные образа;
- предпочитать orphan и явные политики при автоматизации (см. документацию по
token_typeдля вашего auth).
# Пример: создать токен с политикой (только для операторских сценариев / отладки)
vault token create -policy=read-only-kv -ttl=8h -renewable=true
AppRole (обязательно знать)
role_id — публичный идентификатор роли; secret_id — секрет доставки (ограниченный по TTL/использованиям).
Best practices:
- разные роли для сред (dev/stage/prod);
- короткий TTL токена и политики least privilege;
- доставлять
secret_idчерез секретный канал (Vault Wrap, CI secrets, KMS), не в Git; - при возможности — ограничение по CIDR / metadata на роли.
Включение и роль для CI
vault auth enable approle
# Роль пайплайна: только нужные policy, ограниченное время жизни токена
vault write auth/approle/role/ci-deploy \
token_policies="ci-kv-read" \
token_ttl=15m \
token_max_ttl=1h \
bind_secret_id=true \
secret_id_ttl=60m \
secret_id_num_uses=10
# Получить role_id (кладётся в CI как non-secret или через переменную окружения по процессу)
vault read auth/approle/role/ci-deploy/role-id
# Выдать secret_id (одноразово — не логировать и не коммитить)
vault write -f auth/approle/role/ci-deploy/secret-id
Логин по AppRole
export VAULT_ADDR='https://vault.example:8200'
vault write -field=token auth/approle/login \
role_id="$VAULT_ROLE_ID" \
secret_id="$VAULT_SECRET_ID"
Комментарий: в пайплайнах часто сохраняют только token из ответа во временную переменную и дальше вызывают vault kv get ….
Kubernetes Auth
Vault доверяет JWT ServiceAccount и API Kubernetes. Нужны: доступ Vault к API кластера (или корректная конфигурация для вашей топологии), CA, issuer/audience в зависимости от версии и модели токенов.
Best practices:
- узкая роль:
bound_service_account_names,bound_service_account_namespaces, при необходимости audience; - отдельный ServiceAccount на приложение, не
default; - мониторинг ошибок аутентификации и ротация kube config на стороне Vault.
Включение и конфигурация (упрощённый пример)
vault auth enable kubernetes
# Параметры зависят от окружения: хост API, JWT reviewer, CA
# В production используйте официальный гайд для вашей версии Vault/K8s
vault write auth/kubernetes/config \
kubernetes_host="https://kubernetes.default.svc:443" \
kubernetes_ca_cert=@/path/to/ca.pem \
token_reviewer_jwt=@/path/to/vault-reviewer-token.jwt
Роль для pod
vault write auth/kubernetes/role/myapp \
bound_service_account_names=myapp \
bound_service_account_namespaces=production \
policies=myapp-kv \
ttl=1h \
max_ttl=24h
Логин из pod (после монтирования SA)
# JWT обычно лежит в /var/run/secrets/kubernetes.io/serviceaccount/token
JWT=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
vault write -field=token auth/kubernetes/login role=myapp jwt="$JWT"
Комментарий: в EKS/GKE/AKS уточните issuer и настройки projected SA tokens (аудитория), чтобы избежать сюрпризов при обновлении платформы.
LDAP / OIDC (SSO)
LDAP
Подходит, когда пользователи уже в каталоге. Типичная связка: группы LDAP → внешние или встроенные group aliases → политики.
vault auth enable ldap
vault write auth/ldap/config \
url="ldaps://ldap.example:636" \
userdn="OU=Users,DC=example,DC=com" \
groupdn="OU=Groups,DC=example,DC=com" \
binddn="CN=vault,OU=Service,DC=example,DC=com" \
bindpass="REDACTED" \
userattr="sAMAccountName" \
groupattr="cn" \
insecure_tls=false
Best practice: LDAPS, отдельный bind-аккаунт с минимальными правами, пароль bind — из Vault или секрет-менеджера окружения, не в репозитории.
OIDC (Okta / Keycloak / др.)
Поток: браузерный login → IdP → callback → Vault выдаёт token. Настройки зависят от провайдера (discovery URL, client, redirect URIs, scopes).
vault auth enable oidc
vault write auth/oidc/config \
oidc_discovery_url="https://keycloak.example/realms/corp/.well-known/openid-configuration" \
oidc_client_id="vault" \
oidc_client_secret="REDACTED" \
default_role="default" \
oidc_response_mode="query"
vault write auth/oidc/role/default \
user_claim="sub" \
allowed_redirect_uris="https://vault.example:8200/ui/vault/auth/oidc/oidc/callback" \
bound_audiences="vault" \
oidc_scopes="openid,profile,email" \
policies="default-read"
Best practices:
- PKCE и настройки безопасности по гайду HashiCorp + вашего IdP;
- маппинг групп из claim (
groups claim) на политики — отдельная настройка (механизмы identity/group alias); - для людей — MFA на стороне IdP;
oidc_client_secretв production лучше подставлять из окружения/файла с правами0400, не светить в логах.
Сводный production checklist
| # | Практика |
|---|---|
| 1 | Долгоживущие root/широкие token’ы не использовать для приложений и людей |
| 2 | AppRole: разделение ролей по средам, короткий secret_id/token TTL |
| 3 | Kubernetes: жёсткие bound_*, отдельный SA, актуальная конфигурация JWT |
| 4 | OIDC/LDAP: группы → минимальные политики, аудит логинов |
| 5 | Регулярно пересматривать auth methods и отключать неиспользуемые |