Secrets manager 提供了一个统一的用户界面,用于管理所有使用它们的后端的秘密。秘密可以被限定范围,因此不同的存储前缀可以有不同的秘密,例如允许在单个查询中跨组织连接数据。秘密也可以被持久化,这样每次启动 DuckDB 时就不需要重新指定它们。
警告 持久化密钥以未加密的二进制格式存储在磁盘上。
秘密类型
秘密是类型化的,它们的类型标识了它们是为哪个服务准备的。目前,可用的云服务如下:
- AWS S3 (
S3
), 通过httpfs
扩展 - Azure Blob 存储 (
AZURE
),通过azure
扩展 - Cloudflare R2 (
R2
),通过httpfs
扩展 - Google Cloud Storage (
GCS
), 通过httpfs
扩展 - Hugging Face (
HUGGINGFACE
), 通过httpfs
扩展 - MySQL (
MYSQL
), 通过mysql
扩展 - PostgreSQL (
POSTGRES
), 通过postgres
扩展
对于每种类型,都有一个或多个“秘密提供者”指定秘密的创建方式。秘密还可以有一个可选的范围,这是秘密适用的文件路径前缀。当为路径获取秘密时,秘密范围将与路径进行比较,返回与路径匹配的秘密。在多个匹配秘密的情况下,选择最长的前缀。
创建密钥
可以使用CREATE SECRET
SQL语句创建秘密。
秘密可以是临时的或持久的。默认情况下使用临时秘密——它们存储在内存中,生命周期与DuckDB实例相同,类似于以前设置的工作方式。持久秘密以未加密的二进制格式存储在~/.duckdb/stored_secrets
目录中。在DuckDB启动时,持久秘密会从此目录中读取并自动加载。
秘密提供者
要创建一个秘密,需要使用秘密提供者。秘密提供者是一种生成秘密的机制。为了说明这一点,对于S3
、GCS
、R2
和AZURE
秘密类型,DuckDB目前支持两种提供者:CONFIG
和CREDENTIAL_CHAIN
。CONFIG
提供者要求用户将所有配置信息传递到CREATE SECRET
中,而CREDENTIAL_CHAIN
提供者将自动尝试获取凭据。当未指定秘密提供者时,将使用CONFIG
提供者。有关如何使用不同提供者创建秘密的更多详细信息,请查看httpfs和azure上的相应页面。
临时密钥
要创建一个临时的无范围密钥来访问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();
敏感信息将被编辑。