GOMODEL_ENCRYPTION_KEY 后,这些 Secret 会在写入前被加密,因此数据库文件、
转储、备份或副本中将不再以明文形式保存它们。
加密的字段:
在环境变量或
config.yaml 中声明的凭据永远不会写入数据库,因此不受影响。
默认值:未设置。Secret 以明文存储;当已启用的功能(提供商,以及开启时的 MCP 或护栏)
加载明文 Secret 时,GoModel 会在启动时记录一条警告。
启用
生成一个密钥,并将其传给共享该数据库的每个实例:GOMODEL_ENCRYPTION_KEY=${file:/run/secrets/gomodel-encryption-key}。
现有的明文 Secret
启用密钥不会重写任何内容。明文值仍可正常使用,并会在每个条目下次保存时被加密。 如需一次性加密全部内容,请运行:轮换密钥
要更换GOMODEL_ENCRYPTION_KEY,请使用新密钥启动,并将旧密钥放在
GOMODEL_ENCRYPTION_KEY_PREVIOUS 中:
GOMODEL_ENCRYPTION_KEY_PREVIOUS。
如需替换数据密钥本身(例如怀疑某个数据库副本连同旧密钥一起泄露后),请运行:
gomodel secrets reencrypt。
工作原理
每个数据库都有一个随机的 256 位数据密钥,仅以封装后的形式存储在encryption_keys 表中。
用于封装它的密钥是使用 Argon2id 从 GOMODEL_ENCRYPTION_KEY 派生的。Secret 值使用
AES-256-GCM 加密,并以 enc:v1:<key-id>:<ciphertext> 的形式存储;行和字段会被绑定到密文中,
因此复制到其他行或字段的值将无法解密,而不会在那里被使用。
Admin API 保持不变:响应中的 Secret 仍会被遮盖。
静态数据加密保护的是数据库的副本。它无法防范能够读取网关环境或内存的人,
也不能替代对数据库及其备份的访问限制。
自定义发行版
基于 GoModel 构建的发行版可以使用 KMS 而不是GOMODEL_ENCRYPTION_KEY 来封装数据密钥,
方法是在 run.Options.SetupConfig 中使用 config.KeyWrapper 调用 LoadResult.SetKeyWrapper。
首次使用新的封装器启动时,请保留一次 GOMODEL_ENCRYPTION_KEY 的设置,以便将现有数据密钥迁移过去。
如需从一个封装器迁移到另一个,请将旧封装器作为先前的封装器传入:SetKeyWrapper(next, previous)。