⌘+k ctrl+k
1.3 (稳定版)
搜索快捷键 cmd + k | ctrl + k
保护扩展安全

DuckDB 拥有强大的扩展机制,这些扩展机制与运行 DuckDB(父)进程的用户拥有相同的权限。这引入了安全方面的考量。因此,我们建议您审阅此页面上列出的配置选项,并根据您的攻击模型进行设置。

DuckDB 签名检查

DuckDB 扩展在每次加载时都会使用二进制文件的签名进行检查。目前有三类扩展:

  • 使用 core 密钥签名。只有经过 DuckDB 核心团队审查的扩展才能使用这些密钥签名。
  • 使用 community 密钥签名。这些是通过 DuckDB 社区扩展库分发的开源扩展。
  • 未签名。

扩展安全级别概述

DuckDB 为扩展提供了以下安全级别。

可用扩展 描述 配置
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

社区扩展

DuckDB 拥有一个社区扩展库,可以方便地安装第三方扩展。像 pip 或 npm 这样的社区扩展库从设计上讲本质上是允许远程代码执行的。这听起来没有那么戏剧性。无论是好是坏,我们都习惯于将来自网络的随机脚本导入到我们的 shell 中,并且经常毫不犹豫地安装大量的传递性依赖。有些存储库,如 CRAN,在某些时候会强制进行人工检查,但这也不能保证任何事情。

我们研究了社区扩展库的几种不同方法,并选择了我们认为合理的方法:我们不尝试审查提交,但要求扩展的源代码可用。我们负责完整的构建、签名和分发过程。请注意,这比允许上传任意二进制文件的 pip 和 npm 更进一步,但比手动审查所有内容有所简化。我们允许用户报告恶意扩展并显示 GitHub 星标和下载量等采用统计数据。由于我们管理存储库,因此我们可以快速从分发中删除有问题​​的扩展。

尽管如此,从社区扩展库安装和加载 DuckDB 扩展将执行第三方开发人员编写的代码,因此可能是危险的。恶意开发人员可能会创建并注册一个看似无害的 DuckDB 扩展,从而窃取您的加密货币。如果您正在运行一个使用 DuckDB 执行用户不受信任的 SQL 的 Web 服务,我们建议禁用社区扩展。为此,请运行:

SET allow_community_extensions = false;

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

默认情况下,DuckDB 会自动安装和加载已知扩展。要禁用已知扩展的自动安装,请运行:

SET autoinstall_known_extensions = false;

要禁用已知扩展的自动加载,请运行:

SET autoload_known_extensions = false;

要锁定此配置,请使用lock_configuration 选项

SET lock_configuration = true;

始终要求已签名扩展

默认情况下,DuckDB 要求扩展要么是核心扩展(由 DuckDB 开发人员创建)要么是社区扩展(由第三方开发人员创建但由 DuckDB 开发人员分发)并已签名。allow_unsigned_extensions 设置可以在启动时启用,以允许加载未签名的扩展。虽然此设置对于扩展开发很有用,但启用它将允许 DuckDB 加载任何扩展,这意味着必须更加小心,以确保不加载恶意扩展。