# A8 infosec-tooling integration — design

**Дата:** 2026-05-21
**Раздел карты:** A8 «Информационная безопасность»
**Тип:** off-phase tooling integration (как A11 / C10 / discovery / finance / A1)
**Статус:** design (на утверждение заказчика)
**Триггер:** портал Лидерра подходит к публичному запуску в интернете; заказчик попросил подобрать 5–7 плагинов (GitHub + Anthropic), закрывающих потребности безопасности портала.

> **ПОПРАВКА 2026-05-21 (узел #70):** Enlightn заменён на **Ward** (`Eljakani/ward`, Go, MIT) по итогам Task 1 IS9-вета — Enlightn оказался abandoned и без поддержки Laravel 13; заказчик выбрал «подобрать замену». Ward — Go-бинарь (не Composer dev-dep), не зависит от версии Laravel, та же ниша (config security scanner). Полное обоснование — `docs/security/infosec-vet.md` §«ПЕРЕСМОТР #70». Ниже по тексту «Enlightn» в слоте #70 читать как «Ward»; тип меняется с «Composer dev-dep» на «Go-бинарь CLI»; граница IS3 сохраняется.

---

## 1. Контекст и проблема

Раздел A8 «Информационная безопасность» на карте `docs/automation-graph-data.js` (строка `{ id: 'A8', ... label: 'Информационная безопасность' }`) **формально существует, но дедицированных узлов не имеет**. В него только кросс-тегированы уже существующие фазовые инструменты:

- `mcp_semgrep` → A8 (Semgrep MCP #25, статический анализ кода, фаза 3);
- `lh_gitleaks` / `lh_gitleaks2` → A8 (gitleaks #8, поиск секретов, pre-commit + pre-push).

То есть раздел про защиту портала перед выходом в интернет — **пустой лист**.

**Уже покрыто существующим тулчейном (НЕ дублировать — §5 п.6 «один инструмент на задачу»):**

- Статический анализ кода — Semgrep #25, Larastan #12, Trail of Bits `static-analysis` (CodeQL/Semgrep) #39.
- Секреты — gitleaks #8.
- Зависимости / CVE — Dependabot #27, Trivy #26 (контейнеры), Trail of Bits `supply-chain-risk-auditor` #39, GitHub MCP advisory-инструменты.
- Inline-предупреждения уязвимостей при правке — Security Guidance #40 (блокирующий PreToolUse-хук).
- Аудит-кампании и риски — Trail of Bits #39, `/security-review`, `audit-portal` (раздел **D3**).
- БД-аудит и маскирование — pg_audit #28, pg_anonymizer #29.
- Изоляция арендаторов — RLS (ADR-002, 39 политик, 5 ролей).

**Дефициты чистого A8** (технические инструменты защиты *самого работающего портала* — отдельно от процесса аудита D3, статики кода, БД-инструментов):

1. **Динамическая «боевая» проверка работающего портала (DAST)** — отсутствует полностью. Весь текущий арсенал статичен (читает код/конфиг/БД) — никто не «атакует» запущенный портал снаружи (обход входа, инъекции, XSS на живых endpoint'ах). **Главный пробел перед выходом в интернет.**
2. **Широкая проверка на известные уязвимости и небезопасную внешнюю экспозицию** (known-CVE / открытые двери / слабый TLS) — нет.
3. **Laravel-специфичная безопасность конфигурации** (заголовки, режим отладки, утечки настроек, флаги cookie, права файлов) — не покрыта (Semgrep = generic-паттерны, Larastan = типы).
4. **Защита персональных данных + соответствие 152-ФЗ** — нет дедицированного инструмента; критично для публичного РФ-портала с ПДн (телефоны лидов, данные клиентов).
5. **Моделирование угроз под выход в интернет** (STRIDE, карта точек входа, что меняется при публичной экспозиции) — нет.
6. **Единый go-live security-gate** (один воспроизводимый прогон «можно/нельзя в прод» по безопасности) — нет.

**Источник «Anthropic vs GitHub»:** Anthropic-side security-арсенал уже интегрирован в D3 (Security Guidance хук + `/security-review` + Trail of Bits marketplace-субсет). DAST-движка и Laravel-сканера у Anthropic нет → внешние GitHub-инструменты обоснованы. Для 152-ФЗ и угроз-под-наш-портал готового (которое знает РФ-закон и устройство Лидерры) не существует → self-authored.

**Подтверждённый риск ecosystem'а (влияет на дизайн):** исследование Snyk «ToxicSkills» + разборы SentinelOne и Cato CTRL (2025): **≈13% security-скилов из маркетплейсов содержат критичные дефекты, часть пытается красть учётные данные.** Установка непроверенного security-скила в раздел про безопасность сама по себе риск-провал (прямая аналогия отложенным «community-аудиторам с непроверенным происхождением» — ADR-003). Отсюда — **провенанс-гейт IS9** на каждый внешний инструмент.

## 2. Scope

6 новых узлов A8, новая **17-я off-phase подкатегория «infosec-tooling»**, номера Tooling **#68–#73** (продолжение после backend-tooling #64–67):

| ID карты | # | Узел | Источник | Тип |
|---|---|---|---|---|
| `mcp_zap` | 68 | OWASP ZAP (MCP) | GitHub — официальный ZAP «MCP Integration» add-on (OWASP) / `dtkmn/mcp-zap-server` (Apache-2.0) | внешний, MCP |
| `mcp_nuclei` | 69 | Nuclei (MCP) | GitHub `projectdiscovery/nuclei` (MIT) + проверенный MCP-wrapper | внешний, MCP |
| `enlightn` | 70 | Enlightn | GitHub `enlightn/enlightn` (OSS, 60 проверок, LGPL; security-checker MIT), Composer dev-dep | внешний, CLI |
| `sk_pdn_152fz` | 71 | Скил «ПДн / 152-ФЗ» | self-authored project-скил | свой |
| `sk_threat_model` | 72 | Скил «Моделирование угроз» | self-authored project-скил | свой |
| `sk_security_golive` | 73 | Скил «Прогон перед публикацией» | self-authored project-скил | свой |

**Решение заказчика по подходу (зафиксировано, §12):** «всё готовое» для движков (#68–70), «свои» для двух project-specific слотов (#71–72); #73 добавлен как свой оркестратор go-live.

### Out of scope (осознанно отброшено / отдельный слой)

- **Готовые маркетплейс-скилы «threat-modeling» / «compliance»** (fr33d3m0n, josemlopez, и пр.) — отброшены для слотов #71/#72: дают generic-методику (GDPR/SOC2, не 152-ФЗ; не знают устройство Лидерры) + несут риск ToxicSkills. Берём как *референс при написании своих*, не как установку.
- **Серверный слой защиты боевого портала** (WAF, rate-limit/anti-brute-force, DDoS, intrusion monitoring, secrets vault, TLS/HSTS/CSP, бэкапы + IR-runbook) — **не плагины**, в набор A8 не входят; фиксируются как открытые вопросы инфраструктуры (§9), реализуются отдельно (привязка к Б-1).
- **Платные / commercial-tier** (Enlightn Pro 131 проверка, Snyk платный, ProjectDiscovery Cloud) — берём только OSS-уровень (РФ-резидентность данных, near-zero cost).
- **Дедицированный новый dependency/SBOM-инструмент** — не добавляем: зависимости уже покрыты Dependabot #27 + Trivy #26 + ToB supply-chain #39 + GitHub MCP advisory (дубль по §5 п.6).

## 3. Дизайн узлов

### #68 OWASP ZAP (`mcp_zap`)

- **Назначение:** глубокая динамическая («боевая») проверка работающего портала — spider/crawl + active scan: обход аутентификации, инъекции (SQLi), XSS, небезопасные редиректы, проблемы сессий/CSRF на живых endpoint'ах.
- **Кандидаты (выбор по IS9-вету, Spike 1):** официальный ZAP «MCP Integration» add-on (провенанс OWASP — чистейший) либо `dtkmn/mcp-zap-server` (Apache-2.0, Spring Boot, экспонирует ZAP по MCP). Регистрация в `.mcp.json`.
- **Цель сканирования (IS8-гард):** по умолчанию — **локальная/тестовая копия портала** (native-Windows dev на localhost). Боевой сервер — только осознанно и аккуратно (заказчик выбрал полный объём; гард в SKILL'е #73 и в SKILL.md ZAP-обвязки).
- **Постура:** ручной / on-demand (никогда не в pre-commit хук — тяжёлый, требует запущенного таргета).
- **Граница (ADR-014):** ZAP (динамика, бьёт работающий портал) ≠ Semgrep #25 (статика, читает исходники) — разные классы (IS1).

### #69 Nuclei (`mcp_nuclei`)

- **Назначение:** широкая быстрая проверка снаружи по YAML-шаблонам — известные CVE, дефолтные креды, открытые двери/порты, утечки конфигов, слабый TLS, fingerprint-уязвимости стека.
- **Кандидаты (Spike 1, IS9):** движок `projectdiscovery/nuclei` (MIT, очень известный) + проверенный MCP-wrapper (`cyproxio/mcp-for-security` nuclei-mcp / `addcontent/nuclei-mcp`) либо запуск CLI через тонкую обвязку. Выбор wrapper'а по провенансу.
- **Постура:** ручной / on-demand; таргет — тот же гард IS8.
- **Граница (ADR-014):** Nuclei (широта — известные дыры/экспозиция по шаблонам) ≠ ZAP (глубина — логика приложения, активные инъекции) — комплементарны, не дубль (IS2).

### #70 Enlightn (`enlightn`)

- **Назначение:** Laravel-специфичная проверка безопасности конфигурации и кода — заголовки (CSP/HSTS/X-Frame), `APP_DEBUG` в проде, утечки `.env`/настроек, флаги cookie (Secure/HttpOnly/SameSite), права файлов, CSRF, mass-assignment, встроенный dependency-чек.
- **Источник:** `enlightn/enlightn` в `app/composer.json` `require-dev` — **OSS-уровень (60 проверок)**, конфиг `app/config/enlightn.php`.
- **Постура:** on-demand / CI (`php artisan enlightn`), **НЕ блокирующий lefthook** (паттерн Rector/PHP Insights — не множить гейты на коммите). Реюз: показатель в `audit-portal` + в #73.
- **Граница (ADR-014):** Enlightn (настройки/конфигурация Laravel) ≠ Larastan #12 (типы) / Semgrep #25 (generic-паттерны) — разные оси (IS3). Dependency-чек Enlightn — реюз-наложение с Dependabot/Trivy, не дедуплицируем (информационно, не гейт).

### #71 Скил «ПДн / 152-ФЗ» (`sk_pdn_152fz`)

- Self-authored project-скил `.claude/skills/pdn-152fz-audit/` (паттерн `billing-audit` / `ru-tax-accounting`): `SKILL.md` + `references/` + `evals/`.
- **Режим 1 — технический аудит ПДн:** проход по `db/schema.sql` и коду — где лежат ПДн (телефоны лидов, данные клиентов-арендаторов); под RLS ли; маскируются ли в дампах (pg_anonymizer #29); не утекают ли в логи / Sentry / экспорты CSV / `import_log`; шифрование чувствительных полей.
- **Режим 2 — соответствие 152-ФЗ:** чек-лист — хранение в РФ (Yandex Cloud `ru-central1` ✓), согласия на обработку, сроки хранения и удаление, реестр обработки ПДн, уведомление РКН, права субъекта (в схеме уже есть `pd_subject_request` + функция `set_pd_subject_request_deadline`).
- Результат — отчёт в `docs/security/` (новая home-директория раздела A8).
- **Граница (ADR-014):** скил (аудит + чек-лист закона, направление) ≠ pg_anonymizer #29 (инструмент маскирования) (IS4); скил (техника + 152-ФЗ-чек-лист) ≠ D2/юрист (юридическое оформление: договоры, политики, согласия как документы) (IS5).

### #72 Скил «Моделирование угроз» (`sk_threat_model`)

- Self-authored project-скил `.claude/skills/threat-model/`.
- STRIDE под наш портал (не generic): карта точек входа (форма входа, регистрация/2FA/recovery, вебхуки поставщика лидов, deals API, админка, impersonation, импорт CSV); что меняется при выходе в интернет (раньше — контур своих, теперь — произвольный внешний актор); приоритизация — что защищать первым.
- Результат — отчёт `docs/security/threat-model-*.md`.
- **Граница (ADR-014):** скил (наш портал, STRIDE, going-public) ≠ Trail of Bits `audit-context-building` #39 (generic deep code-audit) (IS6).

### #73 Скил «Прогон перед публикацией» (`sk_security_golive`)

- Self-authored project-скил `.claude/skills/security-go-live/` (паттерн `audit-portal`, но узко про безопасность).
- Единый go-live security-gate: оркеструет #68 ZAP + #69 Nuclei + #70 Enlightn + #71 ПДн + #72 угрозы + уже имеющиеся Semgrep #25 / Trivy #26 / gitleaks #8 / Trail of Bits #39 → собирает один вердикт «можно / нельзя в прод» с уровнями серьёзности.
- **Граница (ADR-014):** #73 (только безопасность, go-live-вердикт) ≠ `audit-portal` (полный 14-фазный аудит портала, включает не-security фазы) (IS7); #73 *вызывает* D3-инструменты, не заменяет их.

## 4. Роутер footprint (ADR-011 brain governance)

- **`docs/router-procedure.md`** v1.2 → **v1.3**: без изменения процедуры; bump cross-ref-строк под новый набор узлов (шаг 3 читает 9-атрибутный реестр Tooling).
- **`docs/routing-off-phase.md`** v1.3 → **v1.4**: +6 строк routing-таблицы (триггер → узел) для #68–73 + новая каноническая связка **L15 «security go-live chain»**: #73 (оркестратор) → #68 ZAP / #69 Nuclei / #70 Enlightn / #71 ПДн / #72 угрозы + D3 (#39/#25/#26/#8/#40). Anti-pattern: не запускать ZAP/Nuclei в pre-commit хук (тяжёлые, требуют таргета); не путать #73 (security go-live) с `audit-portal` (полный аудит).
- **9-атрибутный реестр** (Tooling Прил. Н §4.43–4.48) — вход роутера (step 3): каждый узел получает полный 9-attribute блок.

## 5. Наблюдатель footprint (ADR-011 / observer factor-analysis)

- **9-атрибутные «Атрибуты»-блоки** на 6 новых узлах в Tooling Прил. Н (как finance §4.36–38 / backend §4.39–42) — кормят и роутер, и факторный анализ наблюдателя.
- **Контролёры:**
  - **C1 l1-watcher** (lefthook job 11, STRICT): новые MCP-серверы ZAP/Nuclei в `.mcp.json` обязаны иметь формализацию в Tooling Прил. Н — иначе блок коммита. Групповые/human-имена → alias в `tools/.l1-watcher-aliases.txt`.
  - **C2 cross-ref-checker** (lefthook job 12, STRICT): требует **атомарного version-bump-набора** (Tooling / PSR_v1 / Pravila / CLAUDE.md в одном коммите нормативки) — иначе drift и блок коммита.
- Новые узлы становятся видимы факторному анализу `/brain-retro`.

## 6. Нормативный footprint (атомарный набор)

- **Tooling Прил. Н** v2.19 → **v2.20**: §4.43–4.48 (#68–73 + 9-атрибутные блоки) + §0 счётчик 67 → 73 + 17-я off-phase подкатегория infosec-tooling.
- **PSR_v1** v3.19 → **v3.20**: R10.1 Блок 1/2/3 +6 строк (внешние ZAP/Nuclei/Enlightn + 3 своих скила; не UI → вне R6/R14).
- **Pravila** v1.35 → **v1.36**: §13.2 +абзац «Off-phase infosec-tooling».
- **CLAUDE.md** v2.22 → **v2.23**: §3.3 +#68–73, §6 +абзац фазы, §9 +запись (через прямой Edit — worktree-эксцепшн §5 п.10, прецедент A11/C10/discovery/finance/A1).
- **ADR-014** — границы узлов + коды конфликт-аудита IS1–IS9 (§8).

## 7. Карта footprint

- `docs/automation-graph-data.js`: +6 узлов в `NODE_SECTION` (все A8), рёбра (6 узлов + L15-связка-оркестрация от #73 + reuse-кросс-рефы на Semgrep/Trivy/gitleaks/ToB/pg_anonymizer), версии-метки в шапке (v1.36/v2.23/v3.20/v2.20), счётчики узлов/рёбер.
- Browser-smoke карты после правки (как iter9 / finance / A1).

## 8. Конфликт-аудит (коды IS — для ADR-014)

- **IS1** ZAP #68 ↔ Semgrep #25: динамика (бьёт работающий портал) vs статика (читает код) — разные классы.
- **IS2** Nuclei #69 ↔ ZAP #68: широта (известные дыры / экспозиция по шаблонам) vs глубина (логика приложения / активные инъекции) — комплементарны.
- **IS3** Enlightn #70 ↔ Larastan #12 / Semgrep #25: настройки/конфигурация Laravel vs типы / generic-паттерны.
- **IS4** скил «ПДн» #71 ↔ pg_anonymizer #29: аудит + направление (где ПДн, всё ли закрыто) vs инструмент маскирования.
- **IS5** скил «ПДн» #71 ↔ D2/юрист: техника + 152-ФЗ-чек-лист vs юридическое оформление документов.
- **IS6** скил «Угрозы» #72 ↔ Trail of Bits `audit-context-building` #39: наш портал + STRIDE + going-public vs generic deep code-audit.
- **IS7** скил «Прогон» #73 ↔ `audit-portal`: только безопасность + go-live-вердикт vs полный 14-фазный аудит; #73 *вызывает* D3, не заменяет.
- **IS8** «боевая» проверка (#68/#69) на бою: гард — по умолчанию локальная/тестовая копия; бой только осознанно и аккуратно (заказчик выбрал полный объём).
- **IS9** провенанс-гейт: каждый внешний (ZAP/Nuclei/Enlightn) перед установкой читается и проверяется на происхождение (риск ≈13% ToxicSkills) — расширение процедуры `docs/audit/` attack-surface.

## 9. Серверный слой (рекомендации к инфраструктуре — НЕ плагины)

Заказчик выбрал «и мои инструменты, и серверная защита». Серверная защита плагином быть не может — фиксируется как открытые вопросы инфраструктуры (вероятно префикс DO-/SEC-, привязка к Б-1), реализуется отдельно:

1. **WAF** — Yandex Cloud Smart Web Security либо Coraza/ModSecurity.
2. **Anti-brute-force / rate-limit** — Laravel throttle + серверный rate-limit/fail2ban.
3. **DDoS-защита** — Yandex Cloud DDoS Protection.
4. **Мониторинг вторжений** — Sentry #34 (pending Б-1) + серверные алерты/логи.
5. **Хранилище секретов** — Yandex Lockbox (вместо ключей в файлах).
6. **TLS / HSTS / CSP** — сертификаты и заголовки на бою (частично проверяется Nuclei #69 / Enlightn #70).
7. **Бэкапы + регламент реагирования (IR-runbook)** — реюз `operations:runbook` #51.

Эти семь — отдельный раздел спека + новые открытые вопросы; в набор плагинов A8 не входят.

## 10. Spikes / риски (ранние задачи плана)

1. **IS9-вет внешних инструментов** (Spike): провенанс ZAP MCP-кандидата + Nuclei MCP-wrapper + Enlightn (звёзды/мейнтейнер/лицензия, чтение кода) → выбор конкретного источника #68/#69.
2. **ZAP/Nuclei на native-Windows + локальный таргет** (Spike): запускаются ли движки, видят ли локальный портал; access-path в `.mcp.json`.
3. **Enlightn baseline-прогон** (Spike): подтверждает состав 60 OSS-проверок, пороги, отсутствие конфликтов с native-Windows стеком.
4. **Атомарность version-bump** (C2 STRICT) — нормативку коммитить одним набором.
5. **DAST-safety**: убедиться, что #73/обвязки по умолчанию таргетят локальную копию (IS8).

## 11. Подход к исполнению

- Изолированный `git worktree` от актуального `origin/main` (паттерн A11/C10/finance/A1; Pravila §15 параллельные сессии).
- Subagent-driven: скилы (#71–73) / ADR-014 / конфиги — Sonnet-субагенты по полным спекам; нормативка / карта / контроллер — Opus.
- Атомарные коммиты (один логический change → один коммит); финальная регрессия (Pest/Vitest) GREEN перед push.
- CLAUDE.md правится прямым Edit (worktree-эксцепшн §5 п.10).
- Каждый внешний инструмент — через IS9-вет до установки.

## 12. Открытые решения заказчика (зафиксировано)

- **Охват** — «и мои инструменты, и серверная защита» (два слоя: A8-узлы + серверные рекомендации §9). ✅ принято 21.05.2026.
- **ПДн / 152-ФЗ** — включить целиком (техника + соответствие закону), отдельный слот #71. ✅ принято 21.05.2026.
- **«Боевая» динамическая проверка (DAST)** — да, в полном объёме (включая возможность боя, с гардом IS8). ✅ принято 21.05.2026.
- **Подход** — «всё готовое» для движков #68–70; «свои» для #71–72 (152-ФЗ и угрозы готовыми полноценно не закрываются — нет РФ-/project-specific готового). ✅ принято 21.05.2026.
- **Провенанс-гейт** — каждый внешний инструмент проверяется до установки (риск ToxicSkills). ✅ заложено при любом раскладе.
