このトピックでは、EMR Serverless Spark の Kyuubi ゲートウェイでトークンベースの ID 認証を構成する方法について説明します。この方法では、Resource Access Management (RAM) ユーザーにバインドされたトークンを使用して、Data Lake Formation (DLF) の Paimon カタログデータに対する詳細なアクセス制御を可能にします。異なるクライアントは、それぞれの一意の認証情報を使用して同じ Kyuubi ゲートウェイにアクセスできますが、権限を持つデータのみをクエリできます。
利用シーン
企業のデータ分析プラットフォームでは、複数のユーザーやアプリケーションが Kyuubi ゲートウェイなどの統一された SQL ゲートウェイを介してデータにアクセスします。データセキュリティを確保するためには、異なる ID のアクセスを分離する必要があります。これにより、各ユーザーは自身の権限範囲内のデータにのみアクセスできるようになります。例えば、アナリスト A はビジネスレポートのみをクエリでき、データエンジニア B は基盤となる生のデータセットにアクセスできます。このソリューションは、マルチテナンシー環境でデータ権限の分離を提供し、エンドツーエンドの ID 認証とアクセス制御を実現します。
操作手順
ステップ 1:環境と RAM ユーザー権限の準備
基本的なリソースの準備
ワークスペースを作成します。詳細については、「ワークスペースの管理」をご参照ください。
ワークスペースで Kyuubi ゲートウェイを作成して起動します。詳細については、「Kyuubi ゲートウェイの管理」をご参照ください。
DLF でデータカタログを作成し、必要なデータベースとテーブルを準備します。
RAM ユーザーと権限の構成 RAM ユーザーを準備し、必要な権限を付与します。
EMR Serverless Spark 権限:RAM ユーザーに EMR Serverless Spark へのアクセスに必要な基本的な操作権限を付与します。詳細については、「RAM ユーザーへの権限付与」をご参照ください。
ワークスペース権限:RAM ユーザーをワークスペースに追加し、その役割に基づいてロールを割り当てます。詳細については、「ユーザーとロールの管理」をご参照ください。
ステップ 2:DLF での RAM ユーザーへのテーブル権限の付与
DLF で RAM ユーザーに特定のテーブルへのアクセス権限を付与します。Kyuubi ゲートウェイが Spark セッションを初期化できるようにするには、RAM ユーザーに DLF の default データベースに対する Describe 権限も付与する必要があります。
にログインします。
ターゲットカタログ内のデータベースとテーブルに移動します。
権限を付与するテーブルを選択し、[権限] タブをクリックします。
[権限の付与] をクリックします。
[プリンシパル]:[DLF ユーザー/DLF ロール] を選択します。
[DLF ユーザーの選択]:ターゲットの RAM ユーザーを選択します。
権限:必要な権限を選択します。
[OK] をクリックします。これで権限付与は完了です。
説明EMR Serverless Spark は、デフォルトで DLF のメタデータとデータのキャッシュを有効にします。テーブルの権限を再付与した場合、変更が有効になるまでに約 10 分かかります。
権限の変更をすぐに有効にしたい場合は、Kyuubi ゲートウェイの Spark 構成に
spark.sql.catalog.lakehouse.cache-enabled falseを追加します。
ステップ 3:RAM ユーザー用の Kyuubi トークンの生成
[Kyuubi ゲートウェイ] ページで、ターゲットのゲートウェイを見つけ、[操作] 列の [トークン] をクリックします。
[トークンの作成] をクリックします。表示されるダイアログボックスで、次のパラメーターを構成し、[OK] をクリックします。
パラメーター
説明
名前
新しいトークンの名前。
[有効期限]
トークンの有効期限を設定します。値は 1 以上である必要があります。デフォルトでは、この機能は有効になっており、トークンは 365 日後に有効期限が切れます。
[割り当て先]
ドロップダウンリストから、ターゲットの RAM ユーザーを選択します。
トークン情報をコピーします。
重要トークンを作成したら、すぐにトークン情報をコピーする必要があります。後で取得することはできません。トークンの有効期限が切れたり、紛失したりした場合は、新しいトークンを作成するか、既存のトークンをリセットする必要があります。
ステップ 4:Beeline を使用した接続と権限の検証
JDBC 接続コマンドの構築
beeline -u "jdbc:hive2://<endpoint>:<port>/;transportMode=http;user=<UserName or RoleName>;httpPath=cliservice/token/<Token>"パラメーターの説明:
パラメーター
説明
<endpoint>Kyuubi ゲートウェイのエンドポイント。
<port>アクセスポート。パブリックエンドポイントのポートは
443です。内部ネットワークエンドポイントのポートは80です。<UserName or RoleName>RAM ユーザーまたは RAM ロール。短縮名または完全名を使用できます。例:
RAM ユーザー:
agentまたはagent@xxxx05398154xxxx.onaliyun.comRAM ロール:
AliyunServiceRoleForDataworksEngine
<Token>ステップ 3 で RAM ユーザー用に生成されたトークン。

