Serverless Spark は、Kyuubi Gateway の Kerberos 認証をサポートしており、すべてのジョブ送信に対して本人確認とアクセスの制御を強制します。設定が完了すると、クライアントはゲートウェイにタスクを送信する前に Kerberos で認証する必要があります。
仕組み
Kerberos はチケットベースの認証モデルを使用します。クライアントが Kyuubi Gateway に接続する前に、キー配布センター (KDC) と認証情報を交換してチケットを取得します。以下の手順は、認証フローを説明したものです。
Kerberos クライアントは、プリンシパルとシークレット (パスワードまたは keytab ファイル) を KDC に送信します。
KDC はチケット認可チケット (TGT) を返します。
クライアントは TGT をチケットキャッシュに保存します。
JDBC クライアント (kyuubi-beeline) はキャッシュから TGT を読み取ります。
JDBC クライアントは TGT と Kyuubi サーバープリンシパルを KDC に送信します。
KDC は client-to-server チケットを返します。
JDBC クライアントは、認証のために client-to-server チケットを Kyuubi Gateway に提示します。
このフローを理解することで、各設定ステップが必要な理由がわかります。keytab によって Kyuubi Gateway は KDC に対して自身を認証でき、kinit ステップでクライアント用の TGT を取得し、JDBC URL の principal パラメーターによって、クライアントはどのサーバーに対してチケットをリクエストするかを知ることができます。
制限事項
E-MapReduce (EMR) クラスターと Serverless Spark ワークスペースは、同じリージョンにある必要があります。
Kerberos が有効になっているワークスペースでは、Kyuubi Gateway は 1 つしか作成できません。
前提条件
開始する前に、以下が準備できていることを確認してください。
Kerberos 認証が有効になっている EMR on ECS クラスター。詳細については、「クラスターの作成」をご参照ください。
Kerberos 認証が有効になっている Serverless Spark ワークスペース。詳細については、「Kerberos 認証の有効化」をご参照ください。
ネットワーク接続の作成
Kyuubi Gateway は Serverless Spark 内で実行されます。Kerberos クラスターに到達するには、PrivateLink を設定して、2 つの環境間にプライベートネットワーク接続を確立します。
エンドポイントの作成
エンドポイントはサービス利用者によって作成および維持されます。エンドポイントサービスに関連付けて、PrivateLink を介して Kerberos クラスターにアクセスします。詳細については、「エンドポイント」をご参照ください。
エンドポイントコンソールにログインします。
「[エンドポイントの作成]」ページで、以下のパラメーターを設定し、「[OK]」をクリックします。
パラメーター 説明 リージョン エンドポイントが存在するリージョンを選択します。Kerberos クラスターと Serverless Spark ワークスペースのリージョンと一致する必要があります。 エンドポイント名 エンドポイントのカスタム名を入力します。 エンドポイントタイプ インターフェースエンドポイント を選択します。 エンドポイントサービス [サービスの選択] をクリックし、ターゲットのエンドポイントサービス ID を選択または入力します。 説明エンドポイントサービス ID を取得するには、Serverless Spark ワークスペース ID (例:
w-f8cfXXXXXX)、Kerberos クラスターの VPC ID (例:vpc-bp1tXXXXXX)、および利用可能な vSwitch がある 2 つのゾーン (例:I,J) の情報を含めてチケットを送信してください。チケットでカスタマーサービスに連絡し、ご利用のリージョンでサポートされているゾーンを確認してください。VPC Kerberos クラスターの VPC を選択します。 セキュリティグループ エンドポイント ENI に関連付けるセキュリティグループを選択します。デフォルトでは、エンドポイントごとに最大 9 つのセキュリティグループを追加できます。 ゾーンと vSwitch チケットで指定されたゾーンと、それに対応する vSwitch を選択します。 IP バージョン ネットワークタイプ:IPv4 クライアントのみのアクセスの場合は [IPv4] を、IPv4 と IPv6 の両方の場合は [デュアルスタック] を選択します。デュアルスタックには、サービスプロバイダーによる事前のデュアルスタック構成が必要です。 リソースグループ エンドポイントのリソースグループを選択します。 タグ 必要に応じて[タグキー]と[タグ値]を入力します。 
[基本情報] ページで、[ステータス] が「有効」であることを確認します。エンドポイントのドメイン名は次の形式です:
ep-xxxxxxxxxxx.epsrv-xxxxxxxxxxx.cn-hangzhou.privatelink.aliyuncs.comKerberos クラスターにログインし、ネットワーク接続が機能していることを確認します。

