在Linux上创建一个沙箱隔离的Python环境有多种方法,我推荐以下几种方案,从简单到复杂:
方案1:使用Firejail(最简单推荐)
Firejail是一个轻量级的沙箱工具,使用命名空间和seccomp-bpf进行隔离。
安装Firejail
# Ubuntu/Debian sudo apt install firejail # CentOS/RHEL/Fedora sudo yum install firejail # 或 sudo dnf install firejail
创建沙箱目录并运行Python
# 创建隔离目录 mkdir ~/python_sandbox # 运行Python,只允许访问指定目录 firejail --private=~/python_sandbox --allow-debuggers python3 # 或者更严格的限制(禁止网络、只读系统库) firejail --private=~/python_sandbox \ --read-only=/usr \ --read-only=/lib \ --read-only=/lib64 \ --read-only=/etc \ --net=none \ python3
创建配置文件(可选)
创建 ~/.config/firejail/python-sandbox.profile:
# Python沙箱配置 include /etc/firejail/default.profile include /etc/firejail/disable-interpreters.inc include /etc/firejail/disable-programs.inc # 只允许访问沙箱目录和必要的系统目录 private ~/python_sandbox read-only /usr read-only /lib read-only /lib64 read-only /etc net none # 允许Python库访问 whitelist /usr/lib/python3.* whitelist /usr/local/lib/python3.*
使用配置文件运行:
firejail --profile=python-sandbox.profile python3
方案2:使用Docker容器
创建Dockerfile
FROM python:3.9-slim # 创建工作目录 WORKDIR /sandbox # 复制需要的Python包(可选) # COPY requirements.txt . # RUN pip install -r requirements.txt # 设置权限 RUN chown -R nobody:nogroup /sandbox USER nobody # 默认命令 CMD ["python3"]
构建和运行
# 构建镜像 docker build -t python-sandbox . # 运行容器,挂载本地目录 docker run -it --rm \ --name python-sandbox \ --user $(id -u):$(id -g) \ --network none \ -v $(pwd)/sandbox:/sandbox \ python-sandbox
方案3:使用systemd-nspawn(轻量级容器)
创建根目录
# 创建基础目录结构 mkdir -p ~/python_root/{bin,lib,lib64,usr,etc,tmp} mkdir -p ~/python_root/sandbox # 复制必要的库和二进制文件 cp /bin/bash ~/python_root/bin/ cp /usr/bin/python3 ~/python_root/bin/ cp -r /usr/lib/python3.* ~/python_root/usr/lib/ # 创建符号链接 ln -s /bin/bash ~/python_root/bin/sh
运行容器
sudo systemd-nspawn \ --directory=~/python_root \ --private-users \ --network-veth \ --machine=python-sandbox \ --chdir=/sandbox \ bash
方案4:使用chroot + bind mount(传统方法)
设置chroot环境
# 创建chroot目录 sudo mkdir -p /var/chroot/python/{bin,lib,lib64,usr,etc,tmp} # 复制基本文件 sudo cp /bin/bash /var/chroot/python/bin/ sudo cp /usr/bin/python3 /var/chroot/python/bin/ # 复制必要的库(使用ldd查看依赖) ldd /usr/bin/python3 | grep "=> /" | awk '{print $3}' | xargs -I '{}' sudo cp --parents '{}' /var/chroot/python/ # 创建沙箱目录 sudo mkdir /var/chroot/python/sandbox sudo chown $USER:$USER /var/chroot/python/sandbox
运行chroot
# 挂载必要的文件系统 sudo mount -o bind /proc /var/chroot/python/proc sudo mount -o bind /dev /var/chroot/python/dev # 进入chroot sudo chroot /var/chroot/python /bin/bash # 在chroot内切换到普通用户 su - $USER cd /sandbox python3
方案5:使用Python虚拟环境 + AppArmor/SELinux(高级)
创建虚拟环境
python3 -m venv ~/python_venv source ~/python_venv/bin/activate
配合AppArmor限制文件访问
创建AppArmor配置文件 /etc/apparmor.d/python-sandbox:
#include <tunables/global> /usr/bin/python3 { #include <abstractions/base> #include <abstractions/python> # 只允许访问沙箱目录和虚拟环境 /home/*/python_sandbox/** rw, /home/*/python_venv/** r, /usr/lib/python3.*/** r, # 禁止其他写入 deny /home/*/** w, deny /tmp/** w, deny /var/** w, # 网络限制(可选) # network inet stream, }
启用配置:
sudo apparmor_parser -r /etc/apparmor.d/python-sandbox
推荐方案
对于大多数用户,我推荐 Firejail方案,因为:
简单易用:一条命令即可创建沙箱
安全性好:使用Linux命名空间和seccomp
灵活性强:可以精细控制权限
无需root权限:普通用户即可使用大部分功能
完整示例
# 1. 安装firejail sudo apt install firejail # 2. 创建沙箱目录 mkdir ~/my_python_sandbox # 3. 创建测试脚本 cat > ~/my_python_sandbox/test.py << 'EOF' import os print("当前目录:", os.getcwd()) print("目录内容:", os.listdir('.')) # 尝试访问外部目录(应该失败) try: print("尝试访问/home:", os.listdir('/home')) except Exception as e: print("访问/home失败:", e) # 在沙箱内创建文件 with open('test_file.txt', 'w') as f: f.write('Hello from sandbox!') EOF # 4. 在沙箱中运行Python firejail --private=~/my_python_sandbox \ --read-only=/usr \ --read-only=/lib \ --read-only=/lib64 \ --net=none \ python3 test.py
这样Python只能访问 ~/my_python_sandbox 目录,无法访问其他用户文件,同时可以正常读取系统Python库。
网友回复
在哪可以免费白嫖claude 4.5?
如何编写一个chrome插件实现多线程高速下载大文件?
cdn版本的vue在网页中出现typeerror错误无法找到错误代码位置怎么办?
pywebview能否使用webrtc远程控制共享桌面和摄像头?
pywebview6.0如何让窗体接受拖拽文件获取真实的文件路径?
如何在linux系统中同时能安装运行apk的安卓应用?
python有没有离线验证码识别ocr库?
各家的ai图生视频及文生视频的api价格谁最便宜?
openai、gemini、qwen3-vl、Doubao-Seed-1.6在ui截图视觉定位这款哪家更强更准?
如何在linux上创建一个沙箱隔离的目录让python使用?