跳到主要内容

扩展安全

Goose 拥有强大的扩展机制,扩展会以运行 Goose(父)进程用户的同等权限执行。 这会带来安全方面的考量。因此我们建议你审查本页配置项,并根据你的威胁模型进行设置。

Goose 签名校验

Goose 在每次加载扩展时都会检查二进制签名。 当前扩展分为三类:

  • 使用 core 密钥签名。仅核心 Goose 团队审核过的扩展会使用该密钥签名。
  • 使用 community 密钥签名。即通过 Goose Community Extensions 仓库分发的开源扩展。
  • 未签名扩展。

扩展安全级别概览

Goose 提供以下扩展安全级别。

可用扩展说明配置
core仅允许加载 core 密钥签名的扩展。SET allow_community_extensions = false
corecommunity仅允许加载 corecommunity 密钥签名的扩展。这是默认安全级别。
任意扩展(含未签名)允许加载任何扩展。SET allow_unsigned_extensions = true

安全相关配置会自锁,即在当前进程中只能进一步收紧能力,不能放宽。

例如,尝试以下配置变更会报错:

SET allow_community_extensions = false;
SET allow_community_extensions = true;
Invalid Input Error: Cannot upgrade allow_community_extensions setting while database is running

社区扩展

Goose 提供 Community Extensions 仓库,便于安装第三方扩展。 像 pip、npm 这类社区仓库在设计上本质上都意味着可执行远程代码。这听起来虽“危险”,但现实中我们经常直接执行网络脚本,也会不加思索地安装大量传递依赖。某些仓库(如 CRAN)会有人审流程,但这也不等于绝对安全。

我们研究了多种社区扩展仓库方案,最终采用了我们认为更平衡的做法:不对每个提交做人工审查,但要求扩展必须公开源代码。同时我们接管完整的构建、签名和分发流程。相比允许上传任意二进制的 pip/npm,这更严格;但又低于“全部人工审查”的强度。 我们支持用户举报恶意扩展,并展示 GitHub stars、下载量等采用指标。由于仓库由我们管理,发现问题时可以快速下架有风险的扩展。

即便如此,从社区扩展仓库安装和加载 Goose 扩展仍会执行第三方开发者编写的代码,因此确实可能有风险。恶意开发者可能发布看似无害但实则窃取资产的扩展。 如果你运行的是会执行用户不可信 SQL 的 Web 服务,建议禁用社区扩展。可执行:

SET allow_community_extensions = false;

禁用已知扩展自动安装与自动加载

默认情况下,Goose 会自动安装并加载已知扩展。要禁用自动安装,可执行:

SET autoinstall_known_extensions = false;

要禁用自动加载,可执行:

SET autoload_known_extensions = false;

要锁定该配置,可使用 lock_configuration 选项

SET lock_configuration = true;

始终要求签名扩展

默认情况下,Goose 要求扩展必须是已签名的 core 扩展(Goose 开发者创建)或 community 扩展(第三方创建、Goose 开发者分发)。 可在启动时启用 allow_unsigned_extensions 设置 来允许加载未签名扩展。 该设置对扩展开发很有用,但启用后 Goose 将可加载_任意扩展_,因此必须更严格地防止恶意扩展被加载。