通过Kyuubi Token实现EMR Serverless Spark对DLF数据的权限管控

本文旨在阐述如何为EMR Serverless SparkKyuubi Gateway配置基于Token的身份认证。该方案通过与RAM用户绑定的Token,实现了对数据湖构建(DLF)中Paimon Catalog数据的精细化访问控制。最终效果为,不同客户端可通过各自的身份凭证访问同一Kyuubi网关,但仅限于查询其被授权的数据。

业务场景

在企业级数据分析平台中,多个用户或应用需要通过统一的SQL网关(如Kyuubi Gateway)访问数据。为保障数据安全,必须隔离不同身份的访问,确保每个用户只能访问其权限范围内的数据。例如,分析师A只能查询业务报表,而数据工程师B可以访问底层的原始数据集。此方案解决多租户环境下的数据权限隔离问题,实现端到端的身份认证与权限管控。

image

实施步骤

步骤一:准备环境与RAM用户权限

  1. 准备基础资源

  2. 配置RAM用户及权限。 准备一个RAM用户,并为其授予必要的权限。

    • EMR Serverless Spark权限:为RAM用户授予访问EMR Serverless Spark的基本操作权限,详情请参见RAM用户授权

    • 工作空间权限:为RAM用户加入工作空间并按照职能为该用户分配空间角色,详情请参见管理用户和角色

步骤二:在DLF中为RAM用户授予表权限

DLF中为RAM用户授予对特定表的访问权限。为保证Kyuubi Gateway能够成功初始化Spark会话,还必须为该RAM用户授予对DLFdefault数据库的Describe权限。

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

  2. 导航至目标Catalog下的数据库和表。

  3. 选中需要授权的表,进入权限页签。

  4. 单击授权

    1. 用户/角色:选择RAM 用户/RAM 角色

    2. 选择授权对象:选择目标RAM用户。

    3. 权限:选择相应的权限。image

  5. 单击确定,授权完成。

    说明

    EMR Serverless Spark默认启用对DLF元数据和数据的缓存功能。如果对某张表进行重新授权,默认情况下需要等待10分钟才能生效。

    若希望修改权限后立即生效,可以在Kyuubi Gateway中的Spark配置中添加spark.sql.catalog.lakehouse.cache-enabled false配置。

步骤三:为RAM用户生成Kyuubi Token。

  1. Kyuubi Gateway页面,单击目标Gateway操作列的Token管理

  2. 单击创建Token。在对话框中,配置以下信息,单击确定

    参数

    说明

    名称

    新建Token的名称。

    过期时间

    设置该Token的过期时间。设置的天数应大于或等于1。默认情况下为开启状态,365天后过期。

    分配对象

    在下拉框中,选择目标RAM用户。

  3. 复制Token信息。

    重要

    Token创建完成后,请务必立即复制新Token的信息,后续不支持查看。如果您的Token过期或遗失,请选择新建Token或重置Token。

步骤四:使用Beeline连接并验证权限

  1. 构建JDBC连接命令。

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

    参数说明

    参数

    说明

    <endpoint>

    Kyuubi GatewayEndpoint。

    <port>

    访问端口。外网Endpoint对应端口为443,内网Endpoint对应端口为80

    <UserNameRoleName>

    RAM用户或者RAM角色。支持简写或全称,例如:

    • RAM用户:agent 或 agent@xxxx05398154xxxx.onaliyun.com

    • RAM角色:AliyunServiceRoleForDataworksEngine

    <Token>

    在步骤二中为该RAM用户生成的Token。

    image

  2. 验证权限控制效果。

    • 查询已授权的表

      SELECT * FROM <database_name>.<authorized_table_name> LIMIT 10;

      成功返回查询数据。image

    • 查询未授权的表

      SELECT * FROM <database_name>.<unauthorized_table_name> LIMIT 10;

      查询失败,并收到权限相关的错误提示,例如 emr_test doesn't have privilege SELECT on TABLEimage

常见问题

Q1: 授权后查询未授权表仍能返回结果,是否权限未生效?
可能原因如下:

  • DLF元数据缓存:Spark 引擎内部缓存了表结构信息,导致鉴权绕过。
    解决方法:在 Spark 配置中添加 spark.sql.catalog.lakehouse.cache-enabled false,禁用元数据缓存。

  • 权限延迟:极少数情况下 DLF 权限同步存在短暂延迟(通常不超过 10 秒)。
    建议:等待片刻后重试,或通过 DLF 控制台确认权限已正确绑定。

Q2: Token 创建后无法查看,丢失了怎么办?
Token 明文仅在创建成功后的弹窗中显示一次,系统不存储原始值。若 Token 丢失或泄露,应立即采取以下措施:

  • 在“Token管理”页面选择对应条目,点击 重置 Token

  • 旧 Token 将被自动失效,生成新的凭证。

  • 使用新 Token 更新所有客户端配置。

Q3: 为什么连接 Kyuubi Gateway 时必须为 RAM 用户授予 default 数据库的 Describe 权限?
Kyuubi Gateway 在建立 Spark 会话时,默认尝试加载 default 数据库作为初始上下文。若当前身份无权访问该数据库,会话初始化将失败并中断连接。即使业务表位于其他数据库,此检查仍不可跳过。因此,所有需连接网关的 RAM 用户都必须预先获得对 default 数据库的 DescribeDatabase 权限。

附录:身份代理与权限执行流程

本方案的核心是利用Kyuubi Gateway的令牌(Token)作为身份凭证,将访问请求代理为Token所有者(RAM用户)的身份,从而把数据湖构建(DLF)的权限体系集成到EMR Serverless Spark的查询流程中。

image

工作流程说明如下:

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

  2. 客户端认证:客户端(例如Beeline)在构建JDBC连接时,携带此Token及对应的RAM用户名,向Kyuubi Gateway发起连接请求。

  3. 身份代理:Kyuubi Gateway验证Token的有效性。在Spark SQL查询中,EMR Serverless Spark引擎将代理(Impersonate)该RAM用户的身份。

  4. DLF鉴权:当Spark引擎访问DLF中的元数据或数据时,会以代理的RAM用户身份向DLF发起请求。

  5. 权限执行:DLF根据为该RAM用户配置的权限策略,对请求进行鉴权并返回结果。