This commit is contained in:
parent
56d8990077
commit
d04617da42
1 changed files with 90 additions and 2 deletions
92
README.md
92
README.md
|
|
@ -1,3 +1,91 @@
|
|||
# vault-test
|
||||
# Vault + Woodpecker CI Integration
|
||||
|
||||
Test Vault integration with Woodpecker CI
|
||||
Тестовый репозиторий для проверки интеграции 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`
|
||||
|
|
|
|||
Loading…
Reference in a new issue