# ADR-014: A8 infosec-tooling — наполнение раздела карты A8 **Status:** Accepted (amended 21.05.2026 — ZAP #68 + Ward #70 установлены портативно, статус PENDING INSTALL снят; см. Decision п.1/п.3 + Consequences) **Date:** 2026-05-21 **Контекст:** эпик A8 infosec-tooling, spec `docs/superpowers/specs/2026-05-21-a8-infosec-tooling-design.md`, plan `docs/superpowers/plans/2026-05-21-a8-infosec-tooling.md`, провенанс-вет `docs/security/infosec-vet.md`. ## Context Раздел карты A8 «Информационная безопасность» формально существовал, но дедицированных узлов не имел — в него были лишь кросс-тегированы существующие фазовые инструменты (Semgrep #25, gitleaks #8). Портал Лидерра подходит к публичному запуску в интернете; заказчик попросил подобрать 5–7 плагинов (GitHub + Anthropic), закрывающих потребности безопасности портала. Дефициты чистого A8 (технические инструменты защиты *работающего* портала — отдельно от процесса аудита D3, статики кода, БД-инструментов): динамическая «боевая» проверка (DAST) отсутствовала полностью; широкая проверка на известные уязвимости/экспозицию; Laravel-специфичная безопасность конфигурации; защита ПДн + соответствие 152-ФЗ; моделирование угроз под выход в интернет; единый go-live security-gate. D3 (audit-security) уже покрывает Anthropic-арсенал (Security Guidance хук, `/security-review`, Trail of Bits скилы). DAST-движка и Laravel-сканера у Anthropic нет → внешние GitHub-инструменты обоснованы. Для 152-ФЗ и угроз-под-наш-портал готового (знающего РФ-закон и устройство Лидерры) не существует → self-authored скилы. **Решения заказчика (зафиксированы):** охват — мои инструменты + серверный слой (двумя слоями); ПДн/152-ФЗ — целиком; «боевая» DAST — да; подход — готовые движки + свои скилы для project-specific слотов. ## Decision 1. **OWASP ZAP (#68)** — официальный ZAP «MCP Integration» add-on (`zaproxy/zap-extensions`, Apache-2.0). Глубокая DAST (spider + active scan): обход входа, инъекции, XSS. - **Постура:** on-demand, READ-only сканер, цель по умолчанию **локальная копия** (127.0.0.1), бой — только по явной команде (IS8). MCP-сервер в `.mcp.json`. - **Статус: УСТАНОВЛЕН 21.05.2026** (портативно, без choco) — ZAP cross-platform 2.17.0 с MCP-аддоном `mcp-alpha-0.0.1` на portable Temurin JRE 17 (`bin/ZAP_2.17.0/`, gitignored); daemon API verified → 2.17.0. Add-on alpha. Доку: `docs/security/zap-setup.md`. 2. **Nuclei (#69)** — `projectdiscovery/nuclei` v3.8.0 (MIT), Go-бинарь `bin/nuclei.exe`. Широкая проверка по YAML-шаблонам (известные CVE, экспозиция, TLS). - **Тип: CLI-инструмент, НЕ MCP-сервер.** Nuclei не говорит на протоколе MCP; обёртка в MCP-сервер = доп. attack surface. Интегрирован как CLI (как gitleaks #8 / squawk #15 / Trivy #26), вызывается по требованию скилом #73. Поэтому `.mcp.json`-блок и l1-watcher alias для #69 **не нужны**. - **Статус: УСТАНОВЛЕН + verified** (13 060 шаблонов; smoke: 1057 запросов к живому порталу, скан завершён). Квирки: цель `127.0.0.1` (не `localhost` — резолвер), `-rate-limit 20 -c 5` для однопоточного dev-сервера. Доку: `docs/security/nuclei-setup.md`. 3. **Ward (#70)** — `Eljakani/ward` (MIT, Go CLI). Сканер misconfig/secrets Laravel: .env (8 проверок) + config/*.php (13) + deps (OSV.dev) + код (7 категорий). - **ЗАМЕНИЛ Enlightn** (исходный план): Enlightn оказался abandoned (Packagist) + официально без поддержки Laravel 13 (PR L12 висит 3+ мес). Ward — Go-бинарь, **не зависит от версии Laravel** → проблема снята. Заказчик выбрал «подобрать замену». Обоснование — `docs/security/infosec-vet.md` §ПЕРЕСМОТР #70. Pin по commit SHA (релизов нет). - **Тип: CLI-инструмент** (как Nuclei), не MCP, не Composer dev-dep. - **Статус: УСТАНОВЛЕН 21.05.2026** (портативно, без choco) — собран из исходника через portable Go 1.26.3 (`go install github.com/eljakani/ward@v0.4.1`) → `bin/ward.exe` v0.4.1; smoke `app/` → 2 находки (High APP_DEBUG, Medium APP_ENV). Доку: `docs/security/ward-setup.md`. - Caveat: молодой (фев 2026), single-maintainer → bus-factor; митигация — версия-pin + MIT-форк. 4. **pdn-152fz-audit (#71)** — self-authored project-скил. Аудит ПДн + соответствие 152-ФЗ (2 режима: техника + закон), заземлён в `db/schema.sql`. Активен. 5. **threat-model (#72)** — self-authored project-скил. STRIDE под наш портал, going-public, заземлён в `app/routes/`. Активен. 6. **security-go-live (#73)** — self-authored project-скил, оркестратор go-live security-gate: #68–#72 + Semgrep #25 / Trivy #26 / gitleaks #8 / Trail of Bits #39 → вердикт GO/NO-GO. Активен. **Серверный слой защиты** (WAF, anti-brute-force/rate-limit, DDoS, intrusion monitoring, secrets vault, TLS/HSTS/CSP, бэкапы + IR-runbook) — **out of scope** этого эпика (не плагины); фиксируется как открытые вопросы инфраструктуры (привязка к Б-1). ## Boundaries (конфликт-аудит) - **IS1** ZAP #68 ↔ Semgrep #25: динамика (бьёт работающий портал) vs статика (читает код) — разные классы. - **IS2** Nuclei #69 ↔ ZAP #68: широта (известные дыры / экспозиция по шаблонам) vs глубина (логика приложения / активные инъекции) — комплементарны. - **IS3** Ward #70 ↔ Larastan #12 / Semgrep #25: misconfig/secrets/deps-сканер Laravel vs типы / generic-паттерны. Dep-скан Ward пересекается с Trivy #26 / Dependabot #27 — информационно, не гейт. - **IS4** pdn-152fz-audit #71 ↔ pg_anonymizer #29: аудит + направление (где ПДн, всё ли закрыто) vs инструмент маскирования. - **IS5** pdn-152fz-audit #71 ↔ D2 (право/юрист): техника + 152-ФЗ-чек-лист vs юридическое оформление документов. - **IS6** threat-model #72 ↔ Trail of Bits `audit-context-building` #39: наш портал + STRIDE + going-public vs generic deep code-audit. - **IS7** security-go-live #73 ↔ `audit-portal`: только безопасность + go-live-вердикт vs полный 14-фазный аудит; #73 *вызывает* D3, не заменяет. - **IS8** «боевая» проверка (#68/#69) на бою: гард — по умолчанию локальная/тестовая копия (127.0.0.1); бой только осознанно и аккуратно. - **IS9** провенанс-гейт: каждый внешний (ZAP/Nuclei/Ward) читается и проверяется на происхождение ДО установки (риск ≈13% ToxicSkills) — расширение процедуры `docs/audit/` attack-surface. Артефакт — `docs/security/infosec-vet.md`. ## Alternatives Considered - **Enlightn (#70 исходный)** — отклонён: abandoned (Packagist), `composer.json` без Laravel 13, мейнтейнер не отвечает 3+ мес. Заменён Ward. - **Готовые маркетплейс-скилы threat-model / compliance** (fr33d3m0n, josemlopez, sickn33, и пр.) — отклонены для #71/#72: generic-методика (GDPR/SOC2, не 152-ФЗ; не знают устройство Лидерры) + риск ToxicSkills. Берутся как референс, не установка. - **Larafence** — отклонён: не выпущен (Q2 2026) + TALL/Livewire-стек (у нас Vue). - **Psalm + plugin-laravel taint-analysis** — не для слота #70: код-SAST (taint), пересекается с Semgrep #25 (IS3); не config-сканер. - **`laravel/agent-skills`** (официальный, чистый провенанс) — не security-сканер (общий Laravel-скил); опциональное доп. позже, не замена слота. - **Платные tiers** (Enlightn Pro, Snyk, ProjectDiscovery Cloud) — только OSS (РФ-резидентность, near-zero cost). - **Дедицированный dependency/SBOM-инструмент** — не добавляем: покрыто Dependabot #27 + Trivy #26 + ToB #39 + GitHub MCP (дубль §5 п.6). ## Consequences **Positive:** - A8 непуст: 0 → 6 дедицированных узлов. **Все установлены (21.05.2026):** Nuclei #69 + Ward #70 (CLI в `bin/`) + ZAP #68 (portable JRE 17, daemon verified) + 3 скила #71/#72/#73. - Новая off-phase подкатегория `infosec-tooling` (17-я). - Провенанс-вет (IS9) каждого внешнего инструмента до установки — расширяет ADR-003-дисциплину; чужие security-скилы в чувствительные слоты (#71/#72) не тащим (ToxicSkills). - 152-ФЗ + угрозы-под-наш-портал сделаны своими скилами (РФ-/project-specific), а не generic-готовым. - DAST-движки таргетят локальную копию по умолчанию (IS8) — безопасно для боевого портала. **Negative:** - ZAP #68 (alpha MCP + Java) и Ward #70 (Go) — **установлены портативно 21.05.2026** (без choco, по выбору заказчика «оба портативно»; setup-доки `docs/security/{zap,ward}-setup.md`). Footprint ~1.2 ГБ (Go SDK + JRE + ZAP) в `bin/*` gitignored. go-live-gate #73: шаг ZAP возвращает PENDING лишь при незапущенном ZAP-демоне (MCP-режим требует живого демона). - Ward — молодой single-maintainer проект (bus-factor); митигация SHA-pin + MIT-форкабельность. - Nuclei добавляет 126 МБ бинарь в `bin/` (gitignored, машинно-локальный) + 13k шаблонов. - ПДн-скил полагается на pg_anonymizer, который сам DEFERRED (OPEN-И-24, фаза 3) — чек-лист честно помечает «проверить вручную». ## Related Decisions - **ADR-002** — tenant isolation via RLS; её правило драйвит ПДн-аудит (#71) и его технический режим. - **ADR-003** — D3 audit-security toolset; A8 — технический домен, граница: #73 *вызывает* D3-инструменты, не заменяет (IS7); провенанс-дисциплина IS9 наследует «defer непроверенного» из ADR-003. ## References - `docs/superpowers/specs/2026-05-21-a8-infosec-tooling-design.md` — design. - `docs/superpowers/plans/2026-05-21-a8-infosec-tooling.md` — plan. - `docs/security/infosec-vet.md` — IS9 провенанс-вет (вкл. §ПЕРЕСМОТР #70 Enlightn→Ward). - `docs/security/nuclei-setup.md` — установка/квирки Nuclei. - `docs/Открытые_вопросы_v8_3.md` — серверный слой (open questions).