⌘+k ctrl+k
1.1.3 (stable)
Search Shortcut cmd + k | ctrl + k
Securing DuckDB

DuckDB 非常强大,这可能会带来问题,特别是在运行不受信任的 SQL 查询时,例如来自面向公众的用户输入。 本页列出了一些选项,以限制恶意 SQL 查询可能带来的影响。

保护DuckDB的方法因您的使用案例、环境和潜在的攻击模型而异。 因此,请仔细考虑与安全相关的配置选项,尤其是在处理机密数据集时。

如果您计划将DuckDB嵌入到您的应用程序中,请查阅“Embedding DuckDB”页面。

报告漏洞

如果您发现潜在的漏洞,请通过GitHub保密报告

禁用文件访问

DuckDB 可以通过其 CSV 解析器的 read_csv 函数 列出目录并读取任意文件,或者通过 read_text 函数 读取文本。例如:

SELECT *
FROM read_csv('/etc/passwd', sep = ':');

这可以通过完全禁用外部访问(enable_external_access)或禁用个别文件系统来实现。例如:

SET disabled_filesystems = 'LocalFileSystem';

Secrets

Secrets 用于管理登录第三方服务(如AWS或Azure)的凭证。DuckDB可以使用duckdb_secrets()表函数显示秘密列表。默认情况下,这将隐藏任何敏感信息,如安全密钥。可以设置allow_unredacted_secrets选项以显示安全密钥中包含的所有信息。如果您正在运行不受信任的SQL输入,建议不要启用此选项。

查询可以访问在Secrets Manager中定义的秘密。例如,如果定义了一个秘密用于与具有对给定AWS S3存储桶写入权限的用户进行身份验证,查询可以写入该存储桶。这适用于持久和临时秘密。

持久性密钥以未加密的二进制格式存储在磁盘上。这些密钥的权限与SSH密钥相同,600,即只有运行DuckDB(父)进程的用户才能读取和写入它们。

锁定配置

出于安全原因,与安全相关的配置设置通常会自行锁定。例如,虽然我们可以使用SET allow_community_extensions = false禁用社区扩展,但在不重启数据库的情况下,我们无法再次重新启用它们。尝试这样做将导致错误:

Invalid Input Error: Cannot upgrade allow_community_extensions setting while database is running

这可以防止不受信任的SQL输入重新启用那些出于安全原因被明确禁用的设置。

然而,许多配置设置不会自行禁用,例如资源限制。如果您允许用户在自己的硬件上不受限制地运行SQL语句,建议您在使用以下命令完成自己的配置后锁定配置:

SET lock_configuration = true;

这防止了从那时起任何配置设置被修改。

限制资源使用

DuckDB 可能会占用大量的 CPU、RAM 和磁盘空间。为了防止拒绝服务攻击,可以限制这些资源。

DuckDB可以使用的CPU线程数可以通过以下方式设置,例如:

SET threads = 4;

其中4是允许的线程数。

最大内存(RAM)量也可以被限制,例如:

SET memory_limit = '4GB';

临时文件目录的大小可以通过以下方式限制:

SET max_temp_directory_size = '4GB';

扩展

DuckDB 拥有一个强大的扩展机制,这些扩展拥有与运行 DuckDB 的(父)进程用户相同的权限。 这引入了安全考虑。因此,我们建议查看 保护扩展 的配置选项。

通用解决方案

保护DuckDB也可以通过经过验证的方法来支持,例如:

  • 通过chroot来限定用户权限,依赖于操作系统
  • 容器化,例如,Docker 和 Podman
  • 在WebAssembly中运行DuckDB

本节中的页面