计算引擎访问DLF如何实现精细化访问控制

更新时间:
复制为 MD 格式

本文介绍如何在阿里云各计算引擎(Serverless StarRocks、Serverless Spark、实时计算 Flink 版等)中,结合数据湖构建(DLF)的数据权限体系,实现端到端的精细化访问控制。

使用场景

根据您使用的计算引擎,直接跳转到对应的配置指南:

场景

支持的访问协议

适用场景

实时计算 Flink 版访问 DLF

Paimon/Iceberg REST

流式数据处理、实时 ETL

Serverless StarRocks 访问 DLF

Paimon/Iceberg REST

交互式分析、即席查询

Serverless Spark 访问 DLF(Paimon/Iceberg)

Paimon/Iceberg REST

批处理、ETL、交互式分析

Serverless Spark 访问 DLF(文件访问 / PVFS)

PVFS

非结构化数据处理

EMR on ECS Spark 访问 DLF

Paimon/Iceberg REST

自建集群批处理、ETL

前提条件

在开始配置权限之前,请确保满足以下条件:

  • 已开通 DLF 服务,并创建了 DLF Catalog。详情请参见授权并开通DLF

  • 已创建对应的计算引擎实例(StarRocks 实例、Spark 工作空间、Flink 工作空间等)。

  • 计算引擎与 DLF 位于同一地域,且引擎所在 VPC 已添加至 DLF 可信 VPC 列表。详情请参见可信VPC配置

实时计算 Flink 版访问 DLF

适用场景

使用阿里云实时计算 Flink 版,通过 Flink SQL 以 Paimon REST 或 Iceberg REST 协议访问 DLF Catalog 中的数据,适用于流式数据处理、实时 ETL、Flink CDC 数据入湖等场景。

使用限制

  • Paimon REST:实时计算引擎 VVR 11.1及以上版本。

  • Iceberg REST:实时计算引擎 VVR 11.2及以上版本。

  • 网络:Flink 工作空间与 DLF 位于同一地域,且 Flink 所在 VPC 已添加至 DLF 可信 VPC 列表。

权限配置流程

Flink 访问 DLF 时,通过服务角色 AliyunStreamAsiDefaultRole 代理用户身份进行 DLF 鉴权。

  1. 使用阿里云账号或 RAM 管理员登录 RAM 控制台

  2. 单击身份管理 > 角色,查询 AliyunStreamAsiDefaultRole 角色。

  3. 单击操作列的新增授权,查询并勾选 AliyunDLFFullAccess,单击确认新增授权

说明

如果创建 Catalog 时遇到 ForbiddenException: You are not authorized to do this operation. Action: dlf:GetConfig 错误,说明该角色缺少 DLF 权限,需按上述步骤授权。

步骤二:在 DLF 中授予数据权限

  1. 登录数据湖构建控制台

  2. 进入目标 Catalog,切换到权限页签,单击授权

  3. 选择 RAM 用户/RAM 角色,在下拉列表中选择 AliyunStreamAsiDefaultRole

  4. 根据需求授予相应的数据权限(如 Data Reader、Data Editor 或自定义权限)。

说明

阿里云主账户默认拥有数据权限。如需精细化权限控制,请使用RAM用户。

  1. 在左侧导航栏中,单击系统和安全 > 系统安全 > 新增 VPC ID

  2. 在弹出的对话框中,选择一个或多个需要设为可信的 VPC,然后单击确定

详情请参见可信VPC配置

方式一:通过 UI 创建

  1. 登录 实时计算控制台,进入目标工作空间。

  2. 在左侧导航栏,单击数据管理

  3. 在 Catalog 列表页,单击创建 Catalog,选择对应的类型。

方式二:通过 SQL 创建

数据查询文本编辑区域,输入以下 SQL 并执行:

Paimon REST

CREATE CATALOG `flink_catalog_name`
WITH (
  'type' = 'paimon',
  'metastore' = 'rest',
  'token.provider' = 'dlf',
  'uri' = 'http://cn-hangzhou-vpc.dlf.aliyuncs.com',
  'warehouse' = 'dlf_test'
);

参数

说明

是否必填

示例

type

Catalog 类型,固定为 paimon

paimon

metastore

metastore 类型,固定为 rest

rest

token.provider

Token 提供方,固定为 dlf

dlf

uri

访问 DLF REST Catalog Server 的 URI,格式为 http://[region-id]-vpc.dlf.aliyuncs.com。详见服务接入点

http://cn-hangzhou-vpc.dlf.aliyuncs.com

warehouse

DLF Catalog 名称。

dlf_test

更多使用方式,详情请参见Flink CDC访问DLFFlink DataStream访问DLF

