すべてのプロダクト
Search
ドキュメントセンター

E-MapReduce:EMR Serverless Spark で Kyuubi トークンを使用して Data Lake Formation のデータアクセスを制御する

最終更新日:Jul 17, 2026

EMR Serverless Spark の Kyuubi ゲートウェイ向けに、トークンベースの認証を設定します。トークンを RAM ユーザーにバインドすることで、Data Lake Formation (DLF) の Paimon カタログデータに対して、きめ細かなアクセス制御を適用できます。これにより、各クライアントは認可されたデータのみをクエリできます。

ユースケース

企業のデータ分析では、複数のユーザーまたはアプリケーションが、Kyuubi ゲートウェイなどの統合 SQL ゲートウェイを介してデータにアクセスします。データセキュリティを確保するには、ID ごとにアクセスを分離する必要があります。たとえば、アナリスト A は業務レポートのみをクエリし、データエンジニア B は生データセットにアクセスします。このソリューションは、エンドツーエンドの ID 認証により、マルチテナント環境でデータ権限の分離を実現します。

image

操作手順

手順 1:環境と権限の準備

  1. 基本リソースの準備:

    • ワークスペースが作成されていること。詳細については、「ワークスペースの管理」をご参照ください。

    • ワークスペースで Kyuubi ゲートウェイが作成され、起動していること。詳細については、「Kyuubi ゲートウェイの管理」をご参照ください。

    • 必要なデータベースとテーブルを含む データカタログ が DLF に作成されていること。

  2. RAM ユーザー権限の設定:

    • EMR Serverless Spark の権限:詳細については、「RAM ユーザーへの権限付与」をご参照ください。

    • ワークスペースの権限:RAM ユーザーをワークスペースに追加し、ロールを割り当てます。詳細については、「ユーザーとロールの管理」をご参照ください。

手順 2:DLF でテーブル権限を付与

RAM ユーザーに、DLF 内の対象のテーブルへのアクセス権限を付与します。また、Kyuubi Gateway が Spark セッションを初期化できるように、default データベースに対する Describe 権限も付与する必要があります。

  1. にログインします。

  2. 対象のデータカタログ内で、データベースとテーブルに移動します。

  3. 権限を付与するテーブルを選択し、権限 タブをクリックします。

  4. Add Permission をクリックします。

    1. Principal:DLF User を選択します。

    2. Select DLF User:対象の RAM ユーザーを選択します。

    3. 権限:必要な権限を選択します。

  5. OK をクリックします。

    説明

    EMR Serverless Spark は、DLF のメタデータとデータをデフォルトでキャッシュします。権限変更が反映されるまでに約 10 分かかる場合があります。

    権限の変更を直ちに適用するには、Kyuubi Gateway Spark 設定に spark.sql.catalog.lakehouse.cache-enabled false を追加します。

手順 3:Kyuubi トークンの生成

  1. Kyuubi Gateway ページで、対象のゲートウェイを見つけ、「アクション」列の Token Management をクリックします。

  2. Create Token をクリックします。表示されるダイアログボックスで次のパラメータを設定し、OK をクリックします。

    パラメータ

    説明

    Name

    新しいトークンの名前。

    Expired At

    有効期限 (日数) 。最小:1。デフォルト:365 日。

    [Assigned to]

    対象の RAM ユーザーを選択します。

  3. トークン情報をコピーします。

    重要

    トークンはすぐにコピーしてください。再表示できません。トークンの有効期限が切れた、または紛失した場合は、新しいトークンを作成するか、既存のトークンをリセットしてください。

手順 4:Beeline 接続による権限検証

  1. JDBC 接続コマンドを作成します:

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

    パラメータ:

    パラメータ

    説明

    <エンドポイント>

    Kyuubi ゲートウェイのエンドポイント。

    <port>

    パブリックエンドポイント: 443、内部エンドポイント: 80。

    <ユーザー名またはロール名>

    RAM ユーザーまたは RAM ロール。短い名前またはフルネームを使用できます。例:

    • RAM ユーザー: agent または agent@xxxx05398154xxxx.onaliyun.com

    • RAM ロール: AliyunServiceRoleForDataworksEngine

    <トークン>

    手順 3 で RAM ユーザー向けに生成したトークン。

    [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:トークンを紛失した場合はどうすればよいですか?
平文のトークンは作成時に 1 回だけ表示されます。システムには保存されません。トークンを紛失した、または漏えいした場合:



  • [Token Management] ページで該当するエントリを見つけ、[Reset Token] をクリックしてください。

  • 古いトークンは自動的に無効化され、新しい認証情報が生成されます。

  • すべてのクライアント設定を新しいトークンに更新してください。

Q3: なぜ RAM ユーザーは Kyuubi Gateway に接続する際に default データベースの Describe 権限を付与される必要があるのですか?
Kyuubi Gateway が Spark セッションを確立する際、初期コンテキストとして default データベースをロードしようとします。ユーザーがこのデータベースにアクセスする権限を持っていない場合、セッションの初期化は失敗し、接続は終了します。このチェックは、ビジネス テーブルが他のデータベースに格納されている場合でもスキップできません。したがって、ゲートウェイに接続するすべての RAM ユーザーは、 DescribeDatabase 権限を default データベースに対して付与される必要があります。



Q4:DataWorks で Kyuubi トークンを使用し、EMR Serverless Spark の DLF データアクセスを制御するにはどうすればよいですか?

DataWorks Serverless Kyuubi ノードからジョブを送信すると、DataWorks はコンピューティングリソースのデフォルトアクセス ID を JDBC 接続に自動的に渡します。詳細については、「EMR Serverless Spark コンピューティングリソースのバインド」および「Serverless Kyuubi node」をご参照ください。

付録:ID プロキシと権限フロー

このソリューションでは、Kyuubi ゲートウェイのトークンを ID 資格情報として使用します。アクセスリクエストは、トークン所有者の RAM ユーザー ID としてプロキシされ、DLF の権限を EMR Serverless Spark のクエリワークフローに統合します。

ワークフロー:

  1. トークン生成:Kyuubi ゲートウェイで RAM ユーザー向けのトークンを生成し、そのユーザーの ID に一意にバインドします。

  2. クライアント認証:クライアント (Beeline など) は、JDBC 接続リクエストにトークンと RAM ユーザー名を含めて Kyuubi ゲートウェイに送信します。

  3. ID プロキシ:Kyuubi ゲートウェイがトークンを検証し、クエリ実行時に Spark エンジンが RAM ユーザーになりすまします。

  4. DLF 認可:Spark エンジンは、なりすました RAM ユーザーとして DLF にリクエストを送信します。

  5. 権限の適用:DLF は RAM ユーザーのアクセス制御ポリシーに基づいてリクエストを認可します。