О разделе
HashiCorp Vault — централизованное хранилище секретов (пароли, ключи API, TLS-сертификаты) с аудитом, rotation и fine-grained policies (политиками доступа). Практикум проходит путь: dev-режим на Docker → движок KV v2 → AppRole → чтение из приложения и интеграция с CI и Kubernetes.
Секреты в GitOps-репозитории хранить нельзя — см. практикум GitOps. Vault закрывает этот пробел: Git описывает ExternalSecret, значения живут в Vault.
Нужны Docker, базовый Linux и знакомство с методами защиты данных. Полезно пройти практикум GitOps — секреты в K8s часто подтягивают из Vault через External Secrets Operator.
Что вы построите на стенде
- Vault в
-devна порту 8200. - Секрет БД в path
secret/demo/db. - Policy с read-only на
secret/data/demo/*. - AppRole вместо root token для машин.
- ExternalSecret в кластере из GitOps practicum.
Предварительные требования
| Инструмент | Проверка | Назначение |
|---|---|---|
| Docker | docker ps | Контейнер vault-dev |
| curl или браузер | — | Health check API |
| Vault CLI | vault version | put/get, policies |
| Опционально kind | из GitOps lab | External Secrets в K8s |
Установка Vault CLI: https://developer.hashicorp.com/vault/docs/install
Базовая теория секретов — 8.03/117. OIDC для CI — 8.12/8.
Маршрут по шагам
| Шаг | Статья | Содержание |
|---|---|---|
| 1 | Запуск Vault и KV secrets | Docker dev, kv-v2 put/get, антипаттерны .env в Git |
| 2 | Policies и AppRole | Least privilege, role_id/secret_id, audit log |
| 3 | Приложение и CI | External Secrets, fetch at startup, OIDC в GitHub Actions |
Рекомендуемый порядок 1 → 2 → 3. Шаг 3 опирается на AppRole из шага 2; для блока K8s нужен кластер из GitOps practicum.
Dev-режим и production
-dev хранит root token в памяти, без HA и без persistent storage. В production — кластер Vault, auto-unseal (KMS/HSM), audit log в immutable storage.На стенде -dev допустим для обучения. В production те же API (KV, policies, AppRole), но другая топология:
| Аспект | Lab (-dev) | Production |
|---|---|---|
| Хранение данных | В памяти контейнера | Persistent backend (Consul, Raft, cloud) |
| Unseal | Автоматически | Shamir keys или auto-unseal |
| Root token | dev-root-token в env | Break-glass, редко используется |
| Audit | Опционально file | SIEM, 8.07/114 |
Связь с GitOps и Kubernetes
GitOps-манифесты в Git без plaintext password. Типичная схема:
- Vault хранит
secret/demo/db. - External Secrets Operator (ESO) создаёт Kubernetes Secret из Vault.
- Pod монтирует Secret по volume или envFrom.
- Argo CD синхронизирует только ExternalSecret YAML — см. 8.13 шаг 2.
Теория DevSecOps — 8.12/3.
Типичные проблемы до старта
| Симптом | Решение |
|---|---|
vault: command not found | Установите CLI, добавьте в PATH |
| Port 8200 занят | docker stop vault-dev или смените -p 8201:8200 |
permission denied на Docker | Запустите Docker Desktop / добавьте пользователя в группу docker |
Подробные команды — в шаге 1.
Словарь терминов раздела
| Термин | Объяснение |
|---|---|
| Secret | Чувствительные данные — password, API key |
| KV engine | Key-Value хранилище в Vault |
| Policy | HCL-правила доступа к paths |
| AppRole | Machine auth — role_id + secret_id |
| ESO | External Secrets Operator в Kubernetes |
| Rotation | Смена секрета без смены path |
| Unseal | Распечатывание Vault после restart |
| Seal | Vault не отвечает на запросы до unseal |
Способы хранения секретов в K8s
| Способ | Безопасно для Git | Production |
|---|---|---|
| Plaintext в YAML | Нет | Нет |
| Sealed Secrets | Да | Да |
| SOPS + age | Да | Да |
| Vault + ESO | Да | Да |
Practicum показывает Vault + ESO в связке с GitOps 8.13.
Время прохождения
| Шаг | Минут |
|---|---|
| 1 — Docker + KV | 25–35 |
| 2 — Policy + AppRole | 30–40 |
| 3 — ESO + приложение | 45–60 |
Чек перед шагом 1
docker ps --filter name=vault-dev
vault version 2>/dev/null || echo "Install Vault CLI"
curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:8200/v1/sys/health 2>/dev/null || echo "Vault not running yet"
Production roadmap после lab
- Развернуть Vault HA (Raft storage, 3+ nodes).
- Настроить auto-unseal через cloud KMS.
- Включить audit на immutable storage + SIEM — 8.07/114.
- Заменить root token на break-glass процедуру.
- Kubernetes auth для ESO вместо static token.
- Rotation policy и alerting на failed login.
DevSecOps checklist — 8.12/3.
Полный walkthrough подготовки Vault lab
Проверка окружения
docker ps --filter name=vault-dev
vault version 2>/dev/null || echo "Install Vault CLI"
curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:8200/v1/sys/health 2>/dev/null || echo "Vault not running"
Ожидаемо до старта — Vault not running, HTTP 000.
Запуск контейнера
docker rm -f vault-dev 2>/dev/null || true
docker run --cap-add=IPC_LOCK -d --name vault-dev -p 8200:8200 \
-e VAULT_DEV_ROOT_TOKEN_ID=dev-root-token \
-e VAULT_DEV_LISTEN_ADDRESS=0.0.0.0:8200 \
hashicorp/vault:1.17
export VAULT_ADDR=http://127.0.0.1:8200
export VAULT_TOKEN=dev-root-token
vault status
Ожидаемый вывод vault status:
Sealed false
Первая запись секрета
vault kv put secret/demo/db url=postgres://localhost:5432/app password='CHANGE_ME_STRONG' username=app_user
vault kv get secret/demo/db
Типичные ошибки до старта Vault
| Симптом | Ожидание при OK | Решение |
|---|---|---|
vault: command not found | версия CLI | Установите с developer.hashicorp.com |
| Port 8200 занят | curl 200/429/503 | docker stop vault-dev или порт 8201 |
permission denied Docker | docker ps OK | Запустите Docker Desktop |
connection refused | vault status | docker logs vault-dev |
permission denied на kv put | version 1 | Проверьте VAULT_TOKEN |
Предупреждения безопасности раздела
- Режим
-devтолько для lab — данные в RAM, без HA. - Root token
dev-root-tokenне в Git, CI, Kubernetes manifest. - Production — TLS, audit log, auto-unseal, break-glass root.
- Dump Postgres в offsite шифруйте — Vault хранит runtime credentials, не заменяет backup encryption.
- AppRole secret_id — masked в CI logs, одноразовый где возможно.
Чек-лист готовности к шагу 1
| # | Проверка | Команда | Ожидание |
|---|---|---|---|
| 1 | Docker | docker ps | без ошибки |
| 2 | Vault CLI | vault version | v1.x |
| 3 | Контейнер | docker ps --filter name=vault-dev | Up |
| 4 | Unsealed | vault status | Sealed false |
| 5 | KV доступен | vault secrets list | secret/ |
Практикум Vault — запуск и KV
Vault dev server в Docker, unseal в dev, kv-v2 put/get и запрет секретов в Git.
Практикум Vault — policies и AppRole
Least privilege policy, AppRole role_id/secret_id и audit log в учебном Vault.
Практикум Vault — приложение и CI
Чтение секретов при старте приложения, External Secrets в K8s и OIDC в GitHub Actions.
Практикум Vault — итоги
Резюме — KV, policies, AppRole, K8s External Secrets и CI без long-lived tokens.
Практикум Vault — чек-лист
Самопроверка после практикума HashiCorp Vault.
Практикум Vault — о разделе
HashiCorp Vault в dev — KV secrets, policies, AppRole и выдача секретов приложению и CI без .env в Git.