Iceberg REST

CREATE CATALOG `flink_catalog_name`
WITH (
  'type' = 'iceberg',
  'catalog-type' = 'rest',
  'uri' = 'http://cn-hangzhou-vpc.dlf.aliyuncs.com/iceberg',
  'warehouse' = 'iceberg_test',
  'rest.signing-region' = 'cn-hangzhou',
  'io-impl' = 'org.apache.iceberg.rest.DlfFileIO'
);

参数

说明

是否必填

示例

type

Catalog 类型,固定为 iceberg

iceberg

catalog-type

Catalog 实现类型,固定为 rest

rest

uri

访问 DLF REST Catalog Server 的 URI,格式为 http://[region-id]-vpc.dlf.aliyuncs.com/iceberg(注意带 /iceberg 后缀)。详见 服务接入点

http://cn-hangzhou-vpc.dlf.aliyuncs.com/iceberg

warehouse

DLF Catalog 名称。

iceberg_test

rest.signing-region

DLF 所在地域的 Region ID。

cn-hangzhou

io-impl

IO 实现类,固定为 org.apache.iceberg.rest.DlfFileIO

org.apache.iceberg.rest.DlfFileI

Serverless StarRocks 访问 DLF

适用场景

使用 Serverless StarRocks 作为查询引擎,通过访问 DLF Catalog 中的数据,实现交互式分析。

使用限制

  • Serverless StarRocks 3.3.8 及以上版本。

  • Serverless StarRocks 服务与 DLF 位于同一 VPC 下。

权限配置流程

访问 DLF 数据需要配置以下三个层面的权限:

  1. RAM 权限 — 为 RAM 用户授予 EMR 控制台权限和 DLF API 权限

  2. DLF 数据权限 — 控制 RAM 用户能访问 DLF 中的哪些数据

  3. StarRocks 用户映射 — 在 StarRocks 中创建 RAM 同名用户,并授予 External Catalog 的 USAGE 权限

其核心机制是通过 RAM 用户名映射将 StarRocks 用户与 DLF 权限关联。

步骤一:为 RAM 用户授予控制台权限

  1. 使用阿里云账号或 RAM 管理员登录 RAM 控制台

  2. 创建一个新的 RAM 用户或选择已有 RAM 用户。

    注意:该 RAM 用户的名称需符合 StarRocks 的用户命名规则,即只包含字母、数字、下划线,不能包含短横线、句号
  3. 为该 RAM 用户添加以下权限策略:

    • EMR 控制台权限:添加 AliyunEMRStarRocksFullAccess(管理员)或 AliyunEMRStarRocksReadOnlyAccess(只读),使其可以访问 EMR StarRocks 控制台。

    • DLF API 权限:添加 AliyunDLFFullAccess 或自定义的 DLF 权限策略,使其可以调用 DLF 接口。

详情请参见EMR Serverless StarRocksRAM用户授权

步骤二:在 DLF 中授予数据权限

  1. 登录数据湖构建控制台

  2. 进入目标 Catalog,切换到权限页签,单击授权

  3. 选择上一步的 RAM 用户,根据需求授予相应的数据权限(如 Data Reader、Data Editor 或自定义权限)。

步骤三:在 StarRocks 中创建 RAM 同名用户

  1. 登录 EMR Serverless StarRocks 控制台,连接 StarRocks 实例。

  2. 在 安全中心 > 用户管理 中,单击添加用户

    • 用户来源:选择 RAM 用户

    • 用户名:选择步骤一中授权的 RAM 用户。

    • 密码:自定义(长度 8~30 个字符,须同时包含大写字母、小写字母、数字及特殊符号)。

    • 角色:默认 public 即可。

  3. 为该用户授予 External Catalog 的 USAGE 权限。在用户管理页面,单击目标用户操作列的授权,在添加权限面板中选择数据目录(外部),授予 USAGE 权限。

说明

DLF 对 StarRocks 来说是 External Catalog(外表),StarRocks 内部 RBAC 的其他权限(如 SELECTINSERT 等)仅控制内表,不影响 DLF 外表的数据访问。DLF 外表的数据读写权限完全由步骤二中配置的 DLF 数据权限决定。

详情请参见Serverless StarRocks用户管理

步骤四:创建 External Catalog 连接 DLF

使用该 RAM 用户登录 StarRocks Manager,执行以下 SQL 创建 External Catalog:

Paimon

CREATE EXTERNAL CATALOG `paimon_catalog`
PROPERTIES (
  'type' = 'paimon',
  'uri' = 'http://cn-hangzhou-vpc.dlf.aliyuncs.com',
  'paimon.catalog.type' = 'rest',
  'paimon.catalog.warehouse' = 'my_catalog',
  'token.provider' = 'dlf'
 );

