强化 Open WebUI 安全
Open WebUI 是一个自托管应用,会向已认证用户提供模型推理、工具执行、代码流水线等能力。与数据库、容器仓库、CI 服务器等其他自托管基础设施一样,部署方需要自行管理运行环境、网络暴露方式和配置。Open WebUI 提供了本指南中介绍的控制项;具体如何配置,取决于你的环境与威胁模型。
本指南聚焦于可用于强化部署安全性的配置项。每一节都会说明某个设置的作用、默认值以及如何修改。它并不是一份面面俱到的安全手册;最终,保障部署安全仍是你的责任。你的运行环境、合规要求和威胁模型,将决定哪些项与你最相关。
概览
网络放置建议
Open WebUI 的设计预期是运行在私有、可信网络中,类似数据库、容器仓库或 CI 服务器这类自托管基础设施。大多数部署都会放在企业防火墙、VPN 或其他仅允许已知用户访问的网络边界之后。
对于把安全放在优先位置的组织,推荐将 Open WebUI 放在以下一种或多种保护层之后:
- VPN(WireGuard、Tailscale)
- Zero Trust 访问代理(Cloudflare Access、Pomerium)
- 带认证与 IP allowlist 的反向代理
DDoS 防护和暴力破解防护(限速、连接节流、fail2ban)应由代理层或网络层承担。
如果你是第一次部署 Open WebUI,建议先查看本文底部的速查表,获取按优先级整理的摘要,然后再阅读与你部署场景相关的章节。
密钥
WEBUI_SECRET_KEY 用于签发 JWT(登录 token),并派生 OAuth 会话数据的加密密钥。
默认行为:
通过 Docker(start.sh)或 open-webui serve 运行时,应用会先检查环境变量中是否设置了 WEBUI_SECRET_KEY。如果没有,它会自动生成一个随机密钥,并保存到数据目录中的 .webui_secret_key。之后重启时会重新加载这个已保存的密钥。这意味着在单实例部署中,通常无需手动配置。
什么时候必须显式设置:
如果你在负载均衡器后运行多个 Open WebUI 实例,所有实例必须共享同一个密钥。否则,一个实例签发的 token 会被另一个实例拒绝,导致登录失败。你可以通过 openssl rand -base64 32 生成密钥,并以环境变量形式传给所有副本。