本ドキュメントでは、EMR Serverless Spark の Kyuubi ゲートウェイに、トークンベースの ID 認証を設定する方法を説明します。このソリューションでは、RAM ユーザーに紐付けられたトークンを使用して、Data Lake Formation (DLF) 内の Paimon データに対するきめ細かなアクセス制御を実現します。その結果、クライアントは自身の認証情報を使用して同じ Kyuubi ゲートウェイにアクセスしますが、アクセスが許可されているデータのみをクエリできます。
ユースケース
企業のデータ分析プラットフォームでは、複数のユーザーやアプリケーションが Kyuubi ゲートウェイなどの統一された SQL ゲートウェイを介してデータにアクセスする必要があります。データセキュリティを確保するためには、ID ごとにアクセスを分離し、各ユーザーが許可された範囲内のデータにのみアクセスできるようにする必要があります。たとえば、アナリスト A はビジネスレポートのみをクエリでき、データエンジニア B は基盤となる生データセットにアクセスできるといった状況です。このソリューションは、マルチテナンシー環境におけるデータ権限分離のニーズに対応し、エンドツーエンドの ID 認証とアクセス制御を提供します。
操作手順
ステップ 1:環境と RAM 権限の準備
-
基本リソースの準備
-
ワークスペースが作成済みであること。詳細については、「ワークスペースの管理」をご参照ください。
-
ワークスペース内で Kyuubi ゲートウェイが作成され、起動済みであること。詳細については、「Kyuubi ゲートウェイの管理」をご参照ください。
-
Data Lake Formation (DLF) で データカタログ が作成され、必要なデータベースとテーブルが準備済みであること。
-
-
RAM ユーザーと権限の設定。RAM ユーザーを作成し、必要な権限を付与します。
-
EMR Serverless Spark 権限:RAM ユーザーに EMR Serverless Spark を操作するために必要な権限を付与します。詳細については、「RAM ユーザーへの権限付与」をご参照ください。
-
ワークスペース権限:RAM ユーザーをワークスペースに追加し、ユーザーの職務に基づいてロールを割り当てます。詳細については、「ユーザーとロールの管理」をご参照ください。
-
ステップ 2:DLF でのテーブル権限の付与
DLF で、RAM ユーザーに特定のテーブルへのアクセス権限を付与します。Kyuubi ゲートウェイが Spark セッションを正常に初期化できるようにするには、RAM ユーザーに DLF の default データベースに対する DescribeDatabase 権限も付与する必要があります。
-
にログインします。
-
目的のカタログ内の対象データベースとテーブルに移動します。
-
権限を付与したいテーブルを選択し、権限 タブに移動します。
-
Add Permission をクリックします。
-
[Principal]:DLF User を選択します。
-
[Select DLF User]:ターゲットの RAM ユーザーを選択します。
-
[権限]:必要な権限を選択します。
-
-
OK をクリックします。以上で認可は完了です。
説明デフォルトでは、EMR Serverless Spark は DLF のメタデータとデータをキャッシュします。テーブルの権限を変更した場合、変更が有効になるまで最大 10 分かかることがあります。
権限の変更をすぐに適用するには、Kyuubi ゲートウェイの Spark 設定に
spark.sql.catalog.lakehouse.cache-enabled falseパラメーターを追加します。
ステップ 3:Kyuubi トークンの生成
-
Kyuubi Gateway ページで、対象のゲートウェイを探し、[操作] 列の Token Management をクリックします。
-
Create Token をクリックします。表示されたダイアログボックスで、以下のパラメーターを設定し、OK をクリックします。
パラメーター
説明
[Name]
新しいトークンの名前。
[Expired At]
トークンの有効期間。値は 1 以上の整数である必要があります。デフォルトでは、トークンは 365 日後に失効します。
[割り当て先]
ドロップダウンリストから、対象の RAM ユーザーを選択します。
-
トークン情報をコピーします。
重要トークンは後で取得できないため、作成後すぐにトークン情報をコピーする必要があります。トークンが失効または紛失した場合は、新しいトークンを作成するか、[Reset Token] をクリックして既存のトークンをリセットしてください。
ステップ 4:接続と権限の検証
-
JDBC 接続コマンドの構築
beeline -u "jdbc:hive2://<endpoint>:<port>/;transportMode=http;user=<user_name_or_role_name>;httpPath=cliservice/token/<token>"パラメーター:
パラメーター
説明
<endpoint>Kyuubi ゲートウェイのエンドポイント。
<port>アクセスポート。パブリックエンドポイントの場合はポート
443を、内部ネットワークエンドポイントの場合はポート80を使用します。<user_name_or_role_name>RAM ユーザーまたは RAM ロール。短縮名またはフルネームを使用できます。例:
-
RAM ユーザー:
agentまたはagent@xxxx05398154xxxx.onaliyun.com -
RAM ロール:
AliyunServiceRoleForDataworksEngine
<token>ステップ 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> -
-
アクセス制御の検証
-
権限のあるテーブルのクエリ:
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:権限の変更が反映されないのはなぜですか?
-
Data Lake Formation のメタデータキャッシュ:Spark エンジンはテーブルスキーマ情報をキャッシュするため、認可チェックがバイパスされることがあります。
解決策:Spark 設定にspark.sql.catalog.lakehouse.cache-enabled falseを追加して、メタデータキャッシュを無効にします。 -
権限の伝播遅延:まれに、DLF で権限が同期されるまでに短い遅延 (通常 10 秒未満) が発生することがあります。
推奨事項:少し待ってから再試行するか、DLF コンソールで権限が正しく割り当てられていることを確認してください。
Q2:トークンを紛失した場合はどうすればよいですか?
-
[Token Management] ページで、対応するトークンを見つけ、 [Reset Token] をクリックします。
-
古いトークンは即座に無効になり、新しいトークンが生成されます。
-
すべてのクライアント設定を新しいトークンで更新してください。
Q3:Kyuubi ゲートウェイへの接続時に、RAM ユーザーに default データベースの Describe 権限を付与する必要があるのはなぜですか?
デフォルトでは、Kyuubi ゲートウェイが Spark セッションを確立する際、初期コンテキストとして default データベースをロードしようとします。RAM ユーザーがこのデータベースにアクセスする権限を持っていない場合、セッションの初期化に失敗し、接続が終了します。このチェックは、ビジネステーブルが他のデータベースにある場合でもスキップできません。したがって、ゲートウェイに接続するすべての RAM ユーザーには、事前に default データベースの DescribeDatabase 権限を付与する必要があります。
Q4:DataWorks で Kyuubi トークンを使用する方法は?
DataWorks で Serverless Kyuubi ノードを使用してタスクを送信すると、DataWorks はコンピューティングリソースで設定されたデフォルトのアクセス ID を自動的に JDBC 接続に渡します。DataWorks で EMR Serverless Spark コンピューティングリソースをバインドする方法については、「EMR Serverless Spark コンピューティングリソースのバインド」をご参照ください。Serverless Kyuubi ノードの使用方法の詳細については、「Serverless Kyuubi ノード」をご参照ください。
付録:ID プロキシと権限の適用
このソリューションは、Kyuubi ゲートウェイトークンを ID クレデンシャルとして使用し、ゲートウェイがトークンの所有者 (RAM ユーザー) に代わってアクセスリクエストをプロキシすることを可能にします。このプロセスは、DLF 権限システムを EMR Serverless Spark のクエリワークフローに統合します。
ワークフローは次のとおりです:
-
トークン生成:指定された RAM ユーザーに対して、Kyuubi ゲートウェイで期限付きのトークンが生成されます。このトークンは、その RAM ユーザーの ID に一意にバインドされます。
-
クライアント認証:Beeline などのクライアントは、Kyuubi ゲートウェイに接続する際に、JDBC 接続文字列にトークンと対応する RAM ユーザー名を含めます。
-
ID 偽装:Kyuubi ゲートウェイはトークンを検証します。Spark SQL クエリの実行中、EMR Serverless Spark エンジンは RAM ユーザーを偽装します。
-
DLF 認可:Spark エンジンが DLF のメタデータやデータにアクセスする際、偽装された RAM ユーザーとして DLF にリクエストを送信します。
-
権限の適用:DLF は、RAM ユーザーに設定された権限ポリシーに基づいてリクエストを認可し、結果を返します。