Перейти к основному содержимому

О разделе

HashiCorp Vault — централизованное хранилище секретов (пароли, ключи API, TLS-сертификаты) с аудитом, rotation и fine-grained policies (политиками доступа). Практикум проходит путь: dev-режим на Docker → движок KV v2AppRole → чтение из приложения и интеграция с CI и Kubernetes.

Секреты в GitOps-репозитории хранить нельзя — см. практикум GitOps. Vault закрывает этот пробел: Git описывает ExternalSecret, значения живут в Vault.

Для кого раздел

Нужны Docker, базовый Linux и знакомство с методами защиты данных. Полезно пройти практикум GitOps — секреты в K8s часто подтягивают из Vault через External Secrets Operator.


Что вы построите на стенде

  1. Vault в -dev на порту 8200.
  2. Секрет БД в path secret/demo/db.
  3. Policy с read-only на secret/data/demo/*.
  4. AppRole вместо root token для машин.
  5. ExternalSecret в кластере из GitOps practicum.

Предварительные требования

ИнструментПроверкаНазначение
Dockerdocker psКонтейнер vault-dev
curl или браузерHealth check API
Vault CLIvault versionput/get, policies
Опционально kindиз GitOps labExternal Secrets в K8s

Установка Vault CLI: https://developer.hashicorp.com/vault/docs/install

Базовая теория секретов — 8.03/117. OIDC для CI — 8.12/8.


Маршрут по шагам

ШагСтатьяСодержание
1Запуск Vault и KV secretsDocker dev, kv-v2 put/get, антипаттерны .env в Git
2Policies и AppRoleLeast privilege, role_id/secret_id, audit log
3Приложение и CIExternal Secrets, fetch at startup, OIDC в GitHub Actions

Итоги · Чек-лист

Рекомендуемый порядок 1 → 2 → 3. Шаг 3 опирается на AppRole из шага 2; для блока K8s нужен кластер из GitOps practicum.


Dev-режим и production

Только lab
Режим -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 tokendev-root-token в envBreak-glass, редко используется
AuditОпционально fileSIEM, 8.07/114

Связь с GitOps и Kubernetes

GitOps-манифесты в Git без plaintext password. Типичная схема:

  1. Vault хранит secret/demo/db.
  2. External Secrets Operator (ESO) создаёт Kubernetes Secret из Vault.
  3. Pod монтирует Secret по volume или envFrom.
  4. 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 engineKey-Value хранилище в Vault
PolicyHCL-правила доступа к paths
AppRoleMachine auth — role_id + secret_id
ESOExternal Secrets Operator в Kubernetes
RotationСмена секрета без смены path
UnsealРаспечатывание Vault после restart
SealVault не отвечает на запросы до unseal

Способы хранения секретов в K8s

СпособБезопасно для GitProduction
Plaintext в YAMLНетНет
Sealed SecretsДаДа
SOPS + ageДаДа
Vault + ESOДаДа

Practicum показывает Vault + ESO в связке с GitOps 8.13.


Время прохождения

ШагМинут
1 — Docker + KV25–35
2 — Policy + AppRole30–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

  1. Развернуть Vault HA (Raft storage, 3+ nodes).
  2. Настроить auto-unseal через cloud KMS.
  3. Включить audit на immutable storage + SIEM — 8.07/114.
  4. Заменить root token на break-glass процедуру.
  5. Kubernetes auth для ESO вместо static token.
  6. 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/503docker stop vault-dev или порт 8201
permission denied Dockerdocker ps OKЗапустите Docker Desktop
connection refusedvault statusdocker logs vault-dev
permission denied на kv putversion 1Проверьте VAULT_TOKEN

Предупреждения безопасности раздела

  1. Режим -dev только для lab — данные в RAM, без HA.
  2. Root token dev-root-token не в Git, CI, Kubernetes manifest.
  3. Production — TLS, audit log, auto-unseal, break-glass root.
  4. Dump Postgres в offsite шифруйте — Vault хранит runtime credentials, не заменяет backup encryption.
  5. AppRole secret_id — masked в CI logs, одноразовый где возможно.

Чек-лист готовности к шагу 1

#ПроверкаКомандаОжидание
1Dockerdocker psбез ошибки
2Vault CLIvault versionv1.x
3Контейнерdocker ps --filter name=vault-devUp
4Unsealedvault statusSealed false
5KV доступенvault secrets listsecret/