Перейти к содержанию

Происхождение сборки и проверка пакета

Целостность, подпись и происхождение сборки часто называют одним словом «проверка». Они отвечают на разные вопросы. В этом уроке свяжем байты, источник и процесс в авторской карточке, сохраняя предел каждого основания.

evidence-contract.fixture.json в «Контуре выпуска» не является настоящей аттестацией. В нём нет выдуманных сертификатов, Sigstore-записей или контрольных сумм реестра. Все криптографические операции и команды npm остаются невыполненными.

Разные основания одного решения

Integrity позволяет сопоставить полученные байты с ожидаемым отпечатком. Подпись связывает заявление с определённым ключом или идентичностью при выбранной схеме. Provenance описывает происхождение артефакта и связь с процессом сборки. Содержательное ревью оценивает, что делает код. Успешный результат одной проверки не создаёт автоматически успешный результат остальных.

В нашем fixture есть четыре карточки с question, expected_evidence и status. Для integrity ожидается фактический архив и его проверяемое значение. Для provenance — настоящее свидетельство выбранной публикации и условия его проверки. Для ревью — просмотр соответствующего исходника и результата. Пока все значения pending/not_run, и это не исправляется подробным описанием формата.

Возьмём сценарий: архив точно совпал с integrity, но в нём добавлен нежелательный postinstall. Проверка байтов сработала правильно: она подтверждает соответствие ожидаемому архиву. Проблема находится в доверии к содержанию и разрешении выполнения. Нельзя обвинять механизм хеша в том, что он не оценил поведение; это другой вопрос нашей карты.

Другой сценарий: provenance корректно связывает пакет с разрешённым workflow. Если исходная ревизия содержит вредоносное изменение, происхождение может быть подлинным. Это помогает расследованию, но не делает изменение приемлемым. Карточка должна сохранять связь с содержательным решением, а не давать общий зелёный статус «всё безопасно».

Документация npm описывает условия генерации provenance. Они зависят от способа публикации, провайдера и доступности репозитория. Нельзя выводить наличие аттестации только из названия trusted publishing. В нашей карточке условие источника описано, а результат отсутствует. Для реальной операции потребуется проверить соответствующий артефакт и актуальный способ верификации.

Предмет проверки и версия политики

У каждого основания есть subject: что именно проверяется. Наблюдение исходной ветки не равно проверке архива, который отправлен в реестр. Хеш локального README не равен integrity зависимости. Версия политики allowScripts не доказывает, какой процесс её фактически применил. Сохраняем идентификатор предмета рядом со статусом.

В release-record.fixture.json поля source_revision и artifact_digest неизвестны. Это намеренное ограничение: сборки не было, поэтому нет реальных байтов результата. Мы можем описать ожидаемую структуру записи и критерий заполнения. Но вымышленные значения не должны выглядеть как прошедшая криптографическая проверка.

Для будущего выполнения полезно сохранять и инструмент, и версию, и доверенную политику проверки. Одно сообщение verified без контекста мало помогает через месяц. Нужно знать, какую цепочку доверия принимали и какие условия проверяли. Наш учебный JSON задаёт места этих сведений, не реализуя собственный упрощённый криптографический валидатор.

Ожидаемый результат — четыре разных основания и договор записи выпуска. Они помогают объяснить отказ: например, источник подлинный, но содержательное ревью не завершено. Последний урок применит такую дисциплину к подозрительному обновлению и восстановлению без уничтожения доказательств.

Не копируйте из официального примера длинную подпись и не приписывайте её своей сборке. Значения относятся к конкретному предмету и процессу, а не служат универсальным украшением JSON. В лаборатории для отсутствующих криптографических сведений используется null и объяснение. Это яснее, чем правдоподобная последовательность символов, которая ничего не подтверждает.

Карточку можно читать как набор независимых вопросов при принятии обновления. Сначала установить предмет, затем его байты и источник, потом поведение и разрешённые стадии. Порядок может зависеть от проекта, но смысловые границы сохраняются. Такой подход позволяет использовать современные механизмы происхождения без ложного обещания, что один значок реестра заменяет весь процесс сопровождения зависимостей.

Основание Вопрос, который оно решает
Integrity Совпадают ли полученные байты с ожидаемым значением, не оценивая полезность кода внутри архива.
Подпись Какое заявление связано с выбранной идентичностью или ключом при определённой проверяемой схеме доверия.
Provenance Какой источник и процесс связаны с артефактом, если настоящее свидетельство получено и проверено.
Ревью Что делает соответствующее содержание и допустимы ли его действия в конкретных стадиях проекта.

Сопоставление основания и предмета

В evidence-contract у каждого вопроса есть subject. Попробуйте заменить предмет integrity с архива пакета на локальный исходник. Механизм сравнения байтов может оставаться корректным, но вывод теперь относится к другому объекту. Именно такая незаметная подмена часто скрывается за словом verified. Карточка должна сохранять точный предмет и статус.

Для provenance предмет также важен: один опубликованный пакет и другая пересборка той же ветки не обязательно имеют одинаковые байты. Источник может совпасть, а окружение либо внешние данные отличиться. Свидетельство происхождения помогает понять связь, но не даёт права считать все будущие результаты тождественными. Поэтому артефакт получает собственный идентификатор.

Если настоящее свидетельство не получено, null — правильное значение. Авторская подпись fixture не подтверждает реестр. В тексте объясняется, какое основание могло бы появиться, но не изображается его успешная проверка. Это особенно важно при создании большого количества уроков: правдоподобный пример должен оставаться явно учебным, когда он описывает криптографический результат.

Отдельно сохраняйте содержательное решение. Например, байты и происхождение подтверждены, но скрипт требует ненужной сети. Отказ такого пакета не противоречит успешной криптографической проверке: вопросы разные. Наоборот, понятное различие позволяет пользоваться инструментами по назначению без ожидания, что они оценят продуктовую необходимость и поведение каждого компонента.

Для будущего реального выполнения нужен проверенный инструмент и актуальные правила доверия. Наш проект не пишет собственный криптографический валидатор и не заявляет соответствие стандарту аттестации. Он даёт договор свидетельств и историю решения, которые можно дополнить фактическими данными после отдельно разрешённой практики.

При отказе сохраняйте конкретное незавершённое основание. Это позволит следующему разработчику продолжить работу с нужного вопроса, вместо повторения всех обсуждений. Подлинность процесса и пригодность результата остаются разными строками даже после завершения части проверки.

Полный основной артефакт evidence-contract.fixture.json выбранного состояния:

{
  "fictional": true,
  "not_attestation": true,
  "checks": [
    {
      "question": "integrity",
      "subject": "actual archive not obtained",
      "expected_evidence": "real archive and trusted expected value",
      "status": "not_run"
    },
    {
      "question": "signature",
      "subject": "real statement not obtained",
      "expected_evidence": "actual signature and policy",
      "status": "not_run"
    },
    {
      "question": "provenance",
      "subject": "published package not produced",
      "expected_evidence": "actual attestation and verified conditions",
      "status": "not_run"
    },
    {
      "question": "content_review",
      "subject": "real package code unavailable",
      "expected_evidence": "review of corresponding code",
      "status": "pending"
    }
  ]
}

Все исходники серии: папка lesson-09 содержит полный самостоятельный снимок, собственный проект и авторские модели. Исполнение примеров, npm, установки, аудит, тесты, CI, настройки и публикация не выполнялись.

Первичные источники: provenance, oidc.