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

E-MapReduce:Spark Thrift Server の Ranger 認証の設定

最終更新日:Apr 22, 2025

Apache Ranger は一元化された権限管理フレームワークです。 Apache Ranger と Spark に統合されている Ranger プラグインを使用することで、Spark SQL を使用してアクセスされるデータベース、テーブル、および列に対するきめ細かいアクセス制御を実装し、データアクセス セキュリティを強化できます。 このトピックでは、データアクセス制御を実装するために Spark Thrift Server の Ranger プラグインを設定する方法について説明します。

制限事項

Serverless Spark のエンジンバージョンは、次の要件を満たしている必要があります。

  • esr-4.x: esr-4.2.0 以降

  • esr-3.x: esr-3.0.1 以降

  • esr-2.x: esr-2.4.1 以降

注意事項

Ranger はサービス認証を担当します。 ID 認証を実装する場合は、OpenLDAP サービスを使用します。 詳細については、「Spark Thrift Server の LDAP 認証の設定」をご参照ください。

前提条件

Spark Thrift Server が作成されていること。 詳細については、「Spark Thrift Server の管理」をご参照ください。

手順

手順 1: ネットワーク接続の設定

指定された Ranger プラグインが Ranger Admin に接続して関連する権限が付与されるように、E-MapReduce (EMR) Serverless Spark と VPC (Virtual Private Cloud) 間のネットワーク接続を設定する必要があります。 詳細については、「VPC を介した EMR Serverless Spark とデータソース間のネットワーク接続の設定」をご参照ください。

手順 2: Ranger プラグインの設定

Spark Thrift Server の Ranger 認証を設定する前に、Spark Thrift Server を停止する必要があります。 その後、次の操作を実行して Spark Thrift Server を変更します。 [ネットワーク接続] ドロップダウンリストから作成済みの接続を選択し、使用する Ranger プラグインのタイプに基づいて、関連する設定項目を [Spark 設定] パラメーターに追加します。 Spark Thrift Server を変更した後、変更を有効にするために再起動する必要があります。

方法 1: 組み込みの Ranger プラグインを使用する

重要

この方法は、バージョンが esr-3.1.0 以降の Spark Thrift Server でのみ使用できます。

spark.ranger.plugin.enabled                true
spark.jars                                 /opt/ranger/ranger-spark.jar
ranger.plugin.spark.policy.rest.url        http://<ranger_admin_ip>:<ranger_admin_port>

<ranger_admin_ip><ranger_admin_port> は、Ranger Admin の内部 IP アドレスとポート番号を指定します。 ビジネス要件に基づいてパラメーターを設定します。 EMR on ECS クラスタにデプロイされている Ranger サービスに接続する場合は、<ranger_admin_ip> パラメーターをマスターノードの内部 IP アドレスに設定し、<ranger_admin_port> パラメーターを 6080 に設定します。

方法 2: カスタム Ranger プラグインを使用する

カスタム Ranger プラグインを使用する場合は、カスタム Ranger プラグインを Object Storage Service (OSS) にアップロードし、カスタム JAR パッケージとクラスの名前を指定できます。

spark.jars                                 oss://<bucket>/path/to/user-ranger-spark.jar
spark.ranger.plugin.class                  <class_name>
spark.ranger.plugin.enabled                true
ranger.plugin.spark.policy.rest.url        http://<ranger_admin_ip>:<ranger_admin_port>

ビジネス要件に基づいて、次のパラメーターを設定します。

  • spark.jars: カスタム JAR パッケージが格納されている OSS パス。

  • spark.ranger.plugin.class: カスタム Ranger プラグインの Spark 拡張クラスの名前。

  • <ranger_admin_ip><ranger_admin_port>: Ranger Admin の内部 IP アドレスとポート番号。 EMR on ECS クラスタにデプロイされている Ranger サービスに接続する場合は、<ranger_admin_ip> パラメーターをマスターノードの内部 IP アドレスに設定し、<ranger_admin_port> パラメーターを 6080 に設定します。

(オプション) 手順 3: Ranger の監査機能の設定

Ranger では、Solr や Hadoop 分散ファイルシステム (HDFS) など、監査情報を格納するために使用するサービスを指定できます。 デフォルトでは、EMR Serverless Spark の Ranger の監査機能は無効になっています。 監査機能を有効にする場合は、関連する設定項目を [Spark 設定] パラメーターに追加できます。

EMR on ECS クラスタにデプロイされている Solr サービスに接続する場合は、次の設定項目を [Spark 設定] パラメーターに追加します。

