安全最佳实践
Open Terminal 赋予 AI 真实的命令执行和文件管理能力,因此部署方式必须慎重。
优先使用 Docker
除非你明确需要让 AI 直接操作宿主机,否则始终优先使用 Docker。这样 Open Terminal 会被隔离在自己的容器内,只能访问你明确暴露出来的内容。
docker run -d --name open-terminal -p 8000:8000 \
--memory 2g --cpus 2 \
-v open-terminal:/home/user \
-e OPEN_TERMINAL_API_KEY=your-secret-key \
ghcr.io/open-webui/open-terminal--memory 2g 和 --cpus 2 可以防止 runaway 进程吃光整台机器资源。
裸机运行的风险
如果不用 Docker,AI 就拥有你当前用户账号能做的一切操作能力,包括删文件、装软件、访问本机可达资源。裸机模式只建议用于你自己的个人机器。
一定要设置密码
如果没有 API key,任何能打到该端口的人都可以运行命令、读文件、接管 terminal。
-e OPEN_TERMINAL_API_KEY=a-strong-password-here生产环境更推荐配合 配置文件 或 Docker secrets 使用。
优先使用管理员侧连接,而不是用户侧连接
| 管理员配置 | 用户个人配置 | |
|---|---|---|
| API key 存放位置 | 服务器端 | 浏览器端 |
| 请求经过 | OPL 数据空间 backend | 用户浏览器直连 |
| 哪些机器需要能连通 terminal | 只要 OPL 数据空间服务器 | 每个用户自己的电脑 |
管理员侧连接更安全,也更容易统一控权。
限制资源
避免单个脚本把 CPU / 内存全部吃光:
deploy:
resources:
limits:
memory: 2G
cpus: "2.0"网络隔离
最安全的方式之一,是把 Open Terminal 放在仅 OPL 数据空间可访问的私有 Docker 网络中:
services:
open-webui:
networks:
- public
- internal
open-terminal:
networks:
- internal
networks:
public:
internal:
internal: true这意味着:
- OPL 数据空间可以访问
http://open-terminal:8000 - 公网不能直接访问 Open Terminal
- Open Terminal 默认也不能主动访问外网
出站过滤
如果 Open Terminal 需要有限的外网访问,例如安装包,可以进一步限制它只允许访问特定域名:
-e OPEN_TERMINAL_ALLOWED_DOMAINS="pypi.org,github.com,*.npmjs.org"这样可以减少数据外传和下载未知程序的风险。
Docker socket 风险
可选地,你也可以把宿主机 Docker socket 挂进容器:
-v /var/run/docker.sock:/var/run/docker.sock仅用于完全信任环境
挂载 Docker socket 基本等同于给容器 root 级 Docker 控制权,也就几乎等同于把宿主机交给它。拥有 terminal 访问权的人可以借此访问主机文件系统、网络,以及管理其他所有容器。
安全检查清单
| ✅ | 建议 |
|---|---|
| ☐ | 优先 Docker,不用裸机 |
| ☐ | 设置强 API key |
| ☐ | 走管理员侧连接 |
| ☐ | 配 CPU / 内存限制 |
| ☐ | 使用内部网络隔离 |
| ☐ | 需要时开启出站过滤 |
| ☐ | 除非必要,不挂 Docker socket |
| ☐ | 如果不需要运行时装包,可考虑 slim 或 alpine 镜像 |