Files
brain/docs/adr/014-infosec-tooling.md
T

13 KiB
Raw Blame History

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) — чек-лист честно помечает «проверить вручную».
  • 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).