
Devpi 的 mirror_whitelist 仅用于缓解依赖混淆攻击,并不阻止非白名单包的下载;如需真正限制可安装包范围,必须借助第三方插件 devpi-constrained。
devpi 的 mirror_whitelist 仅用于缓解依赖混淆攻击,并不阻止非白名单包的下载;如需真正限制可安装包范围,必须借助第三方插件 devpi-constrained。
Devpi 原生的白名单机制常被误解为“访问控制开关”,但其设计目标实为安全加固而非权限隔离。当你执行如下命令创建索引:
devpi index -c dev \ mirror_whitelist=numpy \ type=stage \ mirror_whitelist_inheritance=intersection \ bases=root/pypi
Devpi 确实会将 numpy 加入白名单,并在 UI 中显示;但该配置仅影响依赖解析阶段的行为:例如当安装 scipy(依赖 numpy)时,Devpi 会确保其 requires_dist 中声明的 numpy 来自白名单源,防止恶意包伪造依赖关系指向非可信版本。它完全不限制用户直接执行 pip install tensorflow——只要 tensorflow 存在于上游镜像(如 root/pypi)中,且未被显式屏蔽,请求就会成功代理或缓存。
✅ 正确方案:使用 devpi-constrained 插件
该插件专为强制包级访问控制而设计,支持基于正则、精确匹配或黑名单/白名单策略拦截安装请求:
-
安装插件
pip install devpi-constrained devpi-server --start --serverdir /path/to/server --init
-
启用约束并配置白名单
# 登录并切换到目标索引 devpi use root/dev # 启用约束插件 devpi constrained-enable # 设置仅允许 numpy(支持 glob 或正则) devpi constrained-set --whitelist "numpy*" # 可选:拒绝所有未匹配项(默认行为) devpi constrained-set --default-deny
-
验证效果
pip install numpy # ✅ 成功(匹配 numpy*) pip install tensorflow # ❌ 403 Forbidden(未匹配白名单)
⚠️ 注意事项:
-
devpi-constrained需在服务端启用,客户端无需额外配置; - 白名单规则区分大小写,推荐使用
numpy*覆盖numpy-1.25.0等变体; - 若需支持多包,用空格分隔:
--whitelist "numpy* pytest* requests>=2.28"; - 该插件不替代
mirror_whitelist,二者可共存:前者控“能否装”,后者控“依赖从哪来”。
总结:不要依赖 mirror_whitelist 实现访问控制。真正的包级白名单必须通过 devpi-constrained 实现——它是 Devpi 生态中经过验证的、生产就绪的解决方案。










