跳到主要内容
版本:4.x

REST Catalog 用户身份访问

传统的 Iceberg REST Catalog 配置通常使用固定的客户端凭证。所有用户通过 Doris 访问数据湖时,REST Catalog 看到的都是同一个服务账号,难以在 Catalog 侧实施用户级授权和审计。

用户身份访问模式会将 OIDC 登录后的 access token 保存在 Doris 会话中,并在访问 REST Catalog 时继续传递该 token。REST Catalog 可以识别真实用户,根据用户或用户组进行授权,并为数据访问下发短期凭证。

版本支持

该功能自 SelectDB Enterprise 4.1.4 起支持。

工作原理​

用户身份访问涉及三层组件:

  1. IdP 为用户签发面向 Doris 和 REST Catalog 的 access token。
  2. Doris 验证 token、建立用户会话,并控制用户是否可以使用目标 Catalog。
  3. REST Catalog 根据 Doris 传递的用户 token 判断用户能否访问 namespace、表或视图,并按需下发短期存储凭证。
OIDC access token
|
v
Doris 用户会话
|
v
Iceberg REST Catalog
|
v
Catalog 授权和临时存储凭证

Doris 权限与 REST Catalog 权限共同生效:

DorisREST Catalog访问结果
允许允许成功
拒绝允许失败
允许拒绝失败
拒绝拒绝失败

因此,Doris 可以只管理 Catalog 入口权限,外部数据湖对象的细粒度权限由 REST Catalog 统一管理。

前提条件​

  • 已配置 OIDC 认证,用户可以使用 access token 登录 Doris。
  • Doris FE 和 BE 使用相同的 SelectDB Enterprise 版本。
  • REST Catalog 支持 OAuth 2.0 用户身份认证,并能将 token 中的用户 claim 映射到 Catalog principal。
  • REST Catalog 已为用户或用户组配置 namespace、表和视图权限。
  • 如需由 Catalog 下发对象存储凭证,REST Catalog 需要支持 credential vending。
注意

生产环境中,IdP、Doris 和 REST Catalog 之间的通信都应使用 TLS。不要在 Catalog 属性中配置用于业务查询的长期高权限凭证。

配置步骤​

以下示例使用两个用户说明权限隔离:

  • oidc_alice:REST Catalog 中的 Finance 用户,只能访问 finance namespace。
  • oidc_bob:REST Catalog 中的 Marketing 用户,只能访问 marketing namespace。

第一步:配置 REST Catalog 身份和权限​

在 REST Catalog 中创建与 OIDC 用户对应的 principal,并完成以下授权:

Principal角色可访问对象
oidc_alicefinance_readerfinance.finance_orders、finance.finance_budget
oidc_bobmarketing_readermarketing.campaign_spend、marketing.lead_score

具体操作取决于所使用的 REST Catalog。配置时需要确保:

  • principal 名称或映射规则与 token 中的用户 claim 一致。
  • 角色拥有列出目标 namespace 和表的权限。
  • 角色拥有读取表属性和表数据的权限。
  • 非目标 namespace 和表未被授予访问权限。

第二步:创建 OIDC 认证集成​

在 Doris 中创建 OIDC 认证集成:

CREATE AUTHENTICATION INTEGRATION corp_oidc
PROPERTIES (
'type' = 'oidc',
'enable_jit_user' = 'true',
'oidc.issuer' = 'https://idp.example.com/realms/doris',
'oidc.jwks_uri' = 'https://idp.example.com/realms/doris/protocol/openid-connect/certs',
'oidc.allowed_audiences' = 'doris',
'oidc.username_claim' = 'preferred_username',
'oidc.subject_claim' = 'sub',
'oidc.groups_claim' = 'doris_groups',
'oidc.allowed_algorithms' = 'RS256',
'oidc.required_scopes' = 'doris.query'
);

将该认证集成加入 FE 认证链:

authentication_chain = corp_oidc

修改 fe.conf 后重启 FE。

第三步:授予 Doris Catalog 入口权限​

创建一个通用角色,使通过 OIDC 登录的用户可以访问 lakehouse Catalog:

CREATE ROLE lakehouse_user;
GRANT SELECT_PRIV ON lakehouse.*.* TO ROLE lakehouse_user;

CREATE ROLE MAPPING corp_oidc_lakehouse_mapping
ON AUTHENTICATION INTEGRATION corp_oidc
RULE (
USING CEL 'has_scope("doris.query")'
GRANT ROLE lakehouse_user
);

