Введение
Waymark публикует путеводитель по прогулкам фестиваля. Поставщик доставил несколько пакетов обновления. Ваша задача — принять выпуск, запрошенный организатором, не доверяя пакету лишь потому, что его контрольная сумма совпадает.
Вы воспользуетесь независимо предоставленным открытым ключом издателя, проверите настоящую подпись с помощью Cosign, сравните запрошенные продукт и версию и проверите хеш архива. Нужны базовые навыки работы с терминалом и путями; программирование и облачная учётная запись не требуются. В этом занятии вы выберете обновление. В следующем занятии с инструкциями вы превратите эти решения в многократно используемый скрипт приёма.
Изучите путеводитель фестиваля и запрос на обновление
На этом шаге вы посмотрите работающий сервис и найдёте запрос организатора, прежде чем выбирать обновление. Откройте вкладку Event Guide. Текущая редакция event-guide — 2.0. Откройте Old Mill Walk: встреча назначена на 11:00. Вернитесь по ссылке All walks на странице и скачайте маршрутный лист. Сайт и CSV описывают одни и те же две прогулки.
На главной странице путеводителя редакция указана над заголовком, а время встречи для каждой прогулки — на её карточке:

Теперь переключитесь на Workspace. Этот терминал находится в том же контейнере, что и путеводитель; вкладки — разные точки входа, а не разные машины. cd меняет текущий каталог терминала. Абсолютный путь работает из любого каталога:
cd /home/labex/project/waymark
cat выводит небольшой текстовый файл. Прочитайте запрос, который организатор предоставил независимо от пакетов поставки:
cat /opt/labex-waymark/trust/request.json
Этот объект JSON содержит два именованных поля:
{
"product": "event-guide",
"version": "2.1"
}
Продукт определяет, какой путеводитель обновляется; версия — требуемую редакцию. Подлинная более ранняя редакция не является этим обновлением. Независимо закреплённый открытый ключ находится в /opt/labex-waymark/trust/publisher.pub. Не изменяйте этот ключ и запрос.
ls перечисляет содержимое каталога. Изучите каталог поставок:
ls candidates
Пакеты имеют метки доставки, например parcel-101; их имена не подтверждают одобрение. Каждый содержит manifest.json, manifest.sigstore.json, guide.tar.gz и SHA256SUMS. Манифест описывает продукт, версию и хеш архива. Bundle содержит подпись. В архиве находятся сами файлы путеводителя. Сохраните исходные пакеты, текущий путеводитель, предыдущие выпуски и уведомление для посетителей. Копию выбранного пакета вы поместите в accepted/.
Если команда сообщает No such file or directory, выполните приведённую выше команду cd с абсолютным путём, проверьте написание через ls candidates и повторите команду. Для этого занятия сброс среды не требуется.
Узнайте, что означает совпадение контрольной суммы
На этом шаге вы сравните два пакета, каждый из которых успешно проходит проверку соседней контрольной суммы. Оставайтесь в Workspace.
Хеш SHA-256 — это отпечаток, вычисляемый по байтам файла. Совпадение отпечатков помогает обнаружить изменения байтов, если самому ожидаемому отпечатку можно доверять. sha256sum -c читает список контрольных сумм и сравнивает с ним указанные файлы. Здесь -c означает «проверить». Запускайте команду внутри пакета, поскольку в списке используется относительное имя файла:
cd candidates/parcel-103
sha256sum -c SHA256SUMS
Ожидайте guide.tar.gz: OK. Вернитесь в проект и попробуйте другой пакет:
cd /home/labex/project/waymark/candidates/parcel-104
sha256sum -c SHA256SUMS
Снова ожидайте guide.tar.gz: OK. Оба списка прибыли в одной поставке со своими архивами. Тот, кто заменил архив, мог также вычислить новую соседнюю контрольную сумму. OK устанавливает соответствие этих двух файлов; оно не определяет издателя и не доказывает, что это запрошенное обновление.
Вернитесь в проект:
cd /home/labex/project/waymark
Далее вы проверите манифест с помощью открытого ключа, которому организатор уже доверяет. Тогда ожидаемый хеш архива будет получен из проверенного манифеста, а не из неподписанного соседнего списка.
Проверьте издателя с помощью независимого открытого ключа
На этом шаге вы отличите подлинную подпись от подписи, созданной неодобренным ключом. Начните в Workspace, в /home/labex/project/waymark.
Издатель подписывает файл закрытым ключом. Соответствующий открытый ключ позволяет получателю проверить подпись и обнаружить изменения подписанного файла. Открытый ключ должен поступать по каналу, которому вы уже доверяете. Пакет не может одобрить собственный ключ. В этом упражнении закреплён ключ вымышленного издателя, предоставленный отдельно в /opt/labex-waymark/trust/; закрытый ключ издателя вам не предоставляется.
Cosign — подготовленный инструмент проверки подписей. verify-blob проверяет файл; --key выбирает доверенный открытый ключ; --bundle выбирает bundle подписи. Последний аргумент указывает конкретный манифест, байты которого подписаны.
Эти учебные пакеты подписаны без публичного журнала прозрачности. --insecure-ignore-tlog намеренно пропускает проверку включения в журнал. Действительная подпись выбранного ключа по-прежнему обязательна. Это локальное упражнение не проверяет публичную идентичность OIDC, сервис сертификатов или журнал прозрачности; не переносите это исключение в политику, требующую такие сервисы.
Следующий пакет подписан другим ключом. Эта проверка должна завершиться неудачей с ненулевым кодом выхода и ошибкой проверки подписи:
/opt/labex-waymark/bin/cosign verify-blob --key /opt/labex-waymark/trust/publisher.pub --bundle candidates/parcel-102/manifest.sigstore.json --insecure-ignore-tlog candidates/parcel-102/manifest.json
echo выводит значение; $? — код выхода непосредственно предыдущей команды. Ноль означает успех, ненулевое число — ошибку. Проверьте его сразу:
echo $?
Теперь проверьте пакет, подписанный закреплённым издателем:
/opt/labex-waymark/bin/cosign verify-blob --key /opt/labex-waymark/trust/publisher.pub --bundle candidates/parcel-104/manifest.sigstore.json --insecure-ignore-tlog candidates/parcel-104/manifest.json
Ожидайте предупреждение о журнале прозрачности и Verified OK:
WARNING: Skipping tlog verification is an insecure practice that lacks transparency and auditability verification for the blob.
Verified OK
Проверьте код непосредственно предыдущей команды:
echo $?
Ожидайте 0. Манифест подписан доверенным ключом. Это одно решение; ещё предстоит проверить, что именно разрешает манифест.
Проверьте подписанные продукт, версию и хеш архива
На этом шаге вы используете проверенный манифест, чтобы решить, является ли подлинный пакет запрошенным выпуском. Оставайтесь в Workspace.
Сначала проверьте более ранний подлинный выпуск. Эта команда должна завершиться успешно:
/opt/labex-waymark/bin/cosign verify-blob --key /opt/labex-waymark/trust/publisher.pub --bundle candidates/parcel-101/manifest.sigstore.json --insecure-ignore-tlog candidates/parcel-101/manifest.json
jq читает JSON. Фильтр .product, .version выводит два именованных поля. Одинарные кавычки сохраняют фильтр как один аргумент, не позволяя оболочке интерпретировать знаки пунктуации:
jq '.product, .version' candidates/parcel-101/manifest.json
Ожидайте "event-guide" и "2.0". Это подлинный путеводитель, но не запрошенная версия 2.1. Подпись сама по себе не делает старый выпуск подходящим.
Изучите проверенный пакет из предыдущего шага:
cat candidates/parcel-104/manifest.json
Его продукт и версия совпадают с независимым запросом. Поле sha256 содержит 64-символьный шестнадцатеричный хеш guide.tar.gz; запоминать его не нужно. jq -r выводит поле без кавычек JSON. Выведите ожидаемый хеш:
jq -r .sha256 candidates/parcel-104/manifest.json
Теперь вычислите хеш фактического архива:
sha256sum candidates/parcel-104/guide.tar.gz
Первое поле должно совпадать с хешем из проверенного манифеста. Имя файла после него не является частью хеша.
У изменённого архива, изученного ранее, тоже есть подлинный подписанный манифест, но текущие байты архива уже не соответствуют ему. Подтвердите это: проверьте манифест, затем сравните два хеша:
/opt/labex-waymark/bin/cosign verify-blob --key /opt/labex-waymark/trust/publisher.pub --bundle candidates/parcel-103/manifest.sigstore.json --insecure-ignore-tlog candidates/parcel-103/manifest.json
jq -r .sha256 candidates/parcel-103/manifest.json
sha256sum candidates/parcel-103/guide.tar.gz
Подпись проходит проверку, но хеши различаются. Отклоните этот пакет. Теперь у вас три отдельных решения: доверенный подписант, запрошенные продукт и версия и совпадение байтов архива. Неудача любой из этих проверок означает, что обновление пока нельзя принять.
Примите запрошенный пакет, не меняя работающий путеводитель
На этом шаге вы сохраните проверенный запрошенный пакет для передачи. Начните в Workspace, в /home/labex/project/waymark.
Каталог accepted/ уже существует. cp копирует файлы; последний аргумент — каталог назначения. Скопируйте проверенные манифест, bundle подписи и архив:
cp candidates/parcel-104/manifest.json candidates/parcel-104/manifest.sigstore.json candidates/parcel-104/guide.tar.gz accepted/
Копирование создаёт отдельный набор файлов. Проверьте именно его, не предполагая, что предыдущая проверка распространяется на последующую копию:
/opt/labex-waymark/bin/cosign verify-blob --key /opt/labex-waymark/trust/publisher.pub --bundle accepted/manifest.sigstore.json --insecure-ignore-tlog accepted/manifest.json
jq '.product, .version' accepted/manifest.json
jq -r .sha256 accepted/manifest.json
sha256sum accepted/guide.tar.gz
Ожидайте действительную подпись, event-guide, 2.1 и совпадающие хеши архивов. Подготовленная самопроверка только читает эти реальные файлы, независимые ключ и запрос и ожидаемое содержимое путеводителя:
python3 /opt/labex-waymark/verify.py selected
Ожидайте:
The accepted parcel is the independently signed, requested release with matching archive bytes.
При неудаче выясните, какая из трёх проверок не прошла, затем повторите копирование правильного исходного пакета и снова проверьте копию. Не меняйте независимые файлы доверия. Проверка не выбирает пакет за вас и не развёртывает его.
Переключитесь на Event Guide и обновите страницу. Она по-прежнему должна показывать редакцию 2.0, а встреча Old Mill Walk должна оставаться в 11:00. Откройте Visitor notice и убедитесь, что исходные практические рекомендации сохранились. В этом занятии вы принимаете поставку для передачи; публикация обновления — отдельная операция, которую вы изучите далее.
Резюме
Вы приняли действительно подписанную поставку, объединив независимо доверенный ключ издателя, запрос организатора с продуктом и версией и хеш фактического архива. Вы также увидели, почему одной соседней контрольной суммы, действительной подписи старого выпуска или подписанного манифеста рядом с изменёнными байтами недостаточно.
Текущий путеводитель остаётся доступным. В следующем занятии с инструкциями вы включите эти решения в многократно используемый скрипт приёма и обеспечите передачу работающему путеводителю только проверенных байтов архива.



