Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
13 KiB
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
- 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.
- Постура: on-demand, READ-only сканер, цель по умолчанию локальная копия
(127.0.0.1), бой — только по явной команде (IS8). MCP-сервер в
- Nuclei (#69) —
projectdiscovery/nucleiv3.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.
- Тип: CLI-инструмент, НЕ MCP-сервер. Nuclei не говорит на протоколе MCP;
обёртка в MCP-сервер = доп. attack surface. Интегрирован как CLI (как gitleaks #8 /
squawk #15 / Trivy #26), вызывается по требованию скилом #73. Поэтому
- 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.exev0.4.1; smokeapp/→ 2 находки (High APP_DEBUG, Medium APP_ENV). Доку:docs/security/ward-setup.md. - Caveat: молодой (фев 2026), single-maintainer → bus-factor; митигация — версия-pin + MIT-форк.
- ЗАМЕНИЛ Enlightn (исходный план): Enlightn оказался abandoned (Packagist) +
официально без поддержки Laravel 13 (PR L12 висит 3+ мес). Ward — Go-бинарь, не
зависит от версии Laravel → проблема снята. Заказчик выбрал «подобрать замену».
Обоснование —
- pdn-152fz-audit (#71) — self-authored project-скил. Аудит ПДн + соответствие 152-ФЗ
(2 режима: техника + закон), заземлён в
db/schema.sql. Активен. - threat-model (#72) — self-authored project-скил. STRIDE под наш портал, going-public,
заземлён в
app/routes/. Активен. - 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).