DataHub Snowflake 连接器前置指南:权限模型与认证配置全解析
2026/9/19 22:15:27 网站建设 项目流程

DataHub Snowflake 连接器前置指南:权限模型与认证配置全解析

【免费下载链接】datahubThe Context Platform for your Data and AI Stack项目地址: https://gitcode.com/GitHub_Trending/da/datahub

导读

本指南围绕 DataHub 元数据摄取(ingestion)体系中的 Snowflake 连接器,完整讲解生产环境接入前的两项前置工作:在 Snowflake 侧创建最小权限的数据摄取角色,以及为连接器配置安全可靠的认证方式。读完本文,你将能够按照最小权限原则编写授权 SQL、理解每一项 privilege 的用途与取舍,并掌握用户名密码、Key Pair 与 Okta OAuth 三类认证的 recipe 配置方法,为后续的表/视图元数据、血缘(lineage)、使用统计(usage)与标签(tags)摄取打好基础。文档主体内容来自 snowflake_pre.md,并结合作者仓库中 snowflake_config.py、snowflake_connection.py 等源码进行纵深印证。

一、Overview:Snowflake 连接器解决什么问题

snowflake模块(源码位于 metadata-ingestion/src/datahub/ingestion/source/snowflake/)负责将 Snowflake 仓库中的元数据摄取到 DataHub,面向生产级摄取工作流。根据同目录 README.md 中的概念映射表,该连接器覆盖的实体范围包括:

  • 数据库 / 模式:映射为 DataHub 的 Container(DATABASE / SCHEMA);
  • 表 / 视图 / 动态表 / 外部表 / 流(Stream):映射为 Dataset,其中动态表还包含 target lag、SQL 定义以及与源表的血缘;
  • 列(SchemaField):提取列类型、可空性、描述与标签;
  • 表级与列级血缘:来自视图定义、动态表定义以及 SQL 查询历史;
  • 使用统计(DatasetUsageStatistics)与操作(Operation):按数据集统计查询次数、用户访问模式与 DML 操作指标;
  • 标签(Tag):受extract_tags配置控制,支持数据库/模式/表/列级继承;
  • 角色(Role):映射为urn:li:corpGroup:{role_name}

前置条件章节(即本文主体)回答的是"在真正开始摄取之前,运维需要在 Snowflake 侧做什么"——本质上是为连接器创建一个遵循最小权限原则的专用角色与用户,并视功能需求授予对共享SNOWFLAKE数据库(Account Usage)的访问权。

二、Prerequisites:创建 DataHub 专用角色与用户

连接器需要特定的 privilege 才能读取 Snowflake 仓库中的元数据。官方建议以ACCOUNTADMIN身份,或具有MANAGE GRANTS权限的用户执行下述 SQL,创建一个 DataHub 专属角色并完成授权。以下脚本完整继承自原文档,并补充了每一段注释对应的功能说明:

