+
15
-

回答

在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库。

网友回复

我知道答案,我要回答