xasecure.audit.is.enabled                  true
xasecure.audit.destination.solr            true
xasecure.audit.destination.solr.urls       http://<solr_ip>:<solr_port>/solr/ranger_audits
xasecure.audit.destination.solr.user       <user>
xasecure.audit.destination.solr.password   <password>

パラメーターの説明:

  • xasecure.audit.is.enabled: Ranger の監査機能を有効にするかどうかを指定します。

  • xasecure.audit.destination.solr: 監査情報を Solr に格納するかどうかを指定します。

  • xasecure.audit.destination.solr.urls: Solr の URL。 <solr_ip> は Solr の IP アドレスを示し、<solr_port> は Solr のポート番号を示します。 その他の URL 情報は、ビジネス要件に基づいて設定します。

  • xasecure.audit.destination.solr.userxasecure.audit.destination.solr.password: ユーザー名とパスワード。 これらのパラメーターは、Solr の基本認証を有効にする場合に必須です。

    EMR on ECS クラスタにデプロイされている Ranger サービスに接続する場合は、[Ranger-plugin] サービスページの [ranger-spark-audit.xml] タブで、xasecure.audit.destination.solr.urlsxasecure.audit.destination.solr.user、および xasecure.audit.destination.solr.password 設定項目の値を表示できます。

    image

監査機能を設定した後に EMR Serverless Spark でジョブを送信すると、Ranger の Web UI にアクセスして、[アクセス] タブでユーザーアクセスの監査情報を表示できます。 Ranger の Web UI へのアクセス方法については、「EMR コンソールでオープンソースコンポーネントの Web UI にアクセスする」をご参照ください。

説明

Ranger の Web UI で監査情報を表示できるのは、Solr を使用して監査情報を格納する場合のみです。

image

手順 4: 接続のテスト

Spark Beeline を使用して、データベースやテーブルなど、権限のないリソースにアクセスすると、次のエラーが発生します。

0: jdbc:hive2://pre-emr-spark-gateway-cn-hang> create table test(id int);
Error: org.apache.hive.service.cli.HiveSQLException: Error running query: org.apache.kyuubi.plugin.spark.authz.AccessControlException: Permission denied: user [test] does not have [create] privilege on [database=testdb/table=test]
	at org.apache.spark.sql.hive.thriftserver.HiveThriftServerErrors$.runningQueryError(HiveThriftServerErrors.scala:44)
	at org.apache.spark.sql.hive.thriftserver.SparkExecuteStatementOperation.org$apache$spark$sql$hive$thriftserver$SparkExecuteStatementOperation$$execute(SparkExecuteStatementOperation.scala:325)
	at org.apache.spark.sql.hive.thriftserver.SparkExecuteStatementOperation$$anon$2$$anon$3.$anonfun$run$2(SparkExecuteStatementOperation.scala:230)
	at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23)
	at org.apache.spark.sql.hive.thriftserver.SparkOperation.withLocalProperties(SparkOperation.scala:79)
	at org.apache.spark.sql.hive.thriftserver.SparkOperation.withLocalProperties$(SparkOperation.scala:63)
	at org.apache.spark.sql.hive.thriftserver.SparkExecuteStatementOperation.withLocalProperties(SparkExecuteStatementOperation.scala:43)
	at org.apache.spark.sql.hive.thriftserver.SparkExecuteStatementOperation$$anon$2$$anon$3.run(SparkExecuteStatementOperation.scala:230)
	at org.apache.spark.sql.hive.thriftserver.SparkExecuteStatementOperation$$anon$2$$anon$3.run(SparkExecuteStatementOperation.scala:225)
	at java.security.AccessController.doPrivileged(Native Method)
	at javax.security.auth.Subject.doAs(Subject.java:422)
	at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1730)
	at org.apache.spark.sql.hive.thriftserver.SparkExecuteStatementOperation$$anon$2.run(SparkExecuteStatementOperation.scala:239)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:750)
説明
  • 権限を確認する場合は、Ranger でユーザーが持つデフォルトの権限に注意してください。 たとえば、すべてのユーザーはデータベースを切り替えたり作成したりする権限を持っており、データベースとテーブルの所有者は、データベースとテーブルに対するすべての権限を持っています。 データベースやテーブルなど、ユーザー A によって作成されたリソースに対するユーザー B の権限を確認することをお勧めします。 自分自身で作成したリソースに対するユーザーの権限を確認すると、特定の権限設定が有効にならない場合があります。 これは、リソースの所有者がリソースに対するすべての権限を持っているために発生します。

  • Ranger Admin が正しく設定されていない場合、SQL 文は正常に実行され、エラーは報告されません。 ただし、Ranger 認証は有効になりません。