Files
portal/docs/adr/014-infosec-tooling.md
T
Дмитрий 3fc5501dc5 docs(infosec): A8 ZAP #68 + Ward #70 установлены портативно — PENDING INSTALL снят
- 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>
2026-05-21 15:36:06 +03:00

121 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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).