安全最佳实践
Open Terminal 赋予 AI 运行命令和管理文件的真实能力。以下是确保这种能力被安全使用的方法。
使用 Docker
始终使用 Docker,除非你明确需要直接访问你的机器。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 标志可防止失控进程消耗你机器的全部资源。
不使用 Docker(裸机模式)时,AI 可以使用你用户账户的权限运行任何命令——包括删除文件、安装软件,或访问你账户能访问的任何内容。裸机模式仅用于你自己的个人机器上的个人项目。
始终设置密码
没有 API Key 时,任何能访问该端口的人都拥有完整权限——他们可以运行命令、读取文件并控制终端。
-e OPEN_TERMINAL_API_KEY=a-strong-password-here在生产环境中,请使用配置文件或 Docker secrets,而不是在命令行中明文传入密钥。
使用管理员连接(而非用户连接)
连接到 Open WebUI 时,优先使用管理员配置方式:
| 管理员配置 | 用户配置 | |
|---|---|---|
| API Key 可见性 | 保存在服务端,不对用户暴露 | 存储在用户浏览器中 |
| 请求经过 | Open WebUI 后端 | 直接从浏览器发出 |
| 终端网络访问来源 | 仅 Open WebUI 服务器 | 每位用户的计算机 |
管理员配置的连接可防止 API Key 进入用户浏览器,并让你控制谁有访问权限。
限制资源
防止失控脚本消耗所有可用的 CPU 和内存:
deploy:
resources:
limits:
memory: 2G
cpus: "2.0"如果进程超出这些限制,Docker 会对其进行限流(CPU)或终止(内存)。你的服务器保持健康运行。
网络隔离
对于最安全的配置,将 Open Terminal 放置在只有 Open WebUI 能访问的私有 Docker 网络中:
services:
open-webui:
image: ghcr.io/open-webui/open-webui:latest
ports:
- "3000:8080"
networks:
- public
- internal
open-terminal:
image: ghcr.io/open-webui/open-terminal
# Notice: no ports exposed to the outside
networks:
- internal
networks:
public:
internal:
internal: true # No internet access from this network这意味着:
- Open WebUI 可以通过
http://open-terminal:8000访问 Open Terminal - Open Terminal 无法从互联网直接访问
- Open Terminal 无法发出出站互联网请求
出站流量过滤
如果 Open Terminal 需要一定的互联网访问权限(例如安装软件包),你可以将其限制在特定域名:
-e OPEN_TERMINAL_ALLOWED_DOMAINS="pypi.org,github.com,*.npmjs.org"只有这些域名可以访问。其他所有域名均被阻止。这可以防止:
- 未经授权的数据离开容器
- 下载意外的软件
- 访问你未预期的内部服务
Docker socket 警告
Docker 容器可以选择性地访问宿主机的 Docker(让 AI 构建镜像、运行容器等):
-v /var/run/docker.sock:/var/run/docker.sock挂载 Docker socket 等同于给予容器对你宿主机 Docker 的完全控制权。这实际上就是你这台机器上的 root 权限。任何拥有终端访问 权限的人都可以:
- 运行挂载你整个文件系统的容器
- 访问你的宿主机网络
- 管理你机器上的每一个容器
只有当你完全信任每一位拥有终端访问权限的人时,才可以这样做。
安全检查清单
| ✅ | 建议 |
|---|---|
| ☐ | 使用 Docker 而非裸机 |
| ☐ | 设置强壮的 API Key |
| ☐ | 使用管理员配置的连接 |
| ☐ | 设置内存和 CPU 限制 |
| ☐ | 使用网络隔离(内部 Docker 网络) |
| ☐ | 在不需要互联网访问时启用出站过滤 |
| ☐ | 除非必要,否则不要挂载 Docker socket |
| ☐ | 如果不需要运行时安装软件包,请使用 slim 或 alpine 镜像 |