create or replace role datahub_role; // 授予对 warehouse 的访问权,以便运行查询查看元数据 grant operate, usage on warehouse "<your-warehouse>" to role datahub_role; // 授予对数据库和模式的访问权,以便查看其中的表/视图/动态表 grant usage on DATABASE "<your-database>" to role datahub_role; grant usage on all schemas in database "<your-database>" to role datahub_role; grant usage on future schemas in database "<your-database>" to role datahub_role; grant select on all streams in database "<your-database>" to role datahub_role; grant select on future streams in database "<your-database>" to role datahub_role; // 若未使用 Snowflake Profiling 或 Classification 功能:为表和视图授予 references 权限 grant references on all tables in database "<your-database>" to role datahub_role; grant references on future tables in database "<your-database>" to role datahub_role; grant references on all external tables in database "<your-database>" to role datahub_role; grant references on future external tables in database "<your-database>" to role datahub_role; grant references on all views in database "<your-database>" to role datahub_role; grant references on future views in database "<your-database>" to role datahub_role; -- Note: Semantic views are covered by the above view grants // 若存在 Dynamic Tables 且希望 DataHub 提取它们及其血缘,需要 monitor 权限 grant monitor on all dynamic tables in database "<your-database>" to role datahub_role; grant monitor on future dynamic tables in database "<your-database>" to role datahub_role; // 若使用了 Snowflake Profiling 或 Classification 功能:为表授予 select 权限 grant select on all tables in database "<your-database>" to role datahub_role; grant select on future tables in database "<your-database>" to role datahub_role; grant select on all external tables in database "<your-database>" to role datahub_role; grant select on future external tables in database "<your-database>" to role datahub_role; grant select on all dynamic tables in database "<your-database>" to role datahub_role; grant select on future dynamic tables in database "<your-database>" to role datahub_role; // 创建 DataHub 用户并绑定 datahub_role create user datahub_user display_name = 'DataHub' password='' default_role = datahub_role default_warehouse = '<your-warehouse>'; // 将 datahub_role 授予新用户 grant role datahub_role to user datahub_user; // 可选 - 提取血缘、使用统计或标签(不含血缘)时需要 grant imported privileges on database snowflake to role datahub_role; // 可选 - INTERNAL marketplace(私有数据共享)摄取所需 // 该授权用于: // - SHOW AVAILABLE LISTINGS (IS_ORGANIZATION = TRUE) 查看内部市场 listing // - SNOWFLAKE.ACCOUNT_USAGE.DATABASES 识别导入的数据库 // - SNOWFLAKE.DATA_SHARING_USAGE.LISTING_ACCESS_HISTORY 统计使用情况 // - DESCRIBE AVAILABLE LISTING 丰富元数据(当 fetch_internal_marketplace_listing_details=true 时) grant imported privileges on database snowflake to role datahub_role; // 市场提供方模式(marketplace_mode: provider 或 both)需要: // SHOW SHARES 会列出角色拥有或继承的 share;DESC SHARE 要求 share 的 OWNERSHIP。 // 市场创建的 share 通常由 SYSADMIN 拥有,如需 DESC SHARE,需将 SYSADMIN 授予 DataHub 角色: use role securityadmin; grant role sysadmin to role datahub_role; // 或者,直接在 recipe 中设置 `role: SYSADMIN` // 可选 - 提取 Streamlit Apps 时需要 grant usage on all streamlits in database "<your-database>" to role datahub_role; grant usage on future streamlits in database "<your-database>" to role datahub_role; // 可选 - 提取 Stages、Tasks 或 Pipes 时需要 grant usage on all stages in database "<your-database>" to role datahub_role; grant usage on future stages in database "<your-database>" to role datahub_role; grant monitor on all tasks in database "<your-database>" to role datahub_role; grant monitor on future tasks in database "<your-database>" to role datahub_role; grant monitor on all pipes in database "<your-database>" to role datahub_role; grant monitor on future pipes in database "<your-database>" to role datahub_role;

上述脚本体现了一个重要设计:权限不是一次性全量授予,而是按所需功能逐步叠加include_stagesinclude_tasksinclude_pipesinclude_streamlits等摄取开关(定义见 snowflake_config.py)与上面对应的 grant 一一对应,仅当你在 recipe 中打开这些功能时才需要对应权限。

2.1 各项 privilege 的作用与最小权限权衡

原文档逐项说明了每个 privilege 为什么必要,这里完整保留并补充实践建议:

  • operate:仅用于启动 warehouse。如果摄取期间 warehouse 已在运行,或启用了自动恢复(auto-resume),该权限并非必需。由于operate存在成本风险(可被用来启动计算资源),建议尽量依赖 auto-resume 而省略它。
  • usage(warehouse):用于使用该 warehouse 运行查询。
  • usage(database 与 schema):极易被遗漏的关键权限。若没有 database/schema 上的usage,即使表上已授权,表、视图和流依然不可见。管理员若只授予了table上的权限而漏掉 schema 或 database,连接器将无法取得这些对象的元数据。
  • 按需收窄到单个 schema:如果只需要摄取部分 schema 的元数据,可以只对特定 schema 授权,而不是对整个数据库授权:
grant usage on schema "<your-database>"."<your-schema>" to role datahub_role;
  • select(streams):用于读取流定义,使流能够被提取为 DataHub 的 Dataset(SNOWFLAKE STREAM)。注意这意味着可以读取底层数据——除非底层数据集本身有 select 权限。
  • usage(streamlit):用于展示数据库中的 Streamlit 应用,仅在include_streamlits: true时需要,授权方式参考上面的 schema 级示例。
  • usage(stages):用于通过SHOW STAGES列出 stage,仅在include_stages: trueinclude_pipes: true时需要。
  • monitor(tasks):用于通过SHOW TASKS列出 task,仅在include_tasks: true时需要。
  • monitor(pipes):用于通过SHOW PIPES列出 pipe,仅在include_pipes: true时需要。
  • monitor(dynamic tables):DataHub 提取动态表的表级与列级血缘所必需。

