38 lines
10 KiB
Markdown
38 lines
10 KiB
Markdown
# П64 · 2023-06 · Секреты и цепочка поставки — три прохода саморевью
|
||
|
||
## Рамка пакета
|
||
|
||
- Slug: `editorial-2023-06-practice-secrets-supply-chain`, `editorial-2023-06-mechanism-secrets-supply-chain`, `editorial-2023-06-field-secrets-supply-chain`.
|
||
- Голос: М6, июнь 2023 года. Системный практик идёт от наблюдаемого deploy к раздельным фактам source, builder, secret boundary, artifact digest, attestation declaration и release. Формула текста: «симптом → причина → проверка → действие»; без обещаний, будто учебная модель наблюдала CI.
|
||
- Главная граница: пакет строит только детерминированные `synthetic-*` objects в памяти. Он не читает CI, сеть, registry, secret store, файлы или журналы; не создаёт secret, certificate, signature, attestation, SBOM и deploy; не проверяет provenance, identity, claims, образ или среду.
|
||
- Sidecar содержит ровно пять новых файлов: этот review, один upgrade-скрипт и три локальных SVG. Registry, README, `articles.json`, очередь, документация, Git, чужие файлы и релизные данные не менялись.
|
||
|
||
## Проход 1 — источники, факты и границы
|
||
|
||
- Историческая граница перепроверена 31.07.2026 по первичным и официальным источникам. К июню 2023 уже были доступны: [SLSA v1.0 final, 19.04.2023](https://slsa.dev/blog/2023/04/slsa-v1-final), [версионная SLSA specification v1.0](https://slsa.dev/spec/v1.0/), [Cosign v2.0.0, 24.02.2023](https://github.com/sigstore/cosign/releases/tag/v2.0.0) и [NIST SP 800-218 SSDF v1.1 Final, 03.02.2022](https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-218.pdf). У SLSA v1.0 сейчас retired-статус, но ссылка фиксирует именно сохранённую историческую версию; в тексте не используется текущая v1.2 как материал автора 2023 года.
|
||
- Фактическая формулировка ограничена источниками: SLSA v1.0 задаёт язык уровней, provenance и рекомендуемых attestation formats; Cosign v2.0.0 существовал как официальный release; SSDF даёт общий язык безопасной разработки. Ни один источник не используется как доказательство состояния данного проекта или конкретного pipeline.
|
||
- `assembleSyntheticSupplyChain()` принимает только `synthetic: true` и явно помеченные labels. Она отклоняет отсутствие builder, не-synthetic input, другой subject digest и value-like label секрета. Valid branch намеренно оставляет `signature: not-created`, `verification: not-run`, `provenance: not-verified` и `release: manual-review-required`.
|
||
- `runSupplyChainFixture()` содержит 16 assertions о памяти: структура links, reference-only secret label, совпадение subject и digest, закрытый набор входных полей, отрицательные ветки, отсутствие создания crypto material, граница модели и предел rollback. Нет assertions о настоящем secret, certificate, signature, attestation, scanner, CI, network, registry, deploy или provenance.
|
||
- Во всех трёх статьях отдельно сказано: declaration signing или attestation не доказывает provenance и не доказывает, что deployed artifact является тем же артефактом, пока отдельная проверка не сопоставит subject, доверенную identity, условия builder, digest и deploy input.
|
||
|
||
## Проход 2 — голос, полнота и объём
|
||
|
||
- Первые два абзаца каждой статьи содержат проблему и цену: аудит видит только deploy, а секрет или неподписанный output может пройти ранние звенья без связанного evidence. Это не объявляется инцидентом, утечкой или свойством локального CI.
|
||
- Три статьи различают задачи: practice строит карту trust boundary, mechanism разделяет data/declaration/verification/provenance, field ведёт диагностику неполной цепочки и решение о stop/rollback. В каждой есть отдельная таблица, содержательная SVG с alt/caption, исполнимый fixture/code, упорядоченный маршрут, ограничения, rollback и следующий шаг.
|
||
- Внутренний revision builder считает основной текст без списка источников и удерживает диапазон 5 000–15 000 знаков. Фактический объём: practice — 9 084, mechanism — 10 055, field — 10 282 знака. Тон соответствует М6: короткие технические утверждения, отдельные статусы неизвестности и отсутствие выдуманных метрик, incident story или опыта эксплуатации.
|
||
- В учебных примерах нет реальных secrets, tokens, URLs рабочей системы, policies, CVE, CI logs или scanner data. External URLs находятся только в списке проверяемых официальных источников; фикстура использует synthetic labels и относительный путь к своему модулю.
|
||
|
||
## Проход 3 — визуалы, безопасность и выпуск
|
||
|
||
- SVG разделяют вопросы: trust-boundaries показывает шесть звеньев и их неполное доказательное значение; attestation-contract отделяет input fields от declaration и verification; release-decision показывает ручной статус для любой отсутствующей связи. На первом рендере 375 px были исправлены пересечение подписи с boundary и наложение веток дерева; повторный визуальный проход подтвердил читаемость без обрезки текста.
|
||
- В SVG нет `script`, `foreignObject`, внешних URL, `data:image`, event handlers, пользовательского ввода или интерактивности. Подписи фигур прямо отделяют схему от реальной сети, CI, certificate, registry, deploy и policy.
|
||
- До интеграции выполнены: `node --check web/scripts/upgrade-2023-06.mjs` — PASS; `node web/scripts/upgrade-2023-06.mjs --verify-fixture` — PASS 16/16 после независимого model review; `cd web && npm run audit:draft -- scripts/upgrade-2023-06.mjs` — PASS для трёх slug; отдельная import-safe проверка — PASS, 3 revisions без `date`/`author`; `xmllint --noout` для трёх SVG — PASS; SVG safety scan — clean; Sharp-review всех SVG на ширине 375 px — PASS после корректировки компоновки.
|
||
- Пакет сознательно не интегрирован: registry, README, `articles.json`, строгий аудит поверх registry, production build, staging, commit и push оставлены главному агенту для отдельного ревью и приёмки.
|
||
|
||
## Приёмка главного редактора
|
||
|
||
- Первичные источники сверены отдельно от рукописи: SLSA подтверждает выпуск v1.0 19.04.2023 и сохранённая v1.0 specification прямо описывает уровни и рекомендуемые attestation formats, включая provenance; GitHub release Cosign v2.0.0 показывает публикацию 24.02.2023; NIST CSRC фиксирует SSDF v1.1 Final от 03.02.2022. Это исторические опорные точки, не evidence данного pipeline.
|
||
- Независимый model review обнаружил, что accepted fixture игнорировал дополнительные входные поля: реальное значение могло оказаться в `secretValue`, хотя returned record его не копировал. Вход сделан plain-record и закрытым whitelist; неизвестное поле отклоняется до сборки. Одновременно rollback начал сохранять subject и declaration вместе с четырьмя остальными labels, чтобы не восстанавливать неполный контракт. Fixture проходит 16/16 и включает отрицательный case для `secretValue`.
|
||
- Все три SVG прошли XML и safety scan; просмотр на 375 px подтвердил порядок стрелок, читаемость критичных подписей и отсутствие обрезки. Строгий audit после подключения revision: 9 132 / 10 261 / 10 350 знаков, по одной фигуре, таблице и примеру. Registry содержит 187 уникальных revision; production build прошёл с 374 статическими страницами.
|
||
- `articles.json` и чужие рабочие изменения не редактировались. Следующий этап — staging и отдельный коммит только этой июньской партии.
|