全部產品
Search
文件中心

E-MapReduce:通過Kyuubi Token實現EMR Serverless Spark對DLF資料的許可權管控

更新時間:Jun 09, 2026

本文旨在闡述如何為EMR Serverless Spark的Kyuubi Gateway配置基於Token的身份認證。該方案通過與RAM使用者綁定的Token,實現了對資料湖構建(DLF)中Paimon Catalog資料的精細化存取控制。最終效果為,不同用戶端可通過各自的身份憑證訪問同一Kyuubi網關,但僅限於查詢其被授權的資料。

業務情境

在企業級資料分析平台中,多個使用者或應用需要通過統一的SQL網關(如Kyuubi Gateway)訪問資料。為保障資料安全,必須隔離不同身份的訪問,確保每個使用者只能訪問其許可權範圍內的資料。例如,分析師A只能查詢業務報表,而資料工程師B可以訪問底層的未經處理資料集。此方案解決多租戶環境下的資料許可權隔離問題,實現端到端的身份認證與許可權管控。

實施步驟

步驟一:準備環境與RAM使用者權限

  1. 準備基礎資源

  2. 配置RAM使用者及許可權。 準備一個RAM使用者,並為其授予必要的許可權。

    • EMR Serverless Spark許可權:為RAM使用者授予訪問EMR Serverless Spark的基本操作許可權,詳情請參見RAM使用者授權

    • 工作空間許可權:為RAM使用者加入工作空間並按照職能為該使用者指派空間角色,詳情請參見系統管理使用者和角色

步驟二:在DLF中為RAM使用者授予表許可權

在DLF中為RAM使用者授予對特定表的存取權限。為保證Kyuubi Gateway能夠成功初始化Spark會話,還必須為該RAM使用者授予對DLF中default資料庫的Describe許可權。

  1. 登入

  2. 導航至目標Catalog下的資料庫和表。

  3. 選中需要授權的表,進入权限頁簽。

  4. 單擊授权

    1. 用户/角色:選擇RAM 用户/RAM 角色

    2. 选择授权对象:選擇目標RAM使用者。

    3. 权限:選擇相應的許可權。

  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=<UserName或RoleName>;httpPath=cliservice/token/<Token>"

    參數說明

    參數

    說明

    <endpoint>

    Kyuubi Gateway的Endpoint。

    <port>

    訪問連接埠。外網Endpoint對應連接埠為443,內網Endpoint對應連接埠為80

    <UserName或RoleName>

    RAM使用者或者RAM角色。支援簡寫或全稱,例如:

    • RAM使用者:agent 或 agent@xxxx05398154xxxx.onaliyun.com

    • RAM角色: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>
  2. 驗證許可權控制效果。

    • 查詢已授權的表

      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的查詢流程中。

工作流程說明如下:

  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使用者配置的權限原則,對請求進行鑒權並返回結果。