原文档特别强调:以上是提取数据库、schema、视图与表所需的最低权限集合。若需启用更多功能,请按"可选"段落继续授权。

2.2 启用血缘 / 使用统计 / 标签:Account Usage 访问权

如果计划通过include_table_lineage启用表级血缘、通过include_usage_stats启用使用统计,或通过extract_tags启用标签提取(不含血缘),还需要授予对snowflake数据库(Account Usage 系统表所在位置)的访问权:

grant imported privileges on database snowflake to role datahub_role;

需要注意imported privileges的授予方式:SNOWFLAKE数据库是 Snowflake 拥有的共享数据库,与普通数据库不同——普通数据库可以对单个表授予细粒度的SELECT,而共享数据库只能通过IMPORTED PRIVILEGES一次性获得对库内所有对象的全有或全无(all-or-nothing)访问。其覆盖范围主要是:

  • SNOWFLAKE.ACCOUNT_USAGE.*:全部视图,如QUERY_HISTORYACCESS_HISTORYUSERS等;
  • SNOWFLAKE.ORGANIZATION_USAGE.*:需要 Snowflake 支持团队在组织层面单独开通。
2.2.1 DataHub 具体访问哪些 ACCOUNT_USAGE 表

下表(原文档原表)列出了授予IMPORTED PRIVILEGES后连接器实际访问的ACCOUNT_USAGE表及其用途,你可以据此判断自己的功能组合究竟需要哪些权限:

TablePurposeRequired For
QUERY_HISTORYQuery logs for lineage, usage stats, and semantic view usage/queriesinclude_table_lineage,include_usage_stats; for semantic viewssemantic_views.enabled+semantic_views.include_usage/semantic_views.include_queries
ACCESS_HISTORYTable/view lineage and access patternsinclude_table_lineage,include_usage_stats
USERSUser email mapping for corp user entitiesinclude_usage_stats(for user attribution)
TAG_REFERENCESTag metadata extractionextract_tags
VIEWSView metadata (DDL, ownership, etc.) for all viewsAlways (when views exist)
COPY_HISTORYLineage fromCOPY INTOoperations (all stages/sources)include_table_lineage

这些表在源码中的使用可以得到印证:例如 snowflake_query.py 中存在对SNOWFLAKE.ACCOUNT_USAGE.VIEWSSNOWFLAKE.ACCOUNT_USAGE.USERSSNOWFLAKE.ACCOUNT_USAGE.DATABASES的查询,以及针对 semantic view 使用统计的QUERY_HISTORY查询;snowflake_tag.py 在标签缓存加载失败时会明确提示检查摄取角色对SNOWFLAKE.ACCOUNT_USAGE.TAG_REFERENCES的访问权。

如果因安全策略无法授予IMPORTED PRIVILEGES,则血缘、使用统计、标签等依赖 Account Usage 的功能将不可用,并在摄取日志中看到权限错误(如SnowflakePermissionError,见 snowflake_connection.py 中_is_permission_error"Insufficient privileges"/"not authorized"的识别逻辑)。这是取舍而非故障:基础的表/视图元数据提取不受影响。

2.3 血缘与统计类功能的版本前提

还需注意,部分功能对 Snowflake 版本有硬性要求。从 snowflake_config.py 的字段描述与 snowflake_lineage_v2.py 的注释可以看出:

  • include_table_lineage(表到表、S3 到 Snowflake 表血缘)与include_column_lineage(列级血缘)依赖snowflake.account_usage.access_history视图,需要 Snowflake Enterprise Edition 或以上
  • semantic views 属于 Cortex Analyst 功能集,同样要求 Enterprise Edition 或以上;配置校验器会在known_snowflake_edition被显式设置为 STANDARD 时自动关闭semantic_views.enabled并给出告警;
  • known_snowflake_edition配置项允许显式指定版本(STANDARD 或 ENTERPRISE),未设置时连接器通过SHOW TAGS自动推断。

三、Authentication:连接器的四种认证方式

前置条件的第二部分是认证。原文档指出,最简单的认证方式是 Snowflake 用户名 + 密码;也可以通过authentication_type配置项使用其他方式。从 snowflake_connection.py 的_VALID_AUTH_TYPES可以看到连接器实际支持的认证类型全集:

