跳到主要内容

数据库加密

Libre WebUI 包含应用级加密服务,在敏感值写入存储前对其加密。

加密方法

后端通过 Node.js 加密模块使用 AES-256-GCM。加密密钥必须为 32 字节,以 64 个十六进制字符表示:

ENCRYPTION_KEY=0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef

生成密钥:

openssl rand -hex 32

密钥存储

Libre WebUI 按以下顺序加载密钥:

  1. 环境中的 ENCRYPTION_KEY
  2. 所选 DATA_DIR 下的持久化 .encryption_key 文件。
  3. 仅在全新存储中,生成新密钥,并在数据库启动前持久写入 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 设置相同值;若两个来源同时存在,则必须一致。

相关文档