参数

说明

示例

type

StarRocks 的 Catalog 类型,固定值 paimon

paimon

uri

访问DLF Rest CatalogURI,详见Paimon REST

http://cn-hangzhou-vpc.dlf.aliyuncs.com

paimon.catalog.type

Paimon 的 Catalog 类型,固定值 rest

rest

paimon.catalog.warehouse

DLF 中的 Catalog 名称

my_catalog

token.provider

REST 服务提供者,固定填 dlf

dlf

Iceberg

CREATE EXTERNAL CATALOG iceberg_catalog
PROPERTIES ( 
    'type' = 'iceberg',
    'uri' = 'http://cn-hangzhou-vpc.dlf.aliyuncs.com/iceberg',
    'iceberg.catalog.type' = 'dlf_rest',
    'warehouse' = 'iceberg_test',
    'rest.signing-region' = 'cn-hangzhou'
);

参数

说明

示例

type

StarRocksCatalog类型,固定值 iceberg

iceberg

uri

访问DLF Rest CatalogURI,详见Iceberg REST

http://cn-hangzhou-vpc.dlf.aliyuncs.com/iceberg

iceberg.catalog.type

DLF场景填写固定值dlf_rest

dlf_rest

warehouse

DLF Catalog名称。

iceberg_test

rest.signing-region

DLF服务的Region ID。

cn-hangzhou

说明

Iceberg REST 当前仅支持只读查询,无法通过 StarRocks 写入数据。如需读写能力,请使用 Paimon REST。

Serverless Spark 访问 DLF

适用场景

使用 Serverless Spark 进行批处理、ETL 或交互式分析,通过 Paimon/Iceberg REST 协议访问 DLF Catalog 中的数据。

使用限制

  • Paimon:Serverless Spark 版本 esr-4.3.0、esr-3.3.0、esr-2.7.0 及以上。

  • Iceberg:Serverless Spark 版本 esr-4.7.0、esr-3.6.0 及以上。

权限配置流程

访问 DLF 数据需要配置以下两个层面的权限:

  1. RAM 权限 — 为 RAM 用户授予 EMR 控制台权限和 DLF API 权限

  2. DLF 数据权限 — 控制 RAM 用户能访问 DLF 中的哪些数据

Spark 访问 DLF 时,通过执行角色(AliyunEMRSparkJobRunDefaultRole)代理提交任务的 RAM 用户身份进行 DLF 鉴权。

说明

Spark 工作空间角色(Guest、DataScience、DataEngineering、Owner)控制的是 EMR 控制台操作(如创建工作流、管理队列),不影响 DLF 数据访问。工作空间角色的配置请参见 管理用户和角色

步骤一:为 RAM 用户授予控制台权限

  1. 使用阿里云账号或 RAM 管理员登录 RAM 控制台

  2. 为 RAM 用户添加以下权限策略:

    • EMR 控制台权限:添加 AliyunEMRServerlessSparkFullAccess(管理员)、AliyunEMRServerlessSparkDeveloperAccess(开发者)或 AliyunEMRServerlessSparkReadOnlyAccess(只读)。

    • DLF API 权限:添加 AliyunDLFFullAccess 或自定义的 DLF 权限策略。

详情请参见 RAM用户授权

步骤二:在 DLF 中授予数据权限

  1. 登录数据湖构建控制台

  2. 进入目标 Catalog,为 RAM 用户或工作空间关联的 RAM 角色授予相应的数据权限(如 Data Reader、Data Editor 或自定义权限)。

步骤三:绑定 DLF Catalog 到 Spark 工作空间

方式一:新建工作空间时绑定

创建 Serverless Spark 工作空间时,开启 DLF 作为元数据服务,并选择目标 DLF Catalog。

方式二:在已有工作空间中绑定

进入 Serverless Spark 工作空间的数据目录页面,添加目标 DLF Catalog。详情请参见管理数据目录

绑定 DLF Catalog 后,Livy Gateway 和 Kyuubi Gateway 原生支持其默认数据目录。

多租户场景:通过 Kyuubi Token 实现用户级 DLF 权限隔离

在默认配置下,Serverless Spark 工作空间中的所有用户共享同一个 RAM 身份访问 DLF 数据。如果需要实现不同用户访问不同数据的多租户权限隔离,可以通过 Kyuubi Gateway 的 Token 机制实现。