_VALID_AUTH_TYPES: Dict[str, str] = { "DEFAULT_AUTHENTICATOR": DEFAULT_AUTHENTICATOR, # 用户名 + 密码 "EXTERNAL_BROWSER_AUTHENTICATOR": EXTERNAL_BROWSER_AUTHENTICATOR, "KEY_PAIR_AUTHENTICATOR": KEY_PAIR_AUTHENTICATOR, # 密钥对 "OAUTH_AUTHENTICATOR": OAUTH_AUTHENTICATOR, # OAuth(通过 oauth_config 换 token) "OAUTH_AUTHENTICATOR_TOKEN": OAUTH_AUTHENTICATOR, # 外部直接提供 OAuth token }

配置校验器(authenticator_type_is_valid)会强制执行一致性约束:若同时设置了private_key/private_key_pathauthentication_type不是KEY_PAIR_AUTHENTICATOR会直接报错;使用OAUTH_AUTHENTICATOR时必须提供oauth_config。此外,连接器在get_connect_args()中默认注入CLIENT_PREFETCH_THREADS: 10CLIENT_SESSION_KEEP_ALIVE: True,以提升大结果集查询性能并避免超时,同时允许通过connect_args覆盖默认值。

3.1 Key Pair 认证

若选择 Key Pair 认证,请先在 Snowflake 侧完成三步准备(生成私钥、生成公钥、将公钥绑定到 recipe 中要使用的 DataHub 用户),然后在 recipe 中用以下配置替代 password。注意私钥必须保持正确的 PEM 格式——开头、结尾以及密钥内部约每 64 个字符处都要有换行符:

authentication_type: KEY_PAIR_AUTHENTICATOR private_key: <Private key in a form of '-----BEGIN PRIVATE KEY-----\nprivate-key\n-----END PRIVATE KEY-----'> # Optional - if using encrypted private key private_key_password: <Password for your private key>

从源码看,private_key也可以替换为private_key_path(指向本地私钥文件的路径),二者至少提供一个。连接器在 snowflake_connection.py 的get_connect_args()中会读取 PEM 私钥(支持加密私钥,通过private_key_password解密),转换为 DER/PKCS8 字节后以private_keyconnect arg 交给 Snowflake Python Connector。

3.2 Okta OAuth

Okta OAuth 的配置大致遵循 Snowflake 官方的 Okta OAuth 接入步骤,然后在 recipe 的oauth_config中传入以下字段:

  • provider: okta
  • client_id:<OAUTH_CLIENT_ID>
  • client_secret:<OAUTH_CLIENT_SECRET>
  • authority_url:<OKTA_OAUTH_TOKEN_ENDPOINT>
  • scopes: 你的 Okta scopes 列表,即带有session:role:前缀的那些

DataHub 仅支持两种 OAuth grant 类型:client_credentialspassword,两者在 Okta 侧的准备工作略有不同。对应地,oauth_config.py 中的OAuthConfiguration定义了provider(目前支持microsoftokta)、authority_urlclient_idscopesuse_certificateclient_secret等字段,并提供基于证书(use_certificate: true时使用 base64 编码的公/私钥)或基于 secret 的两种 token 获取路径;token 的换取与注入逻辑在 oauth_generator.py 与get_oauth_connection()中实现。

Client Credentials Grant Type(较简单)
  • 在 Okta 创建 App Integration 时选择类型API Services
    • 确保客户端认证方式为Client secret
    • 记下你的Client ID
  • 创建一个与 Okta client credentials 对应的 Snowflake 用户;
    • 确保该用户的Login Name与 Okta 应用的Client ID一致
    • 确保该用户已被授予 DataHub 角色。
Password Grant Type
  • 在 Okta 创建 App Integration 时选择类型OIDC -> Native Application
    • 添加 Grant TypeResource Owner Password
    • 确保客户端认证方式为Client secret
  • 创建一个用于登录的 Okta 用户,记下UsernamePassword
  • 创建一个与 Okta client credentials 对应的 Snowflake 用户;
    • 确保该用户的Login Name与 Okta 用户的Username一致(通常是邮箱)
    • 确保该用户已被授予 DataHub 角色;
  • 运行摄取时,在oauth_config中提供client_idclient_secret,并在 recipe 顶层提供 Okta 用户的UsernamePassword
    • 注意:usernamepassword这两个配置项不嵌套在oauth_config之下,而是与account_idwarehouse等平级。

四、Recipe 示例:把权限与认证落到配置上

完成授权与认证准备后,即可编写摄取 recipe。官方示例文件位于 snowflake_recipe.yml,一个最小可用配置如下(变量通过环境变量注入,避免明文密码):

source: type: snowflake config: # This option is recommended to be used to ingest all lineage on the first run. ignore_start_time_lineage: true # Coordinates account_id: "abc48144" warehouse: "COMPUTE_WH" # Credentials username: "${SNOWFLAKE_USER}" password: "${SNOWFLAKE_PASS}" role: "datahub_role" # (Optional) Uncomment and update this section to filter ingested datasets # database_pattern: # allow: # - "^ACCOUNTING_DB$" # - "^MARKETING_DB$" profiling: # Change to false to disable profiling enabled: true # This option is recommended to reduce profiling time and costs. turn_off_expensive_profiling_metrics: true # (Optional) Uncomment and update this section to filter profiled tables # profile_pattern: # allow: # - "ACCOUNTING_DB.*.*" # - "MARKETING_DB.*.*"

其中role: "datahub_role"即指向前文创建的专用角色;account_id支持多种格式(如xy12345xy12345.us-east-2.awsxy12345.central-us.azurexy12345.us-west-2.privatelink等,详见 snowflake_connection.py 中account_id字段描述,该字段会自动去除协议头、尾斜杠与域名后缀)。

与前置权限章节呼应,recipe 中还提供了若干按需开启的功能开关,开启前请确保已授予对应权限(可对照本文 2.1 节的 grant 脚本):

  • marketplace:摄取 INTERNAL marketplace(私有数据共享)listing 为 Data Products,支持marketplace_mode: consumer / provider / both三种模式;provider 或 both 模式要求将imported privileges on database snowflake授予 USER(而非仅授予 role),因为 Snowflake 中 share 的访问是按用户级别授权的;
  • shares:将导入的数据库与其来源 share/listing 关联(运行SHOW SHARESSELECT DATABASE_NAME FROM SNOWFLAKE.ACCOUNT_USAGE.DATABASES WHERE TYPE='IMPORTED DATABASE'可获取所需信息);
  • include_streamlitsinclude_stagesinclude_tasksinclude_pipes:分别摄取 Streamlit 应用(Dashboard)、Stage(Container)、Task(DataJob)与 Snowpipe(DataJob)。

默认 sink 为 datahub-rest,无需额外配置;如需自定义可参考仓库的 sink 文档。

五、常见问题与排障要点

结合源码与原文档,将实践中高频出现的问题归纳如下:

  1. "Database/SCHEMA 'XXXX' does not exist or not authorized":最常见原因是授予了table级别权限但遗漏了database/schemausage。补上 2.1 节中的 database 与 schema 级usagegrant 即可;连接器在 snowflake_connection.py 中会将此类错误归类为SnowflakePermissionError并记录到摄取报告中。
  2. 血缘 / 使用统计 / 标签功能不生效:检查是否已执行grant imported privileges on database snowflake to role datahub_role;若无法授予(安全策略限制),这些功能将按设计降级不可用,且日志会出现权限错误(参见 2.2 节)。
  3. Key Pair 认证报错:确认私钥为合法 PEM 格式(起止行与约 64 字符换行),确认authentication_typeKEY_PAIR_AUTHENTICATOR,且private_keyprivate_key_path至少提供一个。
  4. OAuth 认证报错:检查oauth_config.providerclient_idclient_secretauthority_urlscopes是否齐全;确认 Snowflake 用户的Login Name与 Okta 侧 Client ID(client_credentials)或 Username(password grant)严格一致;username/password放在 recipe 顶层而非oauth_config内。
  5. Account Usage 查询偶发 002003 权限/不存在错误:Snowflake 的 ACCOUNT_USAGE 系统视图在刷新期间可能短暂不可用。连接器在 snowflake_connection.py 中对这类错误实现了指数退避重试(最多 4 次,20/40/60 秒),可自动缓解,无需人工干预。

结语

Snowflake 连接器是 DataHub 元数据体系中覆盖范围最广的连接器之一,而其生产可用性的起点正是前置的权限与认证配置:通过本文的 grant 脚本可以按功能逐级叠加最小权限,通过authentication_typeoauth_config可以安全地接入各类认证体系。完成这些前置工作后,即可参考 snowflake_recipe.yml 开始正式摄取,并进一步了解概念映射(见 README.md)与更完整的摄取参数(见 snowflake_post.md)。

【免费下载链接】datahubThe Context Platform for your Data and AI Stack项目地址: https://gitcode.com/GitHub_Trending/da/datahub

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询