ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

MLflow 供应链安全实践:用 pip 哈希校验抵御 Python 包篡改

2026/9/13 9:02:01 拓冰建站 浏览量
MLflow 供应链安全实践:用 pip 哈希校验抵御 Python 包篡改 MLflow 供应链安全实践用 pip 哈希校验抵御 Python 包篡改【免费下载链接】mlflowThe open source AI engineering platform for agents, LLMs, and ML models. MLflow enables teams of all sizes to debug, evaluate, monitor, and optimize production-quality AI applications while controlling costs and managing access to models and data.项目地址: https://gitcode.com/GitHub_Trending/ml/mlflow本指南以 examples/supply_chain_security 目录下的 MLflow Project 为核心讲解如何通过 pip 的哈希校验模式--require-hashes加固机器学习供应链防止 Python 依赖包在下载或安装环节被篡改。读完本文你将掌握从版本固定的需求清单编译出带 SHA256 哈希的锁定文件、把该锁定环境写入 MLflow 模型日志、以及完成训练—服务—推理全链路验证的完整实战方案。为什么需要反篡改ML 供应链的薄弱环节现代 ML 项目的依赖树往往深达数十上百个包直接依赖如pandas、scikit-learn、传递依赖如numpy的底层轮子以及构建期依赖。传统requirements.txt只写版本号的做法存在两个隐患版本漂移即使固定了直接依赖版本其传递依赖仍可能在重装时解析到不同版本导致我这边能跑、你那边报错。包被替换若索引源被劫持、缓存被污染或发生中间人攻击同名同版本号的恶意包可能被安装到环境中训练脚本、推理服务甚至模型本身都会受影响。本示例演示的正是第二种风险的防御手段对requirements.txt中每一个包含传递依赖同时锁定版本与 SHA256 哈希安装时逐一校验。这与仓库中 docs/docs/self-hosting/security/secure-installs.md 所倡导的Secure Installs最佳实践一脉相承pip 的哈希校验模式保证每个下载的包必须匹配已知哈希从而抵御篡改与中间人攻击任何未带哈希的条目都会导致整个安装被拒绝防止恶意包混入。示例项目结构与运行流程examples/supply_chain_security目录包含三个核心文件文件作用MLprojectMLflow Project 定义声明环境与入口命令python_env.yamlPython 虚拟环境定义当前仓库实现train.py训练脚本加载糖尿病数据集并显式记录 sklearn 模型当前仓库的 MLproject 内容如下name: supply-chain-security-example python_env: python_env.yaml entry_points: main: command: python train.py而 python_env.yaml 声明了训练环境的直接依赖python: 3.10 build_dependencies: - pip dependencies: - numpy - pandas - scipy - scikit-learn - mlflow注意本目录 README 演示的是 conda 风格的环境conda.yamlchannels: nodefaults而当前仓库中的实际实现已迁移为python_env.yamlMLflow 2.x 推荐的虚拟环境方案。两种方式表达的是同一套安全思想下文将分别说明。端到端流程pip install mlflow # 1. 训练模型结束后记下输出的 run ID mlflow run . # 2. 本地服务模型以示例 run ID 为例 mlflow models serve -m runs:/e651fcd4dab140a2bd4d3745a32370ac/model # 3. 发起推理请求 curl -X POST \ -d {\dataframe_split\: {\data\:[[0.0199132142,0.0506801187,0.1048086895,0.0700725447,-0.0359677813,-0.0266789028,-0.0249926566,-0.002592262,0.0037117382,0.0403433716]]}} \ -H Content-Type: application/json \ http://localhost:5000/invocationsmlflow run .会读取 MLproject 并按python_env.yaml创建隔离环境执行python train.py训练结束时控制台会打印类似MLflow run ID: e651fcd4dab140a2bd4d3745a32370ac的信息train.py 通过run.info.run_id显式输出。随后mlflow models serve以 MLflow 模型的 pyfunc 标准接口在http://localhost:5000/invocations提供 HTTP 服务上面的请求应返回[235.11371081266924]验证训练与服务环节使用的模型行为一致。在 MLflow Project 中启用哈希校验模式README 给出的 MLflow Project 环境定义是本次安全加固的核心name: mlflow-supply-chain-security channels: - nodefaults dependencies: - python3.9 - pip - pip: - --require-hashes - -r requirements.txt关键有三点channels: nodefaults关闭 conda 默认 channel只从显式指定的源获取包缩小信任面--require-hashes这是 pip 的哈希校验模式开关要求所有安装的包都必须有对应的哈希条目-r requirements.txt引入经过编译的锁定文件其中每个包都同时固定版本与哈希。由 pip-compile 生成的requirements.txt形如mlflow1.20.2 \ --hashsha256:963c22532e82a93450674ab97d62f9e528ed0906b580fadb7c003e696197557c \ --hashsha256:b15ff0c7e5e64f864a0b40c99b9a582227315eca2065d9f831db9aeb8f24637b numpy1.21.4 \ --hashsha256:0b78ecfa070460104934e2caf51694ccd00f37d5e5dbe76f021b1b0b0d221823 \ ...注意两个细节每个包都使用精确固定版本且mlflow带有两个不同的sha256哈希pip 会同时校验并接受任一匹配多哈希通常对应同一包的不同构建产物numpy的续行哈希会被 pip 校验确保轮子内容与官方发布完全一致。在仓库的 docs/docs/self-hosting/security/secure-installs.md 中还可以看到进一步的加固建议配合--only-binary :all:禁止源码分发避免setup.py或 PEP 517 构建后端在安装时执行任意代码以及使用 pip 的--uploaded-prior-to或 uv 的--exclude-newer按上传时间过滤依赖抵御新发布即投毒的供应链攻击。训练脚本显式记录模型并锁定运行环境训练逻辑位于 train.py其设计目标是显式控制模型的环境与依赖因此先关闭 autolog 的模型记录import sklearn import mlflow # Use explicit model logging to control the conda environment and pip requirements mlflow.sklearn.autolog(log_modelsFalse)随后加载 scikit-learn 内置的糖尿病数据集切分训练集并训练 Ridge 回归模型X, y sklearn.datasets.load_diabetes(return_X_yTrue) X_train, X_test, y_train, y_test sklearn.model_selection.train_test_split( X, y, test_size0.2, random_state0 ) with mlflow.start_run() as run: print(fMLflow run ID: {run.info.run_id}) model sklearn.linear_model.Ridge(alpha0.03) model.fit(X_train, y_train) mlflow.sklearn.log_model( model, namemodel, signaturemlflow.models.infer_signature(X_train[:10], y_train[:10]), input_exampleX_train[:10], )README 中演示的完整记录方式还显式传入了conda_envconda.yaml即日志模型时引用同一个安全加固过的环境从而保证训练环境与推理环境严格一致mlflow.sklearn.log_model( model, namemodel, signaturemlflow.models.infer_signature(X_train[:10], y_train[:10]), input_exampleX_train[:10], conda_envconda.yaml, )三个参数各有用途signature通过 mlflow.models.signature 模块的infer_signature从训练数据子集推断输入输出的列名与类型支持pandas.DataFrame、numpy.ndarray、dict等多种输入格式见 signature.py。签名被序列化进MLmodel文件供服务端校验请求载荷input_example记录一份可复现的样例输入方便在 UI 或 SDK 中快速验证模型行为conda_env/python_env把带哈希锁定的环境打包进模型制品。MLflow 在mlflow models serve时按该环境重建运行时从而把供应链安全策略延伸到离线、跨机部署场景——这是本示例把安全从训练机推广到任意推理机的关键一步。用 pip-tools 编译带哈希的锁定文件手工为每个包尤其是数量庞大的传递依赖查找哈希不现实正确做法是使用pip-tools自动解析pip install pip-tools pip-compile --generate-hashes --output-filerequirements.txt requirements.inrequirements.in只维护直接依赖与版本约束本示例为pandas1.3.2 scikit-learn0.24.2 mlflow1.20.2pip-compile --generate-hashes会完成三件事解析完整依赖树计算出所有直接与传递依赖的最终版本固定版本每个包都以精确固定生成哈希从 PyPI 获取每个轮子的 SHA256 并写入--hashsha256:...条目。生成的requirements.txt既用于本地pip install --require-hashes -r requirements.txt也嵌入到 MLflow Project 的环境定义中docs/docs/self-hosting/security/secure-installs.md 给出了同款命令。此后每次依赖升级都应重新执行pip-compile并审查 diff 后再提交保持供应链变更可审计。安全策略的完整闭环综合以上步骤本示例实际上建立了一条从开发到部署的完整安全链路开发期requirements.in维护直接依赖 →pip-compile --generate-hashes生成全量锁定文件训练期mlflow run .依据 Project 环境定义--require-hashes 哈希锁定文件创建环境任何被篡改的包都无法安装记录期log_model将同一环境快照随模型一同持久化conda_env/python_env服务期mlflow models serve在重建的环境中以 pyfunc 接口提供推理/invocations的 JSON 载荷经签名校验后返回预测结果[235.11371081266924]。这种环境即制品、制品带锁的模式把供应链安全从 CI 延伸到了生产环境的每一次模型部署为 MLflow 体系下的生产级 AI 应用提供了一道可落地、可审计的防护基线。需要更深入了解部署侧安全配置时可继续阅读仓库中的 docs/docs/self-hosting/security/secure-installs.md其中覆盖了--only-binary :all:、按上传时间过滤等进阶选项。【免费下载链接】mlflowThe open source AI engineering platform for agents, LLMs, and ML models. MLflow enables teams of all sizes to debug, evaluate, monitor, and optimize production-quality AI applications while controlling costs and managing access to models and data.项目地址: https://gitcode.com/GitHub_Trending/ml/mlflow创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考