该角色只表示用户可以进入 lakehouse Catalog,不区分 Finance 或 Marketing。外部表的最终访问范围由 REST Catalog 决定。

第四步:创建用户身份模式的 Catalog​

使用具有 Catalog 管理权限的用户执行:

CREATE CATALOG lakehouse PROPERTIES (
'type' = 'iceberg',
'iceberg.catalog.type' = 'rest',
'iceberg.rest.uri' = 'https://polaris.example.com/api/catalog',
'iceberg.rest.security.type' = 'oauth2',
'iceberg.rest.session' = 'user',
'iceberg.rest.session-timeout' = '0',
'iceberg.rest.oauth2.delegated-token-mode' = 'access_token',
'iceberg.rest.vended-credentials-enabled' = 'true',
'warehouse' = 'enterprise_lakehouse'
);

用户身份模式相关属性如下:

属性说明
iceberg.rest.session设置为 user,为不同 Doris 用户维护独立的 REST Catalog 会话。
iceberg.rest.session-timeoutREST Catalog 用户会话的复用时间。设置为 0 可减少会话复用,便于验证权限变更;生产环境应根据安全与性能要求设置。
iceberg.rest.oauth2.delegated-token-mode设置为 access_token,将当前 Doris 会话中的 access token 传递给 REST Catalog。
iceberg.rest.vended-credentials-enabled是否使用 REST Catalog 下发的短期对象存储凭证。

不要同时配置供所有业务用户共享的 iceberg.rest.oauth2.credential。否则 REST Catalog 可能只能识别固定服务账号,无法根据当前用户执行授权。

验证用户权限隔离​

验证 Finance 用户​

将 oidc_alice 的 access token 保存到本地文件,并使用 MySQL Shell 9 登录:

mysqlsh --sql --sqlc --ssl-mode=REQUIRED \
-h <fe_host> -P 9030 -u oidc_alice \
--authentication-openid-connect-client-id-token-file=/path/to/oidc_alice.access_token

执行:

SWITCH lakehouse;
SHOW DATABASES;

USE finance;
SHOW TABLES;

预期 oidc_alice 可以看到 finance namespace 及其中已授权的表。访问 marketing namespace 时,REST Catalog 应拒绝请求或过滤未授权对象。

验证 Marketing 用户​

使用 oidc_bob 的 access token 登录:

mysqlsh --sql --sqlc --ssl-mode=REQUIRED \
-h <fe_host> -P 9030 -u oidc_bob \
--authentication-openid-connect-client-id-token-file=/path/to/oidc_bob.access_token

执行:

SWITCH lakehouse;
SHOW DATABASES;

USE marketing;
SHOW TABLES;

预期 oidc_bob 只能看到 marketing namespace 及其中已授权的表。

如果两个用户看到相同的数据范围,请检查:

  • Catalog 是否配置了 iceberg.rest.session = user。
  • Catalog 是否仍在使用固定的 OAuth 2.0 credential。
  • REST Catalog 是否正确识别 token 中的用户 principal。
  • REST Catalog 的角色和对象权限是否正确绑定。
  • Doris 本地角色是否允许用户进入目标 Catalog。

处理角色和组织变更​

当用户的业务角色发生变化时,优先在 REST Catalog 的统一权限模型中调整授权。例如,将 oidc_bob 从 marketing_reader 调整为 finance_reader 后,不需要修改 Doris Catalog,也不需要在 Doris 中复制每张外部表的权限。

权限变更的生效时间取决于变更位置:

  • REST Catalog 中的角色或对象授权发生变化时,后续 Catalog 请求会按新权限进行判断。已复用的 Catalog 会话可能受 iceberg.rest.session-timeout 影响。
  • IdP 中的用户组、部门或 scope 等 claim 发生变化时,需要刷新 access token 或重新登录,Doris 和 REST Catalog 才能读取新的 claim。

生产环境应根据安全和性能要求设置 token 有效期与 REST Catalog 会话超时时间。

安全建议​

  • 为 Doris 配置专用 audience,并通过 oidc.allowed_audiences 严格校验。
  • 限制允许的客户端 ID、scope 和 JWT 签名算法。
  • 使用短生命周期 access token,并建立可靠的刷新和撤销机制。
  • 使用 credential vending 为每次数据访问下发短期、最小权限的存储凭证。
  • 分别保留 Doris 和 REST Catalog 审计日志,以便还原完整访问链路。
  • Doris 中仅授予用户必要的 Catalog 入口权限;namespace、表和视图权限在统一的 REST Catalog 中管理。

相关文档​