数据库加密
Libre WebUI 包含应用级加密服务,在敏感值写入存储前对其加密。
加密方法
后端通过 Node.js 加密模块使用 AES-256-GCM。加密密钥必须为 32 字节,以 64 个十六进制字符表示:
ENCRYPTION_KEY=0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
生成密钥:
openssl rand -hex 32
密钥存储
Libre WebUI 按以下顺序加载密钥:
- 环境中的
ENCRYPTION_KEY。 - 所选
DATA_DIR下的持久化.encryption_key文件。 - 仅在全新存储中,生成新密钥,并在数据库启动前持久写入
DATA_DIR/.encryption_key。
若环境和持久文件都提供密钥,则两者必须相同,否则启动失败。已有加密状态缺少原始密钥时也会安全失败;Libre 绝不会为已有存储生成替代密钥。
重要密钥规则
- 将
ENCRYPTION_KEY与数据库一同备份。 - 除非已有加密值迁移计划,否则不要轮换密钥。
- 密钥丢失意味着无法恢复加密值。
- 未重新加密数据就更换密钥,会使现有加密值无法读取。
保护范围
使用加密服务或加密存储辅助函数的代码路径会应用加密。它用于这些辅助函数处理的凭据和私人用户数据等敏感应用值。
它不是全盘加密、SQLite 页面加密,也不是用户与浏览器之间的端到端加密。请对这些层使用磁盘加密和 HTTPS。
Work 数据
应用级加密不会加密整个 Work 任务。Work 源文件和项目依赖是任务专属 Docker 命名卷中的普通文件。Work 对话、工具结果、命令输出和任务元数据存储在 SQLite 中,不会因为某些凭据路径使用加密服务而自动加密。
必要时使用访问控制和磁盘加密保护 Docker 数据根目录与 DATA_DIR。数据库、ENCRYPTION_KEY 和受管 Work 卷必须一同备份。向远程模型发送 Work 任务还可能把对话上下文及请求的文件或命令输出透露给提供商;存储加密不会改变这一网络边界。
Docker 与 Kubernetes
为生产环境显式设置稳定密钥:
ENCRYPTION_KEY=replace-with-64-hex-characters
DATA_DIR=/data
将 DATA_DIR 挂载到持久存储。在 Kubernetes 中,将密钥保存在 Secret 中,并把数据挂载到 PersistentVolume。
故障排除
密钥长度无效
密钥必须正好包含 64 个十六进制字符。使用以下命令生成新密钥:
openssl rand -hex 32
重新部署后无法解密数据
确认使用相同的 ENCRYPTION_KEY,并挂载相同的 DATA_DIR 卷。
开发环境生成了新密钥
将 DATA_DIR/.encryption_key 与数据库一同保留。也可通过 ENCRYPTION_KEY 设置相同值;若两个来源同时存在,则必须一致。