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

3.2 KiB
Raw Blame History

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 1fetch-secrets: аутентифицируется в Vault и записывает секреты в .env.vault

Step 2+ — любые шаги: делают source .env.vault и используют переменные

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, ...}

Управление секретами

# Добавить секрет
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