扩展安全
Goose 拥有强大的扩展机制,扩展会以运行 Goose(父)进程用户的同等权限执行。 这会带来安全方面的考量。因此我们建议你审查本页配置项,并根据你的威胁模型进行设置。
Goose 签名校验
Goose 在每次加载扩展时都会检查二进制签名。 当前扩展分为三类:
- 使用
core密钥签名。仅核心 Goose 团队审核过的扩展会使用该密钥签名。 - 使用
community密钥签名。即通过 Goose Community Extensions 仓库分发的开源扩展。 - 未签名扩展。
扩展安全级别概览
Goose 提供以下扩展安全级别。
| 可用扩展 | 说明 | 配置 |
|---|---|---|
core | 仅允许加载 core 密钥签名的扩展。 | SET allow_community_extensions = false |
core 和 community | 仅允许加载 core 或 community 密钥签名的扩展。 | 这是默认安全级别。 |
| 任意扩展(含未签名) | 允许加载任何扩展。 | 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 将可加载_任意扩展_,因此必须更严格地防止恶意扩展被加载。