⌘+k ctrl+k
1.1.3 (stable)
Search Shortcut cmd + k | ctrl + k
Secrets Manager

Secrets manager 提供了一个统一的用户界面,用于管理所有使用它们的后端的秘密。秘密可以被限定范围,因此不同的存储前缀可以有不同的秘密,例如允许在单个查询中跨组织连接数据。秘密也可以被持久化,这样每次启动 DuckDB 时就不需要重新指定它们。

警告 持久化密钥以未加密的二进制格式存储在磁盘上。

秘密类型

秘密是类型化的,它们的类型标识了它们是为哪个服务准备的。目前,可用的云服务如下:

对于每种类型,都有一个或多个“秘密提供者”指定秘密的创建方式。秘密还可以有一个可选的范围,这是秘密适用的文件路径前缀。当为路径获取秘密时,秘密范围将与路径进行比较,返回与路径匹配的秘密。在多个匹配秘密的情况下,选择最长的前缀。

创建密钥

可以使用CREATE SECRET SQL语句创建秘密。 秘密可以是临时的持久的。默认情况下使用临时秘密——它们存储在内存中,生命周期与DuckDB实例相同,类似于以前设置的工作方式。持久秘密以未加密的二进制格式存储在~/.duckdb/stored_secrets目录中。在DuckDB启动时,持久秘密会从此目录中读取并自动加载。

秘密提供者

要创建一个秘密,需要使用秘密提供者。秘密提供者是一种生成秘密的机制。为了说明这一点,对于S3GCSR2AZURE秘密类型,DuckDB目前支持两种提供者:CONFIGCREDENTIAL_CHAINCONFIG提供者要求用户将所有配置信息传递到CREATE SECRET中,而CREDENTIAL_CHAIN提供者将自动尝试获取凭据。当未指定秘密提供者时,将使用CONFIG提供者。有关如何使用不同提供者创建秘密的更多详细信息,请查看httpfsazure上的相应页面。

临时密钥

要创建一个临时的无范围密钥来访问S3,我们现在可以使用以下内容:

CREATE SECRET my_secret (
    TYPE S3,
    KEY_ID 'my_secret_key',
    SECRET 'my_secret_value',
    REGION 'my_region'
);

请注意,我们在这里隐式使用了默认的CONFIG秘密提供者。

持久化密钥

为了在DuckDB数据库实例之间持久化保存密钥,我们现在可以使用CREATE PERSISTENT SECRET命令,例如:

CREATE PERSISTENT SECRET my_persistent_secret (
    TYPE S3,
    KEY_ID 'my_secret_key',
    SECRET 'my_secret_value'
);

默认情况下,这会将密钥(未加密)写入~/.duckdb/stored_secrets目录。要更改密钥目录,请执行以下命令:

SET secret_directory = 'path/to/my_secrets_dir';

请注意,设置home_directory配置选项的值不会影响密钥的位置。

删除秘密

可以使用DROP SECRET 语句删除秘密,例如:

DROP PERSISTENT SECRET my_persistent_secret;

为同一服务类型创建多个密钥

如果某个服务类型存在两个密钥,可以使用范围来决定应该使用哪一个。例如:

CREATE SECRET secret1 (
    TYPE S3,
    KEY_ID 'my_secret_key1',
    SECRET 'my_secret_value1',
    SCOPE 's3://my-bucket'
);
CREATE SECRET secret2 (
    TYPE S3,
    KEY_ID 'my_secret_key2',
    SECRET 'my_secret_value2',
    SCOPE 's3://my-other-bucket'
);

现在,如果用户从 s3://my-other-bucket/something 查询某些内容,将自动为该请求选择秘密 secret2。要查看正在使用的秘密,可以使用 which_secret 标量函数,该函数接受路径和秘密类型作为参数:

FROM which_secret('s3://my-other-bucket/file.parquet', 's3');

列出秘密

可以使用内置的生成表格函数列出秘密,例如,通过使用duckdb_secrets() 表格函数

FROM duckdb_secrets();

敏感信息将被编辑。