57 lines
4.6 KiB
Markdown
57 lines
4.6 KiB
Markdown
# 07 — Инфраструктурные требования: Security-гейт (ORCH-022)
|
||
|
||
См. `06-adr/ADR-001-security-gate.md` (Р-2, Р-3, Р-8). Топология не меняется (один сервер
|
||
mva154, Docker Compose). Новые требования — только инструменты сканирования и сетевой доступ
|
||
к CVE-фиду.
|
||
|
||
## I-1. Бинарь `gitleaks` в образе
|
||
- **Что:** статический Go-бинарь `gitleaks` (secret-scanning), устанавливается в `Dockerfile`
|
||
(НЕ pip-пакет). Зафиксировать версию (pinned release) для детерминизма.
|
||
- **Почему в образе, а не на хосте:** гейт исполняется внутри контейнера оркестратора
|
||
(`advance_stage`); сканируется per-task worktree, смонтированный в контейнер.
|
||
- **Оффлайн:** gitleaks не требует сети (правила локальны) → гарантия «секрет всегда
|
||
блокирует» (BR-2) не зависит от доступности интернета.
|
||
- **Контракт exit-кодов:** 0 = чисто, 1 = найдены секреты, ≥2 = ошибка инструмента
|
||
(≥2 → never-raise degrade-вердикт гейта).
|
||
|
||
## I-2. `pip-audit` в зависимостях
|
||
- **Что:** Python-пакет `pip-audit` (dependency audit), добавляется в `requirements.txt`
|
||
(pinned-версия).
|
||
- **Источник advisory:** OSV / PyPI advisory DB — **требует сетевого доступа** (исходящий
|
||
HTTPS к OSV/PyPI).
|
||
- **Цель v1:** аудит `requirements.txt` корня репо (Python-стек, A3). Мульти-стек — follow-up.
|
||
|
||
## I-3. Сетевой доступ к CVE-фиду (degrade-политика)
|
||
- **Требование:** исходящий HTTPS из прод-контейнера к OSV/PyPI advisory.
|
||
- **При недоступности (Р-3):** **fail-open + громкий warning** по умолчанию — dep-audit не
|
||
краснит гейт из-за сетевого сбоя (анти-петля ORCH-061); фиксируется
|
||
`deps_audit_degraded: true` + Telegram + лог. Флаг `security_dep_audit_fail_closed`
|
||
(дефолт `false`) — для перевода в строгий режим без редеплоя кода.
|
||
- **Секреты не зависят от сети** (I-1) — критическая гарантия безусловна.
|
||
|
||
## I-4. Конфиг-файлы в репозитории (версионируемые, BR-13)
|
||
- `.gitleaks.toml` (корень репо): правила + аллоулист заведомо-безопасных совпадений
|
||
(плейсхолдеры `.env.example`, тест-фикстуры). Версионируется, ревьюится как код.
|
||
|
||
## I-5. Env-флаги (`.env.example` + хост `.env`/`.env.staging`)
|
||
| Переменная | Дефолт | Назначение |
|
||
|------------|--------|-----------|
|
||
| `ORCH_SECURITY_GATE_ENABLED` | `true` | глобальный kill-switch |
|
||
| `ORCH_SECURITY_GATE_REPOS` | `` (пусто) | CSV scope; пусто → только self-hosting |
|
||
| `ORCH_SECURITY_DEP_BLOCK_SEVERITY` | `HIGH` | порог блокировки зависимостей |
|
||
| `ORCH_SECURITY_SCAN_TIMEOUT_S` | `300` | таймаут каждого внешнего вызова сканера |
|
||
| `ORCH_SECURITY_DEP_AUDIT_FAIL_CLOSED` | `false` | строгий режим при недоступном фиде |
|
||
| `ORCH_SECURITY_SECRETS_BLOCK` | `true` | секреты блокируют (всегда по дефолту) |
|
||
|
||
Секреты-значения в гит НЕ коммитятся (CLAUDE.md §8) — только дефолты в `.env.example`.
|
||
|
||
## I-6. Ресурсы и тайминги
|
||
- Время сканирования добавляется к каждому прогону задачи на ребре `deploy-staging → deploy`,
|
||
ограничено `ORCH_SECURITY_SCAN_TIMEOUT_S` (по образцу `merge_retest_timeout_s`).
|
||
- Гейт исполняется ДО merge-gate/image-freshness (дёшево фейлить до дорогих rebase/rebuild).
|
||
|
||
## I-7. Self-hosting safety (инвариант)
|
||
Гейт **только читает/сканирует** (git, gitleaks, pip-audit, запись артефакта). Не вызывает
|
||
деплой-хук, не рестартит/не трогает прод-контейнер (8500/8501). Прод-деплой ORCH-022 — строго
|
||
через staging-гейт (8501).
|