vault-test/README.md
igor d04617da42
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
Add Vault integration docs
2026-03-16 23:17:38 +00:00

91 lines
3.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Vault + Woodpecker CI Integration
Тестовый репозиторий для проверки интеграции HashiCorp Vault с Woodpecker CI.
## Как это работает
Vault хранит секреты проектов по пути `projects/<project>/<env>`. Woodpecker CI получает их через AppRole аутентификацию.
### Архитектура
```
Woodpecker Agent (сеть: internal)
└── Pipeline контейнер (подключён к сети internal через WOODPECKER_BACKEND_DOCKER_NETWORK)
└── vault write auth/approle/login → Vault (сеть: internal)
└── vault kv get projects/... → секреты
```
### Глобальные секреты Woodpecker
В Woodpecker настроены 3 глобальных секрета:
| Секрет | Описание |
|--------|----------|
| `vault_addr` | Адрес Vault (`http://vault:8200`) |
| `vault_role_id` | AppRole Role ID для аутентификации |
| `vault_secret_id` | AppRole Secret ID для аутентификации |
### Паттерн использования в пайплайнах
**Step 1**`fetch-secrets`: аутентифицируется в Vault и записывает секреты в `.env.vault`
**Step 2+** — любые шаги: делают `source .env.vault` и используют переменные
```yaml
steps:
- name: fetch-secrets
image: hashicorp/vault:latest
environment:
VAULT_ADDR:
from_secret: vault_addr
VAULT_ROLE_ID:
from_secret: vault_role_id
VAULT_SECRET_ID:
from_secret: vault_secret_id
commands:
- export VAULT_TOKEN=$(vault write -field=token auth/approle/login role_id=$VAULT_ROLE_ID secret_id=$VAULT_SECRET_ID)
- vault kv get -format=json projects/<project>/<env> | jq -r '.data.data | to_entries[] | "export \(.key)=\(.value)"' > .env.vault
- name: build
image: node:20
commands:
- source .env.vault
- npm run build
- name: deploy
image: alpine
commands:
- source .env.vault
- ./deploy.sh
```
### Структура секретов в Vault
```
projects/
├── <project-a>/
│ ├── prod → {DB_HOST, DB_PASS, API_KEY, ...}
│ └── staging → {DB_HOST, DB_PASS, API_KEY, ...}
├── <project-b>/
│ └── prod → {DB_HOST, DB_PASS, ...}
```
### Управление секретами
```bash
# Добавить секрет
vault kv put projects/my-app/prod DB_HOST=db.example.com DB_PASS=secret API_KEY=xxx
# Прочитать секрет
vault kv get projects/my-app/prod
# Обновить одно поле (patch)
vault kv patch projects/my-app/prod API_KEY=new-key
```
### Безопасность
- AppRole `woodpecker` имеет **read-only** доступ к `projects/*`
- Токен живёт 1 час (TTL), максимум 4 часа
- `.env.vault` существует только во время пайплайна — volume удаляется после завершения
- Секреты, полученные из Vault в runtime, **не маскируются** в логах Woodpecker — не выводите их через `echo`