验证并交付安全发布

网络安全Beginner
立即练习

介绍

有用的发布必须就是实际通过检查的版本。如果包里包含另一个镜像,或预发布环境运行着旧版本,那么报告写着“通过”也不够。

这个累积构建的 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 均已准备好。镜像构建期间的软件包构建操作,与最终应用的非 root 运行身份是两回事。

.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、真实非 root 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

辅助程序再次验证包,加载其中的镜像,并使用该准确镜像 ID 启动本地预发布服务。仅暴露本地服务端口和必需的只读签发工具注册表;私密凭据不会被写入镜像。

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

恢复后的包与真实检查过的源代码/镜像,以及已运行的预发布服务匹配。课程检查独立测试关卡失败对照,拒绝改变后的字节,检查实际镜像层中的目标凭据,并验证实际的正向/拒绝行为。

现在你拥有发布归档、校验和、生成的清单和真实报告,以及相匹配的运行版本。无需手写调查材料。生产交付还需要发布者身份、外部授权和更广安全覆盖等控制;本课程不声称本地校验和能够证明这些性质。

总结

你关联了实际检查过的源代码提交、测试过的非 root 镜像、原始生成报告、发布包字节和本地运行的预发布版本。正向和拒绝行为保持正确,而修改后的字节被拒绝。校验和支持完整性验证;该本地流程不声称提供发布者签名或外部生产授权。