You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建可限制工具使用权限的Python受限虚拟环境

内嵌Python编程虚拟环境的权限管控落地方案

直接在用户代码运行层做双层拦截,上层用Python自定义钩子做细粒度规则匹配,下层用系统级低权限隔离做兜底,三个管控要求的具体实现方式如下:

1. 高危预设命令拦截

核心是封死所有外部命令执行入口,搭配系统权限兜底:

  • 替换所有能拉起外部进程的Python接口:包括os.system、os.exec*系列、subprocess全系列方法、os.popen、pty.spawn,全部替换为自定义校验函数,匹配到禁止命令列表(比如文件创建类的touch/mkdir、删除类的rm、系统修改类命令)直接抛出权限错误,提示*"当前环境无执行该操作的权限,请使用合规编程语法"*。如果业务不需要用户执行任何外部命令,直接把这类接口全部拦截,不做放行。
  • 系统层兜底:运行用户代码的进程使用无特殊权限的普通账号启动,配置系统ACL禁止该账号创建新进程、写入系统目录、访问非沙箱路径,就算Python层拦截被绕过也无法执行高危操作。

2. 受限第三方库导入限制

通过自定义导入钩子+物理预装双重管控:

  • 重写内置__import__方法,同时拦截importlib.import_module这类动态导入入口,维护受限库黑名单,用户尝试导入受限库时直接抛出PermissionError,明确提示无对应库使用权限。
  • 环境初始化阶段仅预装允许用户使用的第三方库,不要把受限库安装到运行环境的依赖目录,从物理层面降低绕过风险。

3. 受限内置函数调用拦截

针对open()这类工具函数做包装替换:

  • 把需要管控的内置函数、标准库函数从对应模块中替换为自定义包装函数,以open()为例:先保存原生函数的引用,自定义函数中先校验调用参数,如果是写入、创建类打开模式直接拦截返回权限提示;如果是读模式,额外校验访问路径是否在允许的沙箱目录范围内,校验通过再调用原生函数执行。
  • 同类需要拦截的函数包括os.remove/os.mkdir/os.chmod/shutil.rmtree等所有涉及文件修改、系统配置变更的接口,全部套用相同的校验逻辑。
  • 注意封死绕过路径:禁止用户通过getattr、反射等方式拿到未被包装的原生函数引用,初始化运行环境时锁死builtins模块的敏感属性修改权限。

最小拦截逻辑示例

import builtins
import os

# 提前保存原生函数引用
_native_import = builtins.__import__
_native_open = builtins.open
_native_system = os.system

# 管控规则配置
BLOCKED_EXEC_CMDS = {"touch", "mkdir", "rm", "dd", "mkfs"}
BLOCKED_LIBS = {"shutil", "paramiko", "psutil", "subprocess"}
BLOCKED_OPEN_MODES = {"w", "a", "x", "w+", "a+", "x+", "wb", "ab", "xb"}
ALLOWED_FILE_PATH = "/opt/sandbox/readonly_workspace"

# 导入拦截
def guarded_import(name, *args, **kwargs):
    if name.split('.')[0] in BLOCKED_LIBS:
        raise PermissionError(f"当前环境无使用[{name}]库的权限,请选择允许范围内的依赖")
    return _native_import(name, *args, **kwargs)

# open函数拦截
def guarded_open(file, mode='r', *args, **kwargs):
    if mode in BLOCKED_OPEN_MODES:
        raise PermissionError("当前环境无文件创建/写入权限,仅支持只读访问沙箱目录内文件")
    if not str(file).startswith(ALLOWED_FILE_PATH):
        raise PermissionError("仅允许访问沙箱工作目录内的合规文件")
    return _native_open(file, mode, *args, **kwargs)

# 系统命令拦截
def guarded_system(cmd, *args, **kwargs):
    if not cmd:
        return
    cmd_base = cmd.strip().split()[0]
    if cmd_base in BLOCKED_EXEC_CMDS:
        raise PermissionError(f"当前环境无执行[{cmd_base}]命令的权限")
    raise PermissionError("当前环境不支持执行外部系统命令")

# 替换内置/标准库函数
builtins.__import__ = guarded_import
builtins.open = guarded_open
os.system = guarded_system

注意:Python层的钩子拦截属于第一层细粒度管控,生产环境必须搭配系统级隔离方案(比如Linux命名空间、cgroup资源限制,Windows作业对象+ACL权限配置),不要单靠Python层逻辑实现安全管控,避免被特殊写法绕过。

内容的提问来源于stack exchange,提问作者Dude_Hi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 10:57:13