venv通过目录隔离与path切换实现轻量级依赖隔离:在用户home下建私有环境,设700权限,显式绝对路径激活,禁用--user,启动时校验解释器归属。

直接复用系统 Python 或共享 venv 会导致包冲突、版本污染、甚至跨租户数据泄露——这不是配置问题,是架构缺陷。必须让每个用户拥有完全独立、不可见、不可越权访问的 Python 运行时。
用 venv + 用户级路径隔离环境
venv 是最轻量且可控的方案,但关键在路径归属和激活逻辑。不能把所有 venv 都建在项目目录下(易被同服务器其他用户遍历),也不能放在 /tmp(生命周期不可控)。
- 每个用户应在自己的 home 目录下创建专属环境:
python -m venv ~/pyenvs/tenant-abc - 确保
~/pyenvs目录权限为700(chmod 700 ~/pyenvs),禁止组和其他用户读写 - 激活脚本必须显式使用绝对路径:
source ~/pyenvs/tenant-abc/bin/activate,避免误入他人环境 - 禁止在 shell 配置文件(如
~/.bashrc)中自动激活某 venv,否则所有子 shell 都会继承同一环境
避免 pip install --user 引发的全局污染
pip install --user 会把包装进 ~/.local,看似隔离,实则危险:多个租户若共用同一系统用户(如都用 www-data),--user 安装的包会互相覆盖;即使分属不同系统用户,若进程以提权方式运行(如 systemd service 用 User= 但未限制 ProtectHome=true),仍可能穿透读取。
- 彻底禁用
--user模式:在用户 shell 初始化中设置export PIP_TARGET=""并取消~/.local/bin在$PATH中的前置位置 - 所有依赖必须走 venv 内的
pip,验证方式是执行which pip必须返回类似/home/tenant-abc/pyenvs/tenant-abc/bin/pip - CI/CD 构建阶段若用
pip install --user,需改用pip install -t /tmp/build-site-packages并在打包时只复制该目录到 venv 的site-packages
Conda 环境在多租户下的陷阱与绕过方式
Conda 默认共享 ~/.conda/pkgs 缓存,虽节省磁盘,但多个租户若用同一 Conda 安装路径(如都装在 /opt/miniconda3),conda activate 后的 CONDA_DEFAULT_ENV 和 CONDA_PREFIX 可能被误读或篡改,尤其在无特权容器中。
- 每个租户应使用独立的 Conda 安装目录,例如
/home/tenant-abc/miniconda3,通过CONDA_ROOT环境变量锁定 - 禁用共享 pkgs:初始化时加参数
--no-env-path,并手动设置pkgs_dirs到用户私有路径(~/.conda/pkgs-tenant-abc) - 避免用
conda init修改全局 shell 配置;改用显式 source:source /home/tenant-abc/miniconda3/etc/profile.d/conda.sh - 检查
conda info --base输出是否为租户私有路径,不是则说明被全局 Conda 污染
运行时强制校验 Python 解释器归属
光靠路径隔离不够,攻击者可能伪造 PYTHONPATH 或替换 sys.executable。必须在应用启动时做归属断言。
- 在主入口(如
app.py或 WSGI 脚本)开头加入校验:
import sys
import os
expected_prefix = os.path.expanduser("~/pyenvs/tenant-abc")
if not sys.executable.startswith(expected_prefix):
raise RuntimeError(f"Python interpreter mismatch: {sys.executable} not under {expected_prefix}")
- 对
subprocess.Popen调用也做同样检查,防止子进程逃逸到系统 Python - 在 systemd service 文件中用
RestrictSUIDSGID=true和ProtectHome=read-only进一步收紧权限边界
真正安全的隔离不靠“应该不会出错”,而靠“出错了立刻崩给你看”。每个租户的 Python 环境必须像物理机一样,连 sys.path 的第一个条目都只能指向自己目录,任何外部路径出现即视为入侵信号。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











