3fc5501dc5
- ZAP cross-platform 2.17.0 + MCP-аддон mcp-alpha-0.0.1 на portable Temurin JRE 17 (bin/, gitignored) - Ward v0.4.1 собран portable Go 1.26.3 (bin/ward.exe); smoke app/ → 2 находки (APP_DEBUG/APP_ENV) - setup-доки docs/security/zap-setup.md + ward-setup.md - нормативный синк: Tooling v2.21 / CLAUDE.md v2.25 / PSR_v1 v3.21 / Pravila v1.38 - ADR-014 amended (Status/Decision/Consequences) + routing-off-phase v1.5 - gates GREEN: cross-ref + l1-watcher 0 drift / markdownlint / lychee / gitleaks Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
121 lines
13 KiB
Markdown
121 lines
13 KiB
Markdown
# 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).
|