私有模型仓库的访问权限配置,核心是把“谁能拉取、推送、删除模型”与“模型属于哪个项目或命名空间”绑定,而不是只靠一个仓库级密码。判断方向是:先明确你的仓库软件支持哪种权限模型(如基于角色的访问控制 RBAC、基于令牌的细粒度权限),再按团队角色和模型生命周期划分最小权限。如果仓库只提供全仓库读写令牌,那么访问控制边界实际上在反向代理或网络层,需要额外做来源限制和审计。
私有模型仓库的权限配置应先确认软件能力:支持 RBAC 的仓库(如 Harbor、GitLab Container Registry、Nexus)可按项目分配角色;仅支持基础令牌的仓库需结合反向代理做 IP 白名单和审计。关键原则是模型拉取权限与推送权限分离,删除权限单独授予,令牌定期轮换并记录操作日志。不要依赖单一共享密码,否则无法追溯谁下载了哪个模型版本。
先确认仓库软件支持哪种权限模型
不同私有仓库的权限粒度差异很大。Harbor 以项目为单位,内置项目管理员、开发者、访客等角色,角色决定能否推送、拉取、扫描镜像;GitLab Container Registry 跟随 GitLab 项目成员权限,开发者可推送,报告者只能拉取;Nexus Repository 使用特权与角色组合,可针对仓库路径配置读、写、删除权限。如果使用自建的简单文件服务(如 Nginx 静态目录),则没有内置角色,只能靠 HTTP Basic Auth 或客户端证书做粗粒度控制。
配置前先列出需要区分的动作:拉取模型文件、推送新版本、删除旧版本、修改仓库配置。多数仓库软件允许把“拉取”和“推送”拆开,但删除权限往往与推送绑定,需要单独确认。如果软件不支持拆分,可以在流程上要求删除操作走审批,而不是直接给所有人推送权限。
按角色和命名空间划分最小权限
推荐按“团队/项目”建立命名空间,每个命名空间对应一组模型。例如推理服务只需要拉取生产命名空间的模型,训练团队需要向实验命名空间推送模型,模型管理员负责跨命名空间迁移和删除。下表给出常见角色与权限的对应关系,具体角色名称以你使用的仓库软件为准。
- 推理服务账号:仅拉取指定命名空间的模型,禁止推送和删除。使用独立服务账号令牌,不与人账号混用。
- 训练/算法工程师:可向实验命名空间推送和拉取,不能删除生产命名空间的模型。
- 模型管理员:拥有生产命名空间的推送、删除和配置权限,但操作需记录审计日志。
- 审计/观察者:只读访问所有命名空间的元数据,不下载模型文件。
如果仓库支持基于令牌的细粒度权限(如 Harbor 的机器人账号、GitLab 的部署令牌),为每个服务或流水线创建独立令牌,并限定作用范围(repository 路径)和操作(pull/push)。令牌不要写入代码仓库,应通过环境变量或密钥管理服务注入。
用 API 请求骨架验证权限边界
配置完成后,用最小权限令牌实际调用仓库 API 验证:拉取应成功,推送应被拒绝,删除应被拒绝。以下是一个通用的 Docker Registry HTTP API 请求骨架,适用于兼容该 API 的仓库(如 Harbor、GitLab Registry)。实际使用时替换 <registry>、<repository> 和 <token>。
# 1. 获取令牌(如果仓库使用 token 认证)
curl -s -u "<username>:<password>" \
"https://<registry>/service/token?service=<registry>&scope=repository:<repository>:pull"
# 2. 用令牌拉取 manifest(应成功)
curl -s -H "Authorization: Bearer <token>" \
"https://<registry>/v2/<repository>/manifests/<tag>"
# 3. 用同一令牌尝试推送(应返回 401/403)
curl -s -X PUT -H "Authorization: Bearer <token>" \
-H "Content-Type: application/vnd.docker.distribution.manifest.v2+json" \
--data-binary @manifest.json \
"https://<registry>/v2/<repository>/manifests/<new-tag>"
如果仓库不使用 Docker Registry API(如直接提供模型文件的 HTTP 服务),则用 HEAD 或 GET 请求验证读权限,用 PUT 请求验证写权限。验证结果应记录在配置文档中,作为后续变更的基线。
补充网络层限制与审计
仓库软件的权限控制之外,建议在反向代理或防火墙层增加来源限制:只允许公司内网或 VPN 网段访问仓库 API,管理端口不对公网开放。对于仅支持基础认证的仓库,网络层限制几乎是唯一的额外防线。同时开启仓库的操作日志,记录拉取、推送、删除动作及其来源账号和 IP。日志保留周期根据团队审计要求设定,至少覆盖一个模型版本的生命周期。
如果使用云厂商的私有模型仓库(如对象存储加签名 URL),权限模型转为 IAM 策略和临时凭证,配置思路类似:为不同服务分配只读或读写策略,用临时凭证替代长期密钥,并开启访问日志。具体策略语法参考对应云厂商文档,不要直接复制示例中的资源 ARN。
常见问题
多个团队共用一个仓库时,如何避免误删?
把删除权限从推送权限中拆出来,只授予模型管理员角色;或者启用软删除/回收站功能(如果仓库支持),并设置保留期。推送权限按命名空间隔离,团队之间不交叉。
令牌泄露后怎么处理?
立即在仓库中撤销该令牌,检查审计日志中该令牌的最近操作,确认是否有异常拉取或推送。为受影响的服务重新签发令牌,并检查令牌是否被硬编码在代码或配置文件中,改为从密钥管理服务读取。