EMR Serverless Spark の Kyuubi ゲートウェイ向けに、トークンベースの認証を設定します。トークンを RAM ユーザーにバインドすることで、Data Lake Formation (DLF) の Paimon カタログデータに対して、きめ細かなアクセス制御を適用できます。これにより、各クライアントは認可されたデータのみをクエリできます。
ユースケース
企業のデータ分析では、複数のユーザーまたはアプリケーションが、Kyuubi ゲートウェイなどの統合 SQL ゲートウェイを介してデータにアクセスします。データセキュリティを確保するには、ID ごとにアクセスを分離する必要があります。たとえば、アナリスト A は業務レポートのみをクエリし、データエンジニア B は生データセットにアクセスします。このソリューションは、エンドツーエンドの ID 認証により、マルチテナント環境でデータ権限の分離を実現します。
操作手順
手順 1:環境と権限の準備
-
基本リソースの準備:
-
ワークスペースが作成されていること。詳細については、「ワークスペースの管理」をご参照ください。
-
ワークスペースで Kyuubi ゲートウェイが作成され、起動していること。詳細については、「Kyuubi ゲートウェイの管理」をご参照ください。
-
必要なデータベースとテーブルを含む データカタログ が DLF に作成されていること。
-
-
RAM ユーザー権限の設定:
-
EMR Serverless Spark の権限:詳細については、「RAM ユーザーへの権限付与」をご参照ください。
-
ワークスペースの権限:RAM ユーザーをワークスペースに追加し、ロールを割り当てます。詳細については、「ユーザーとロールの管理」をご参照ください。
-
手順 2:DLF でテーブル権限を付与
RAM ユーザーに、DLF 内の対象のテーブルへのアクセス権限を付与します。また、Kyuubi Gateway が Spark セッションを初期化できるように、default データベースに対する Describe 権限も付与する必要があります。
-
にログインします。
-
対象のデータカタログ内で、データベースとテーブルに移動します。
-
権限を付与するテーブルを選択し、権限 タブをクリックします。
-
Add Permission をクリックします。
-
Principal:DLF User を選択します。
-
Select DLF User:対象の RAM ユーザーを選択します。
-
権限:必要な権限を選択します。
-
-
OK をクリックします。
説明EMR Serverless Spark は、DLF のメタデータとデータをデフォルトでキャッシュします。権限変更が反映されるまでに約 10 分かかる場合があります。
権限の変更を直ちに適用するには、Kyuubi Gateway Spark 設定に
spark.sql.catalog.lakehouse.cache-enabled falseを追加します。
手順 3:Kyuubi トークンの生成
-
Kyuubi Gateway ページで、対象のゲートウェイを見つけ、「アクション」列の Token Management をクリックします。
-
Create Token をクリックします。表示されるダイアログボックスで次のパラメータを設定し、OK をクリックします。
パラメータ
説明
Name
新しいトークンの名前。
Expired At
有効期限 (日数) 。最小:1。デフォルト:365 日。
[Assigned to]
対象の RAM ユーザーを選択します。
-
トークン情報をコピーします。
重要トークンはすぐにコピーしてください。再表示できません。トークンの有効期限が切れた、または紛失した場合は、新しいトークンを作成するか、既存のトークンをリセットしてください。
手順 4:Beeline 接続による権限検証
-
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> -
-
アクセス制御を検証します。
-
認可されたテーブルをクエリします:
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 のクエリワークフローに統合します。
ワークフロー:
-
トークン生成:Kyuubi ゲートウェイで RAM ユーザー向けのトークンを生成し、そのユーザーの ID に一意にバインドします。
-
クライアント認証:クライアント (Beeline など) は、JDBC 接続リクエストにトークンと RAM ユーザー名を含めて Kyuubi ゲートウェイに送信します。
-
ID プロキシ:Kyuubi ゲートウェイがトークンを検証し、クエリ実行時に Spark エンジンが RAM ユーザーになりすまします。
-
DLF 認可:Spark エンジンは、なりすました RAM ユーザーとして DLF にリクエストを送信します。
-
権限の適用:DLF は RAM ユーザーのアクセス制御ポリシーに基づいてリクエストを認可します。