本文旨在阐述如何为EMR Serverless Spark的Kyuubi Gateway配置基于Token的身份认证。该方案通过与RAM用户绑定的Token,实现了对数据湖构建(DLF)中Paimon Catalog数据的精细化访问控制。最终效果为,不同客户端可通过各自的身份凭证访问同一Kyuubi网关,但仅限于查询其被授权的数据。
业务场景
在企业级数据分析平台中,多个用户或应用需要通过统一的SQL网关(如Kyuubi Gateway)访问数据。为保障数据安全,必须隔离不同身份的访问,确保每个用户只能访问其权限范围内的数据。例如,分析师A只能查询业务报表,而数据工程师B可以访问底层的原始数据集。此方案解决多租户环境下的数据权限隔离问题,实现端到端的身份认证与权限管控。
实施步骤
步骤一:准备环境与RAM用户权限
准备基础资源。
已创建工作空间,详情请参见管理工作空间。
已在上述工作空间中创建并启动一个Kyuubi Gateway,详情请参见管理Kyuubi Gateway。
已在DLF中创建数据目录,并准备相应数据库和表。
配置RAM用户及权限。 准备一个RAM用户,并为其授予必要的权限。
步骤二:在DLF中为RAM用户授予表权限
在DLF中为RAM用户授予对特定表的访问权限。为保证Kyuubi Gateway能够成功初始化Spark会话,还必须为该RAM用户授予对DLF中default数据库的Describe权限。
登录数据湖构建控制台。
导航至目标Catalog下的数据库和表。
选中需要授权的表,进入权限页签。
单击授权:
用户/角色:选择RAM 用户/RAM 角色。
选择授权对象:选择目标RAM用户。
权限:选择相应的权限。

单击确定,授权完成。
说明EMR Serverless Spark默认启用对DLF元数据和数据的缓存功能。如果对某张表进行重新授权,默认情况下需要等待10分钟才能生效。
若希望修改权限后立即生效,可以在Kyuubi Gateway中的Spark配置中添加
spark.sql.catalog.lakehouse.cache-enabled false配置。
步骤三:为RAM用户生成Kyuubi Token。
在Kyuubi Gateway页面,单击目标Gateway操作列的Token管理。
单击创建Token。在对话框中,配置以下信息,单击确定。
参数
说明
名称
新建Token的名称。
过期时间
设置该Token的过期时间。设置的天数应大于或等于1。默认情况下为开启状态,365天后过期。
分配对象
在下拉框中,选择目标RAM用户。
复制Token信息。
重要Token创建完成后,请务必立即复制新Token的信息,后续不支持查看。如果您的Token过期或遗失,请选择新建Token或重置Token。
步骤四:使用Beeline连接并验证权限
构建JDBC连接命令。
beeline -u "jdbc:hive2://<endpoint>:<port>/;transportMode=http;user=<UserName或RoleName>;httpPath=cliservice/token/<Token>"参数说明:
参数
说明
<endpoint>Kyuubi Gateway的Endpoint。
<port>访问端口。外网Endpoint对应端口为
443,内网Endpoint对应端口为80。<UserName或RoleName>RAM用户或者RAM角色。支持简写或全称,例如:
RAM用户:
agent或agent@xxxx05398154xxxx.onaliyun.comRAM角色:
AliyunServiceRoleForDataworksEngine
<Token>在步骤二中为该RAM用户生成的Token。

验证权限控制效果。
查询已授权的表:
SELECT * FROM <database_name>.<authorized_table_name> LIMIT 10;成功返回查询数据。

查询未授权的表:
SELECT * FROM <database_name>.<unauthorized_table_name> LIMIT 10;查询失败,并收到权限相关的错误提示,例如
emr_test doesn't have privilege SELECT on TABLE。
常见问题
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的查询流程中。

工作流程说明如下:
令牌生成:为指定的RAM用户在Kyuubi Gateway中生成一个有时效性的令牌。此令牌与该RAM用户的身份唯一绑定。
客户端认证:客户端(例如Beeline)在构建JDBC连接时,携带此Token及对应的RAM用户名,向Kyuubi Gateway发起连接请求。
身份代理:Kyuubi Gateway验证Token的有效性。在Spark SQL查询中,EMR Serverless Spark引擎将代理(Impersonate)该RAM用户的身份。
DLF鉴权:当Spark引擎访问DLF中的元数据或数据时,会以代理的RAM用户身份向DLF发起请求。
权限执行:DLF根据为该RAM用户配置的权限策略,对请求进行鉴权并返回结果。