本文旨在闡述如何為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使用者,並為其授予必要的許可權。
EMR Serverless Spark許可權:為RAM使用者授予訪問EMR Serverless Spark的基本操作許可權,詳情請參見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。
[root@master-1-1(xxx) ~]# beeline -u "jdbc:hive2://kyuubi-cn-hangzhou-internal.spark.emr.aliyuncs.com:80;transportMode=http;user=emr_test;httpPath=cliservice/token/j2xxx" xxx SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/opt/apps/HIVE/hive-3.1.3-hadoop3.1-1.0.9/lib/log4j-slf4j-impl-2.17.2.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/opt/apps/HADOOP-COMMON/hadoop-3.2.1-1.3.5-alinux3/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation. SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory] Connecting to jdbc:hive2://kyuubi-cn-hangzhou-internal.spark.emr.aliyuncs.com:80;transportMode=http;user=emr_test;httpPath=cliservice/token/j2xxx Connected to: Spark SQL (version 3.5.2-emr) Driver: Hive JDBC (version 3.1.3) Transaction isolation: TRANSACTION_REPEATABLE_READ Beeline version 3.1.3 by Apache Hive 0: jdbc:hive2://kyuubi-cn-hangzhou-internal.s>驗證許可權控制效果。
查詢已授權的表:
SELECT * FROM <database_name>.<authorized_table_name> LIMIT 10;成功返回查詢資料。成功執行查詢後,返回如下結果:
2025-10-24 16:55:45.008 INFO nioEventLoopGroup-7-1 org. nnelInactive! +-----+----------+ | id | name | +-----+----------+ | 1 | Alice | | 2 | Bob | | 3 | Charlie | +-----+----------+ 3 rows selected (5.079 seconds)查詢未授權的表:
SELECT * FROM <database_name>.<unauthorized_table_name> LIMIT 10;查詢失敗,並收到許可權相關的錯誤提示,例如
emr_test doesn't have privilege SELECT on TABLE。執行未授權表的查詢後,返回如下許可權異常資訊:Caused by: org.apache.paimon.rest.exceptions.ForbiddenException: Forbidden: User acs:ram::xxx:user/emr_test doesn't have privilege SELECT on TABLE default.paimon_tbl requestId:xxx at org.apache.paimon.rest.DefaultErrorHandler.accept(DefaultErrorHandler.java:59) at org.apache.paimon.rest.DefaultErrorHandler.accept(DefaultErrorHandler.java:35) at org.apache.paimon.rest.HttpClient.exec(HttpClient.java:156) at org.apache.paimon.rest.HttpClient.get(HttpClient.java:69) at org.apache.paimon.rest.RESTApi.getTable(RESTApi.java:465)
常見問題
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 許可權。
Q4:如何在DataWorks中通過Kyuubi Token實現EMR Serverless對DLF資料的許可權管控?
在使用DataWorks Serverless Kyuubi節點提交任務時,DataWorks將自動在JDBC串連中傳入計算資源中設定的預設訪問身份。關於在DataWorks中綁定Serverless Spark計算資源與Kyuubi的配置操作,請參見綁定EMR Serverless Spark計算資源。有關Serverless Kyuubi節點的使用詳情,請參見Serverless Kyuubi節點。
附錄:身份代理與許可權執行流程
本方案的核心是利用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使用者配置的權限原則,對請求進行鑒權並返回結果。