ドメイン名解決の設定 (任意)
デフォルトのエンドポイントドメイン名は長いです。便宜上、内部権威 DNS ゾーンを使用して、より短いカスタムドメイン名にマッピングします。詳細については、「内部権威ドメイン名」をご参照ください。
コンソールにログインします。[権威ゾーン] タブで、[ユーザー定義ゾーン] をクリックし、次に [ゾーンの追加] をクリックします。
権威ゾーン名を入力し、ドメイン名が適用される VPC を選択して、[OK] をクリックします。このガイドでは、例として
kyuubi-kerberos.abcを使用します。「[ドメイン名タイプ]」オプションが利用可能な場合は、「[内部権威アクセラレーションゾーン]」を選択します。オプションが表示されない場合、ゾーンタイプは自動的に内部権威アクセラレーションにデフォルト設定されます。
[ユーザー定義ゾーン] タブで、ゾーンを見つけ、[操作] 列の [設定] をクリックします。ダイアログボックスで、[レコードの追加] をクリックし、[フォームエディターモード] を選択します。
[レコードタイプ] を [CNAME] に設定します。[ホスト名] には、
testのような値を入力します。[レコード値] には、エンドポイントのドメイン名を入力します:addprinc -randkey kyuubi/ep-xxxxxxxxxxx.epsrv-xxxxxxxxxxx.cn-hangzhou.privatelink.aliyuncs.com@EMR.C-DFD4*****C204.COM「OK」をクリックすると、ドメイン
test.kyuubi-kerberos.abcがエンドポイントにマップされます。Kerberos クラスターにログインし、接続性をテストします。
ping test.kyuubi-kerberos.abc
keytab の作成
Kerberos クラスターで次の手順を実行します。
Kerberos 管理ツールを開きます。
kadmin.localフォーマット
kyuubi/<fqdn>@<REALM>でプリンシパルを作成します。<fqdn>には、エンドポイントドメイン名を使用します。CNAME を設定した場合は、代わりにカスタムドメイン名を使用します。addprinc -randkey kyuubi/ep-xxxxxxxxxxx.epsrv-xxxxxxxxxxx.cn-hangzhou.privatelink.aliyuncs.com@EMR.C-DFD4*****C204.COMkeytab ファイルをエクスポートして終了します。
xst -kt /root/kyuubi.keytab kyuubi/ep-xxxxxxxxxxx.epsrv-xxxxxxxxxxx.cn-hangzhou.privatelink.aliyuncs.com@EMR.C-DFD4*****C204.COM quitkeytab を Object Storage Service (OSS) バケットにアップロードします。
hadoop fs -put /root/kyuubi.keytab oss://<YOUR_BUCKET>.<region>.oss-dls.aliyuncs.com/
Kyuubi Gateway の設定
次の [Kyuubi 構成] パラメーターをゲートウェイに追加してください。
kyuubi.authentication KERBEROS
kyuubi.kinit.principal kyuubi/ep-xxxxxxxxxxx.epsrv-xxxxxxxxxxx.cn-hangzhou.privatelink.aliyuncs.com@EMR.C-DFD43******7C204.COM
kyuubi.kinit.keytab /opt/kyuubi/work-dir/kyuubi.keytab
kyuubi.files oss://bucket/path/to/kyuubi.keytab| パラメーター | 説明 |
|---|---|
kyuubi.authentication | 認証メソッド。KERBEROS に設定します。 |
kyuubi.kinit.principal | Kyuubi Gateway が Kerberos 認証に使用するプリンシパル。フォーマット: <user>/<host>@<realm>。 |
kyuubi.kinit.keytab | ゲートウェイ内の keytab ファイルへのローカルパス。パス /opt/kyuubi/work-dir/ は固定です。ファイル名のみを置き換えてください。 |
kyuubi.files | 前のステップでアップロードした keytab ファイルの OSS パス。Kyuubi は起動時に kyuubi.kinit.keytab で指定されたパスにダウンロードします。 |
Spark ジョブが Kerberos 対応の Hive Metastore (HMS) にアクセスする場合、以下の Spark 構成 パラメーターを追加します。
spark.hadoop.hive.metastore.uris thrift://master-1-1.c-1d36*****e840c.cn-hangzhou.emr.aliyuncs.com:9083
spark.hadoop.hive.imetastoreclient.factory.class org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClientFactory
spark.hive.metastore.kerberos.principal hive/_HOST@EMR.C-DFD4*****C204.COM
spark.hive.metastore.sasl.enabled true
spark.emr.serverless.network.service.name <network_name>| パラメーター | 説明 |
|---|---|
spark.hadoop.hive.metastore.uris | Thrift フォーマットの HMS アドレス。 |
spark.hadoop.hive.imetastoreclient.factory.class | HMS クライアントを作成するためのファクトリクラス。org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClientFactory を使用します。 |
spark.hive.metastore.kerberos.principal | Kerberos 環境の HMS プリンシパル。 |
spark.hive.metastore.sasl.enabled | HMS の Kerberos 認証を有効にするには true に設定します。 |
spark.emr.serverless.network.service.name | Serverless Spark と EMR クラスター間のネットワーク接続の名前。 |
HMS アドレスのフォーマットルール:
高可用性 (HA) クラスター:複数の Thrift アドレスをカンマで区切って指定します。ホスト名を使用してください。HA モードでは IP アドレスはサポートされていません。
単一の HMS アドレス:IP アドレスを使用できますが、
spark.hive.metastore.kerberos.principalはhive/<hostname-of-HMS>@<REALM>のフォーマットである必要があります。hive/_HOST@<REALM>という短縮形 (_HOSTはランタイム時に実際のホスト名に解決されます) は、metastore.urisがホスト名を使用している場合にのみ機能します。
設定を保存し、Kyuubi Gateway を起動します。
ジョブの送信
show databases クエリを使用して、Kyuubi Gateway が Kerberos 認証で正しく動作していることを確認します。
Kerberos クラスターにログインし、ジョブ送信用の Kerberos ユーザーを作成します。
kadmin.local addprinc -randkey hadoop xst -kt /root/hadoop.keytab hadoop quitkeytab を使用して認証します。
kinit -kt hadoop.keytab hadoopこれにより、
hadoopプリンシパルの TGT がキャッシュされ、次のステップで kyuubi-beeline がこれを読み取ります。Kyuubi Gateway に接続し、テストクエリを実行します。
/opt/apps/KYUUBI/kyuubi-1.9.2-1.0.0/bin/kyuubi-beeline -u 'jdbc:hive2://ep-xxxxxxxxxxx.epsrv-xxxxxxxxxxx.cn-hangzhou.privatelink.aliyuncs.com:10009/;principal=kyuubi/_HOST@EMR.C-DFD43*****7C204.COM'JDBC URL に関する注意:
principalは Kyuubi サーバープリンシパルを指定します。この値は、サーバー側のkyuubi.kinit.principalと一致する必要があります。_HOSTは、ランタイム時に実際のホスト名に解決されるプレースホルダーです。URL は、シェルが
;文字でコマンドを分割するのを防ぐために、シングルクォーテーションで囲まれています。
接続後、
show databasesを実行して、Spark ジョブが正常に開始されることを確認します。
HDFS と HMS のプロキシユーザーアクセスの設定
Spark ジョブが Kerberos 対応の HMS または Hadoop 分散ファイルシステム (HDFS) にアクセスする必要がある場合は、クラスター上の HADOOP-COMMON または HDFS コンポーネントの core-site.xml に次の 2 つのプロパティを追加します。
hadoop.proxyuser.kyuubi.hosts = *
hadoop.proxyuser.kyuubi.groups = *これらのプロパティにより、kyuubi サービスアカウント (Kyuubi Gateway を起動するユーザー) は、他のユーザーに代わって HDFS または HMS にアクセスする際に、そのユーザーの権限を借用できます。hosts の値は kyuubi アカウントが接続できるホストアドレスを制御し、groups の値は権限を借用できるユーザーグループを制御します。これらのプロパティがない場合、kyuubi 以外のユーザーとして実行されている Spark ジョブからの接続は失敗する可能性があります。
ワイルドカード値 (*) は、すべてのホストからのアクセスと、すべてのユーザーグループに対するアクセスを許可します。本番環境では、* を特定の値に置き換えてください。たとえば、hosts を Kyuubi Gateway ノードの IP アドレスに設定し、groups をクライアントユーザーが所属するグループに設定します。
新しいバージョンの EMR DataLake クラスターには、これらのプロパティがデフォルトで含まれています。プロパティを追加した後、変更を有効にするために HDFS または HMS サービスを再起動してください。