アクセス制御効果の検証
権限のあるテーブルのクエリ:
SELECT * FROM <database_name>.<authorized_table_name> LIMIT 10;クエリデータが正常に返されます。

権限のないテーブルのクエリ:
SELECT * FROM <database_name>.<unauthorized_table_name> LIMIT 10;クエリは失敗し、
emr_test doesn't have privilege SELECT on TABLEのような権限関連のエラーが返されます。
よくある質問
Q1:権限を付与した後でも、権限のないテーブルをクエリして結果を取得できてしまいます。権限が有効になっていないのでしょうか?
この問題は、次の理由で発生する可能性があります:
DLF メタデータキャッシュ:Spark エンジンはテーブルスキーマ情報をキャッシュするため、権限付与チェックがバイパスされることがあります。
解決策:Spark 構成にspark.sql.catalog.lakehouse.cache-enabled falseを追加して、メタデータキャッシュを無効にします。権限の遅延:まれに、DLF の権限同期に短い遅延 (通常は 10 秒以内) が発生することがあります。
推奨事項:しばらく待ってから再試行するか、DLF コンソールで権限が正しく付与されていることを確認してください。
Q2:トークンを作成した後に表示できなくなりました。紛失した場合はどうすればよいですか?
プレーンテキストのトークンは、作成後にダイアログボックスに一度だけ表示されます。システムは元の値を保存しません。トークンを紛失したり漏洩したりした場合は、すぐに次の操作を行う必要があります:
トークン管理ページで、対応するエントリを見つけて [トークンのリセット] をクリックします。
古いトークンは自動的に無効になり、新しい認証情報が生成されます。
すべてのクライアント構成を新しいトークンで更新します。
Q3:RAM ユーザーが Kyuubi ゲートウェイに接続するために、なぜ default データベースに対する Describe 権限が必要なのですか?
デフォルトでは、Spark セッションが確立されると、Kyuubi ゲートウェイは初期コンテキストとして default データベースをロードしようとします。現在の ID にこのデータベースへのアクセス権限がない場合、セッションの初期化は失敗し、接続は終了します。このチェックは、ビジネステーブルが他のデータベースにある場合でも必須です。したがって、ゲートウェイに接続するすべての RAM ユーザーは、default データベースに対する DescribeDatabase 権限を持っている必要があります。
付録:ID プロキシと権限実行フロー
このソリューションの中核は、Kyuubi ゲートウェイのトークンを ID 認証情報として使用することです。ゲートウェイは、トークンの所有者である RAM ユーザーに代わってアクセスリクエストをプロキシします。このプロセスにより、Data Lake Formation (DLF) の権限システムが EMR Serverless Spark のクエリワークフローに統合されます。
ワークフローは次のとおりです:
トークンの生成:Kyuubi ゲートウェイで指定された RAM ユーザーに対して一時的なトークンが生成されます。このトークンは、その RAM ユーザーの ID に一意にバインドされます。
クライアント認証:Beeline などのクライアントが Java Database Connectivity (JDBC) 接続を確立する際、このトークンと対応する RAM ユーザー名を接続リクエストに含めて Kyuubi ゲートウェイに送信します。
ID プロキシ:Kyuubi ゲートウェイはトークンを検証します。Spark SQL クエリの実行中、EMR Serverless Spark エンジンは RAM ユーザーの ID を借用 (impersonate) します。
DLF 権限付与:Spark エンジンが DLF のメタデータまたはデータにアクセスする際、借用した RAM ユーザーの ID を使用して DLF にリクエストを送信します。
権限の適用:DLF は、RAM ユーザーに構成されているアクセスポリシーに基づいてリクエストを承認し、結果を返します。