隔离运行(沙箱)
该功能目前处于实验性
arcadia run <name/path/url> --sandbox沙箱模式仍支持使用 arcadia stop 终止运行中的代码文件,但不支持守护进程 arcadia rund 模式。
什么是沙箱?
沙箱是一种将代码进程放入受限独立环境中运行的隔离机制。启用后,代码只能访问自身文件目录和必要的系统运行库,除这些路径外无法读取其它目录中的文件,也无法调试其它进程。特别适合运行来自不可信来源的代码文件。
此功能由 Sandlock 驱动,Arcadia CLI 仅作为 Sandlock 的包装器,沙箱已成为 AI Agent 运行的默认环境配置。
预设配置
启用沙箱功能后,代码进程将按以下预设配置运行,这是沙箱的基准隔离状态,可通过下方的自定义配置选项进一步调整:
- 文件系统:仅可读写代码文件所在目录与
/tmp,可读取系统运行库等只读挂载,其余目录不可访问 - 网络:默认禁止访问本机与内网地址,公网访问正常
- 端口绑定:默认禁止监听任何端口
- 环境变量:全量继承当前运行环境的所有变量,与正常运行一致
- 进程可见性:与宿主共享 PID 命名空间,
/proc中仍可见宿主进程;沙箱通过 seccomp 阻断对其它进程的调试等危险操作
自定义配置项
以下选项均需配合
--sandbox使用,用于在预设配置基础上进行自定义调整。
| 选项 | 选项值 | 描述 |
|---|---|---|
--sandbox-net-allow | ✓ | 出站白名单,仅放行匹配规则的出站连接(指定后取代默认网络预设),可多次使用,与其余出站控制选项互斥 |
--sandbox-net-deny | ✓ | 出站黑名单,在默认屏蔽本地的基础上追加屏蔽匹配规则的出站连接,可多次使用,可与 --sandbox-net-deny-local 叠加,与 --sandbox-net-allow、--sandbox-net-deny-all 互斥 |
--sandbox-net-deny-all | 完全断网,阻断所有出站网络连接,与其余出站控制及 HTTP 过滤选项互斥(端口绑定不受影响) | |
--sandbox-net-deny-local | 屏蔽局域网与本机,阻断本地回环、私网网段及云元数据地址段(169.254.0.0/16)及 IPv6 回环、ULA、链路本地地址,可与 --sandbox-net-deny 叠加,与 --sandbox-net-allow、--sandbox-net-deny-all 互斥 | |
--sandbox-net-allow-bind | ✓ | 允许绑定指定 TCP 端口,支持端口列表与区间(如 8080、8080,9000-9005),与出站控制独立,可多次使用 |
--sandbox-net-allow-bind-all | 允许绑定任意端口,放行所有 TCP 端口绑定监听,与 --sandbox-net-allow-bind 互斥 | |
--sandbox-http-allow | ✓ | HTTP 请求白名单,仅放行匹配的 HTTP/HTTPS 请求(格式:"METHOD host/path"),可多次使用,与 --sandbox-http-deny 互斥 |
--sandbox-http-deny | ✓ | HTTP 请求黑名单,屏蔽匹配的 HTTP/HTTPS 请求(格式:"METHOD host/path"),可多次使用,与 --sandbox-http-allow 互斥 |
--sandbox-max-memory | ✓ | 内存上限,限制进程最大内存用量,支持 M(兆字节)和 G(吉字节)单位(不区分大小写) |
--sandbox-clear-env | 清空环境变量,移除所有继承的环境变量(仅保留最小系统路径),可配合 --sandbox-env 补充注入 | |
--sandbox-env | ✓ | 注入环境变量,向进程追加自定义环境变量(KEY=VALUE),可多次使用 |
--sandbox-allow-env-whitelist | ✓ | 环境变量白名单,仅保留逗号分隔的指定变量(隐式启用清空),与 --sandbox-clear-env 互斥 |
--sandbox-allow-env-blacklist | ✓ | 环境变量黑名单,排除逗号分隔的指定变量(其余正常继承),与 --sandbox-clear-env、--sandbox-allow-env-whitelist 互斥 |
--sandbox-allow-read | ✓ | 允许只读访问,在预设挂载之外追加只读目录,可多次使用 |
--sandbox-allow-write | ✓ | 允许读写访问,在预设挂载之外追加读写目录,可多次使用 |
--sandbox-opts | ✓ | 透传底层参数,将原始参数直接传递给 sandlock(选项名与值写在同一字符串内),可多次使用 |
使用示例
更新沙箱引擎
Arcadia CLI 会在首次使用沙箱功能时自动下载并安装 Sandlock,但不会自动检查新版本。如若首次下载失败,可尝试使用该命令进行安装。
download_url="https://github.com/multikernel/sandlock/releases/latest/download/sandlock-$(arch)-unknown-linux-gnu.tar.gz"
query_url="https://api.github.com/repos/multikernel/sandlock/releases/latest"
target_dir="${ARCADIA_DIR}/src/shell/sandbox"
sandlock_path="${target_dir}/sandlock"
[ -x "${sandlock_path}" ] && current_version="$(${sandlock_path} --version | awk -F ' ' '{print$NF}')" || current_version=""
[[ -x "${sandlock_path}" && "$(curl -s "${query_url}" | jq -r ".tag_name" | sed 's|^v||g')" == "${current_version}" ]] &&
echo "Sandlock 已是最新版本 ${current_version}" ||
{
git -C "${target_dir}" ls-files --others --exclude-standard -z |
tr '\0' '\n' |
sed "s|^|${target_dir}/|" |
tr '\n' ' ' |
xargs -r rm -f
wget -q --show-progress -O - "${download_url}" | tar -xzf - -C "${target_dir}"
chmod a+x "${target_dir}/sandlock"
echo "Sandlock 已安装"
}若频繁使用沙箱功能,建议定期手动更新,后续可能会调整安装策略。