工作原理

  1. 令牌生成:为指定的 RAM 用户在 Kyuubi Gateway 中生成一个有时效性的 Token,该 Token 与 RAM 用户身份唯一绑定。

  2. 客户端认证:客户端(如 Beeline)在 JDBC 连接中携带 Token 和 RAM 用户名,向 Kyuubi Gateway 发起连接。

  3. 身份代理:Kyuubi Gateway 验证 Token 后,Spark 引擎将代理(Impersonate)该 RAM 用户的身份。

  4. DLF 鉴权:Spark 引擎以代理的 RAM 用户身份向 DLF 发起请求,DLF 根据该用户的权限策略进行鉴权。

配置步骤

  1. 为每个需要独立权限的 RAM 用户在 DLF 中授予对应的表级/列级数据权限。

  2. 在 Kyuubi Gateway 的 Token 管理页面,为每个 RAM 用户创建 Token。

  3. 客户端使用对应的 Token 连接 Kyuubi Gateway:

beeline -u "jdbc:hive2://<endpoint>:<port>/;transportMode=http;user=<RAM用户名>;httpPath=cliservice/token/<Token>"

验证权限隔离效果

  • 查询已授权的表:SELECT * FROM db.authorized_table LIMIT 10; — 成功返回数据。

  • 查询未授权的表:SELECT * FROM db.unauthorized_table LIMIT 10; — 返回权限错误,如 emr_test doesn't have privilege SELECT on TABLE

重要
  • EMR Serverless Spark 默认启用 DLF 元数据缓存,重新授权后默认需等待 10 分钟生效。如需立即生效,可在 Spark 配置中添加 spark.sql.catalog.lakehouse.cache-enabled false

  • 所有连接 Kyuubi Gateway 的 RAM 用户都必须预先获得对 default 数据库的 Describe 权限,否则会话初始化将失败。

详情请参见 通过Kyuubi TokenDLF数据的权限管控

Spark 中的 DLF 权限控制说明

在 Serverless Spark 中访问 DLF 数据时,DLF 会根据用户关联的 RAM 身份进行数据权限校验。DLF 数据权限支持以下操作类型:

DLF 数据权限

控制范围

说明

Select

表级别 / 列级别

控制对表数据的查询访问,支持列级别的精细化控制

Update

表级别

控制对表数据的写入操作(INSERT、INSERT OVERWRITE、MERGE INTO 等)

Alter

Catalog / 数据库 / 表级别

控制对元数据的修改操作(CREATE TABLE、ALTER TABLE 等)

Drop

Catalog / 数据库 / 表级别

控制对资源的删除操作

Grant

Catalog / 数据库 / 表级别

控制是否可以将权限授予其他用户

ALL

Catalog / 数据库 / 表级别

拥有以上所有权限

您可以使用 DLF 提供的预置权限模板快速授权:

  • Data Reader:只读权限,适合仅需查询数据的场景。

  • Data Editor:读写权限,适合需要读写数据的 ETL 场景。

Serverless Spark 访问 DLF(文件访问 / PVFS)

适用场景

使用 Serverless Spark 通过 Paimon 虚拟文件系统(PVFS)直接访问 DLF 管理的文件数据,适用于非结构化数据处理场景。

使用限制

Serverless Spark 版本 esr-3.5.0、esr-2.9.0、esr-4.6.0 及以上。

权限配置流程

与 Paimon REST 方式类似,绑定 DLF Catalog 后,通过 pvfs:// 协议访问文件。

步骤一至步骤三

与场景二相同,完成 RAM 权限配置、DLF 数据权限授予和 Catalog 绑定。

步骤四:通过 PVFS 访问文件

在 Notebook 或 PySpark 中使用 pvfs:// 路径访问 DLF 管理的文件:

df = spark.read.option("delimiter", ",").option("header", True) \
    .csv("pvfs://<catalog_name>/default/object_table/employee.csv")
df.show(5)

EMR on ECS Spark 访问 DLF

适用场景

使用 EMR on ECS 集群中的 Spark 引擎,通过 Paimon REST 协议访问 DLF Catalog。

版本要求

EMR 集群版本 >= 5.12.0,组件选择 Spark3 和 Paimon。

权限配置流程

EMR on ECS 场景下,权限通过 AliyunECSInstanceForEMRRole 这一 RAM 角色来传递。

步骤一:为 ECS 角色授予 RAM 权限

  1. 登录 RAM 控制台

  2. 查询 AliyunECSInstanceForEMRRole 角色。

  3. 为该角色添加 AliyunDLFFullAccess 权限策略。

