Проверьте и доставьте безопасный выпуск

КибербезопасностьBeginner
Практиковаться сейчас

Введение

Полезный выпуск должен быть той версией, которая действительно прошла проверки. Отчёта со словом «passed» недостаточно, если пакет содержит другой образ или в промежуточной среде работает более старая версия.

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

Проверьте рабочую исходную версию с накопленными мерами защиты

На этом шаге вы определите версию исходного кода и рабочую основу, которую собираетесь выпустить.

cd /home/labex/project/ticket-release
git status

Ожидается чистое рабочее дерево. git rev-parse HEAD выводит полный идентификатор текущего коммита; HEAD обозначает текущую извлечённую версию:

git rev-parse HEAD

Идентификатор отличается между сеансами. Позже он должен совпадать с манифестом выпуска и версией работающего приложения.

cat Dockerfile

Найдите явное копирование бизнес-файлов, офлайн-установку зависимостей и USER nobody. Кэшированная база Python и wheel-пакеты подготовлены. Сборка пакетов при создании образа отделена от непривилегированной учётной записи итогового приложения при выполнении.

.venv/bin/python -m pip show requests

Ожидается 2.32.4. Те же закреплённые требования будут установлены в образ кандидата.

bash /srv/ticket-release-client/sender.sh

Ожидаются HTTP 200 и исходная заявка. Этот выделенный клиент уже читает свой защищённый файл заменяющего токена; старый токен отозван. Не копируйте ни одно значение в метаданные выпуска.

Запустите реальный барьер и его негативные контрольные сценарии

На этом шаге вы установите работоспособность кандидата и контрольного барьера перед упаковкой.

bash gate.sh

Подготовленные обёртки этапов выполняют реальные проверки секретов/истории, зависимостей и исходного кода, собирают приложение из коммита в образ Docker и запускают этого реального кандидата. Функциональные тесты проверяют его версию исходного кода, Requests 2.32.4, реальный непривилегированный UID 65534, исходную заявку и отклонение старого/отсутствующего/неверного токена.

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

Теперь выполните доверенные негативные контрольные сценарии:

course-release gate-test

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

Проверки по-прежнему охватывают фиксированные учебные правила токена/SQL и два выбранных уведомления об уязвимостях зависимостей; это не полная проверка рабочей системы.

Создайте метаданные, связанные с проверенным образом

На этом шаге вы создадите свидетельства выпуска из реальных принятых результатов вместо ввода заявления об успехе.

course-release manifest

Вспомогательное средство экспортирует реальный проверенный образ Docker и создаёт три файла в release: image.tar, checks.json и manifest.json. Это инженерные входные данные доставки, а не отдельный отчёт исследования учащегося.

cat release/manifest.json

source_commit должен равняться git rev-parse HEAD. image_id определяет точный собранный образ, а не перемещаемый тег. checks_sha256 связывает реальный отчёт проверок со скрытыми чувствительными значениями; image_sha256 связывает байты экспортированного образа. run_id связывает запись с этим реальным принятым запуском проверок.

cat release/checks.json

Ожидаются статус 0, статусы отдельных проверок, версии инструментов и тот же коммит исходного кода. Значений учётных данных здесь быть не должно. Манифест создаётся автоматически; не редактируйте поля, чтобы заявить, что другой артефакт прошёл проверку.

Упакуйте и проверьте байты выпуска

На этом шаге вы создадите реальный архив и его контрольную сумму.

tar объединяет файлы в архив. -c создаёт его, -f задаёт имя выходного файла, а -C release выбирает каталог, содержимое которого будет прочитано. Заключительная . означает всё содержимое этого каталога:

tar -cf release.tar -C release .

Архив находится вне входного каталога, поэтому не включает сам себя. -t перечисляет содержимое существующего архива, имя которого задано через -f:

tar -tf release.tar

Ожидаются три созданных файла, возможно с префиксом ./, и запись каталога.

SHA-256 вычисляет хеш из байтов файла. sha256sum выводит хеш и имя файла. Знакомое перенаправление > сохраняет этот результат:

sha256sum release.tar > release.tar.sha256

-c читает сохранённую запись контрольной суммы и сравнивает реальный файл:

sha256sum -c release.tar.sha256

Ожидается release.tar: OK. Это доказывает совпадение байтов с записанным хешем. Одна контрольная сумма не доказывает, кто опубликовал файл и были ли его проверки действительными.

Проверьте связь отчёта с артефактом

На этом шаге вы проверите больше, чем собственную заявленную контрольную сумму пакета.

course-release verify release.tar

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

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

Это учебный порядок работы с защищённой локальной записью. Доступ учащегося к sudo означает, что эта VM не является границей доверия рабочей системы. Мы тестируем предоставленную процедуру выпуска, а не заявляем о реализации подписей издателя или внешнего органа доверия.

Разверните именно этот пакет и проверьте выполнение

На этом шаге вы развернёте одобренные байты и сравните живое поведение с созданной записью.

course-release deploy release.tar

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

course-release state

Состояние включает те же идентификаторы исходного кода/образа и хеш полного пакета. Теперь проверьте само приложение:

curl http://127.0.0.1:8080/health

Ожидаются тот же source_commit, Requests 2.32.4 и UID 65534.

bash /srv/ticket-release-client/sender.sh

Ожидаются HTTP 200 и исходная заявка. Проверьте доступ без аутентификации:

curl -i http://127.0.0.1:8080/tickets

Ожидается 401. Барьер кандидата также проверил старый и неверный токены. Одного совпадающего манифеста было бы недостаточно для доказательства этого реального работающего поведения.

Отклоните пакет с изменёнными байтами

На этом шаге вы проверите обеспечение целостности без изменения работающего сервиса.

cp копирует файл. Сохраните побайтовую резервную копию действительного пакета:

cp release.tar release-original.tar

printf выводит этот известный маркер. >> дописывает в файл, а > заменил бы его. Допишите несколько байтов только к пакету упражнения:

printf 'changed' >> release.tar
sha256sum -c release.tar.sha256

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

course-release deploy release.tar

Ожидается RELEASE BLOCKED, потому что именно эти байты не были одобрены. Этот ненулевой результат намеренный. Новая написанная пользователем контрольная сумма не заменила бы связь исходного кода/отчёта/образа в порядке выпуска или одобрение исходного пакета.

curl http://127.0.0.1:8080/health

Ранее одобренная версия остаётся работающей. Следующий шаг восстановит действительный пакет перед итоговой проверкой.

Восстановите и подтвердите итоговую доставку

На этом шаге вы оставите исходный проверенный пакет и работающую промежуточную среду в сохранности.

cp release-original.tar release.tar
sha256sum -c release.tar.sha256

Снова ожидается release.tar: OK.

course-release verify release.tar
course-release state

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

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

Резюме

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