步骤二:在 DLF 中为 ECS 角色授予数据权限

  1. 登录数据湖构建控制台

  2. 进入目标 Catalog 的权限页签,单击授权

  3. 选择 RAM 用户/RAM 角色,在下拉列表中选择 AliyunECSInstanceForEMRRole

  4. 选择预置权限类型(Data Reader / Data Editor)或自定义权限。

如果下拉列表中未找到 AliyunECSInstanceForEMRRole,可在用户管理页面单击同步

步骤三:依赖升级

需升级 Paimon 依赖到 1.1+ 版本,下载升级包及部署操作详情请参见

权限架构说明

当计算引擎访问 DLF 数据时,请求会依次经过以下四层权限校验:

权限层级

作用

配置位置

① RAM 权限

控制用户能否访问引擎控制台和调用 DLF API

RAM 控制台

② 引擎身份层

将引擎用户映射到 RAM 身份,用于 DLF 鉴权

各引擎控制台

③ DLF 数据权限

细粒度控制用户对 Catalog、数据库、表、列的访问权限

DLF控制台

④ 网络安全

通过可信 VPC 配置限制网络访问来源

DLF控制台

各引擎的身份映射方式:

  • StarRocks:通过创建 RAM 同名用户实现身份映射,每个用户独立鉴权。

  • Spark:通过执行角色(AliyunEMRSparkJobRunDefaultRole)代理提交者的 RAM 身份。多租户场景可通过 Kyuubi Token 实现用户级隔离。

  • Flink:通过服务角色(AliyunStreamAsiDefaultRole)统一代理。

DLF 数据权限说明

DLF 数据权限支持以下操作类型:

DLF 数据权限

控制范围

说明

Select

表级别 / 列级别

控制对表数据的查询访问,支持列级别的精细化控制

Update

表级别

控制对表数据的写入操作(INSERT、INSERT OVERWRITE、MERGE INTO 等)

Alter

Catalog / 数据库 / 表级别

控制对元数据的修改操作(CREATE TABLE、ALTER TABLE 等)

Drop

Catalog / 数据库 / 表级别

控制对资源的删除操作

Grant

Catalog / 数据库 / 表级别

控制是否可以将权限授予其他用户

ALL

Catalog / 数据库 / 表级别

拥有以上所有权限

您可以使用 DLF 提供的预置权限模板快速授权:

  • Data Reader:只读权限,适合仅需查询数据的场景。

  • Data Editor:读写权限,适合需要读写数据的 ETL 场景。

引擎内部权限与 DLF 权限的关系

  • StarRocks 内部 RBAC 权限(如 db_adminuser_admin 角色)仅控制 StarRocks 内表的操作权限。DLF 对 StarRocks 来说是 External Catalog(外表),其数据读写权限完全由 DLF 数据权限控制。用户只需拥有 External Catalog 的 USAGE 权限即可使用 DLF Catalog。

  • Spark 工作空间角色(如 Guest、DataEngineering、Owner)控制的是 EMR 控制台操作(如创建工作流、管理队列),不影响 DLF 数据访问

  • Flink 工作空间权限控制的是 Flink 控制台操作(如管理作业、部署),不影响 DLF 数据访问。Flink 访问 DLF 时的身份由服务角色决定。

注意事项和限制

  • 列级权限:仅内部 Paimon 表支持列级权限管理,需要引擎侧 Paimon 版本 1.2(1-ali-12.0)及以上。

  • 权限交集规则:如果某用户及其所属角色同时被授予 Column Select 权限,系统将取两者所授列权限的交集作为最终可访问的列范围。

  • External Catalog 映射:创建或删除 External Catalog 仅影响映射关系,不会对 DLF 中的实际数据产生影响。

  • StarRocks 与 DLF 权限分离:StarRocks 内部 RBAC 仅控制内表权限,DLF 外表的数据访问权限只能在数据湖构建控制台配置。StarRocks 用户只需拥有 External Catalog 的 USAGE 权限即可使用 DLF Catalog。

无权限问题排查

当遇到权限错误时,可根据错误信息判断类型:

错误类型

错误信息示例

解决方法

无 API 权限

You are not authorized to do this operation. Action: dlf:<action>.

联系 RAM 管理员为用户/角色添加对应的 DLF Action 权限

无 DLF 数据权限

User <principal> doesn't have privilege <access_type> on <resource_type> <resource_name>

联系 DLF super_administrator 或 admin 授予对应资源的数据权限

VPC 不可信

Source vpc vpc-xxxxxx is not trusted

在 DLF 控制台将 VPC 添加至可信列表

Flink 角色无权限

ForbiddenException: Forbidden: You are not authorized to do this operation. Action: dlf:GetConfig

为 AliyunStreamAsiDefaultRole 角色添加 AliyunDLFFullAccess 权限