メインコンテンツへスキップ
  1. Blogs/

TrinoとApache Rangerの統合

··6998 文字·14 分· · · Originally published at towardsdatascience.com
Trino Apache Ranger データエンジニアリング データセキュリティ データ分析 データガバナンス
Aakash Nand
著者
Aakash Nand
Senior Data Engineer @ Slalom Build
目次

TrinoとApache Software Foundationの商標であるロゴに触発された作者による画像

第一部: 概念とアイデア
#

背景
#

データへの需要が日々増加する中、企業セットアップにおけるデータセキュリティの要件も増加しています。Hadoopエコシステムでは、Apache RangerがHDFS、Solr、Yarn、Kafka、Hiveなどの多数のプラグインを備えた有望なデータセキュリティフレームワークとして登場しています。 Apache Rangerはバージョン2.1.0でprestosql用のプラグインを追加しましたが、最近 PrestoSQLはTrinoとしてリブランドされました、これによりApache Rangerのprestosqlプラグインの動作が停止しました。

この問題に対するパッチを提出しましたが、既に こちらでオープンなJIRAイシューが存在しますが、これによりTrinoとApache Rangerの統合が止まることはありません。このチュートリアルでは、Trinoプラグインを搭載したApache Ranger 2.1.0をビルドしました。ソースコードからTrinoプラグインを含むApache Rangerをビルドしたい場合は、ranger-2.1.0-trinoブランチの このGitHubリポジトリを参照し、このチュートリアルの目的で、 このGithubリポジトリを使用します。

更新: 2022-05-20

Trinoプラグインは現在rangerリポジトリで公式に利用可能であり、Apache Ranger-2.3でリリースされました https://github.com/apache/ranger/tree/ranger-2.3

コンポーネントとキーアイデアの紹介
#

Apache Rangerにはranger-adminranger-usersyncranger-auditの3つの主要なコンポーネントがあります。これらのコンポーネントについて紹介しましょう。

注: このチュートリアルではranger-usersyncの設定は範囲外であり、usersyncコンポーネントは使用しません。

Ranger Admin
#

Ranger Adminコンポーネントは、異なるアクセスレベルのポリシーを作成できるUIコンポーネントです。Ranger Adminはバックエンドデータベースを必要とし、この場合、Ranger Admin UIのバックエンドデータベースとしてPostgresを使用しています。

Ranger Audit
#

Ranger Auditコンポーネントは、リソースの各アクセスイベントのログを収集して表示します。Rangerはsolrelasticsearchの2つの監査方法をサポートしています。私たちは、Ranger監査ログを保存するためにelasticsearchを使用し、それをRanger Audit UIでも表示します。

Trino
#

Trinoは、高速な分散クエリエンジンです。hivepostgresoracleなど複数のデータソースに接続できます。TrinoおよびTrinoコネクタの詳細については、 こちらの公式ドキュメントをご覧ください。このチュートリアルでは、ダミーデータが含まれているデフォルトカタログtpchを使用します。

Trino-Ranger-Plugin
#

Apache RangerはHDFS、Hive、Yarn、Trinoなどの多くのプラグインをサポートしています。これらのプラグインは、そのプロセスを実行しているホスト上で設定する必要があります。Trino-Ranger-Pluginは、Ranger Adminと通信してアクセスポリシーをチェックおよびダウンロードし、それをTrinoサーバーと同期させるコンポーネントです。ダウンロードされたポリシーはTrinoサーバー上の/etc/ranger/<service-name>/policycacheのパスの下にJSONファイルとして保存されます。したがって、このケースではポリシーのパスは/etc/ranger/trino/policycacheです。

上記のコンポーネント間の通信は、次の図で説明されています。

作者による画像

docker-composeファイルは、上記のすべてのコンポーネントを接続します。

docker-compose.ymlについての重要なポイント

  1. named-docker-volumesを使用しています。例: ranger-es-dataranger-pg-dataは、elasticsearchやPostgresなどのサービスのデータをコンテナの再起動後も永続化します。

  2. Ranger-AdminおよびRanger-Trino Pluginの事前ビルドされたtarファイルは、このデモリポジトリのリリースアセットとして こちらで利用可能です。

  3. ranger-Adminプロセスは 最小限1.5 GBのメモリを必要とします。Ranger-Admin tarファイルにはinstall.propertiessetup.shが含まれています。setup.shスクリプトはinstall.propertiesから設定を読み取ります。次のパッチファイルは、Ranger-Adminコンポーネントのinstall.propertiesのデフォルトバージョンと比較して行われた設定変更を説明しています。

  1. Ranger-Trino-Plugin tarファイルにもinstall.propertiesenable-trino-plugin.shスクリプトが含まれています。trino docker環境についての重要な点は、設定ファイルとプラグインディレクトリが異なるディレクトリ位置に設定されていることです。設定は/etc/trinoから読み取られ、プラグインは/usr/lib/trino/pluginsから読み込まれます。これら2つのディレクトリは、Trino-Ranger-Pluginのinstall.propertiesを設定する際に重要であり、そのため、Trino-Ranger-Plugin tarファイルに付属するデフォルトスクリプトenable-trino-plugin.shにいくつかのカスタマイズが必要です。これらの変更は、次のパッチファイルで強調表示されています。これらの変更は、INSTALL_ENVおよびCOMPONENT_PLUGIN_DIR_NAMEという2つの新しいカスタム変数を導入し、install.propertiesで設定できます。
  1. Trino Ranger Pluginのinstall.propertiesファイルは、次のパッチファイルに示されているように設定する必要があります。docker環境でTrinoがデプロイされていることをenable-plugin-scriptに通知するために、2つの新しく導入されたカスタム変数を使用していることに注意してください。
  1. 最後に、以下に示すように、すべてをdocker-compose.ymlにまとめます。このファイルは、 こちらのGitHubリポジトリでも利用可能です。

第二部: セットアップと初期化
#

このパートでは、docker-composeサービスをデプロイし、各コンポーネントのステータスを確認します。

ステップ1: リポジトリのクローン
#

git clone https://github.com/aakashnand/trino-ranger-demo.git

ステップ2: docker-composeのデプロイ
#

$ cd trino-ranger-demo
$ docker-compose up -d

docker-composeを使用してサービスをデプロイすると、docker-compose psで確認できるように、4つの実行中のサービスが表示されるはずです。

ステップ3: サービスの確認
#

TrinoとRanger-Adminサービスが以下のURLでアクセス可能であることを確認しましょう

Ranger Admin: http://localhost:6080

Trino: http://localhost:8080

Elasticsearch: http://localhost:9200

ステップ4: Ranger-AdminからTrinoサービスの作成
#

Ranger-Admin UIにアクセスして、adminユーザーとしてログインしましょう。上記のranger-admin-install.propertiesファイルで管理者ユーザーパスワードrangeradmin1を設定しました。以下のスクリーンショットで見られるように、デフォルトではtrinoサービスはありません。したがって、trinoという名前のサービスを作成しましょう。サービス名は**install.properties**で定義された名前と一致する必要があります

JDBC文字列のホスト名に注意してください。ranger-adminコンテナーからtrinoはmy-localhost-trinoとして到達可能であるため、ホスト名はmy-localhost-trinoとして設定されています

Test Connectionをクリックすると、以下のようにConnection Failedエラーが表示されます。これは、Ranger-Adminプロセスが既に実行中であり、まだ作成していない名前がtrinoのサービスを探しているためです。Addをクリックすると作成されます。

では、trinoサービスを追加して、もう一度Test Connectionをクリックしましょう

これでRanger-AdminはTrinoに正常に接続されました 🎉

ステップ5: Ranger-Auditログの確認
#

監査ログを確認するには、上部ナビゲーションバーから監査に移動し、Auditをクリックします。監査ログが表示されていることがわかります 🎉。Ranger-AdminとElasticsearchが正しく機能しています。

第三部: 実際に見てみよう
#

セットアップが完了したので、実際にアクセスポリシーを作成してアクションで見てみましょう

  • trinoサービスを作成する際に、接続情報でユーザー名としてranger-adminを使用しました。これにより、このユーザー名でデフォルトのポリシーが作成され、ranger-adminユーザーにはスーパー権限が与えられます

アクセスシナリオを理解し、アクセスポリシーを作成するには、テストユーザーを作成する必要があります。Ranger user-syncサービスは、Unix、File、AD/LDAPなどのさまざまなソースからユーザー、グループ、およびグループメンバーシップをRangerに同期します。Ranger user-syncは、AD/LDAPからユーザー、グループ、およびグループメンバーシップを同期するための豊富で柔軟な設定プロパティを提供します。このチュートリアルでは、Ranger-Admin UIからテストユーザーを手動で作成します。

ステップ1: Ranger-Adminからtest-userを作成
#

ユーザーを作成するには、Settings → Users/Groups/Roles → Add New Userに移動しましょう

ユーザーを作成する際には、異なる役割を選択できます。

  • user役割は通常のユーザーです

  • Admin役割は、Ranger Admin UIからポリシーを作成および管理できるユーザーです。

  • Auditor役割は、read-onlyのユーザー役割です。

今のところ、Admin役割のユーザーを作成しましょう。

ステップ2: test-userranger-adminのアクセスを確認
#

ranger-adminユーザーのアクセスを確認しましょう

見ての通り、ranger-adminユーザーはtpch.sf10スキーマのすべてのテーブルにアクセスできます

test-userに対して何のポリシーも設定していない場合、カタログにアクセスしたり、クエリを実行しようとすると、アクセス拒否メッセージが表示されるはずです。 Trino CLIからクエリを実行してこれを確認しましょう

ステップ3: tpch.sf10スキーマのすべてのテーブルへのアクセスをtest-userに許可
#

tpch.sf10すべてのテーブルにtest-userへのアクセスを許可するポリシーを作成しましょう。

各ポリシーに特定の権限を割り当てることもできますが、今のところ、すべての権限を持つポリシーを作成しましょう。このポリシーを作成した後、以下のようにアクティブなポリシーがあります。

では、もう一度アクセスを確認しましょう。

まだアクセス拒否メッセージが表示されています。これは、Trino rangerポリシーが各オブジェクトレベルに対して設定する必要があるためです。たとえば、catalogレベルのポリシー、catalog+schemaレベルのポリシー、catalog+schema+tableレベルのポリシー、information_schemaポリシーです。catalogレベルのポリシーを追加しましょう。

Trino CLIで再度確認しましょう

エラーが引き続き発生していますが、エラーメッセージが異なります。Ranger監査セクションに移動して詳細を理解しましょう。

tpch.information_schema.tables.table_schemaというリソースへのアクセス許可が拒否されたエントリが見られます。Trinoでは、information_schemaはテーブルとテーブル列に関するメタデータが含まれているスキーマです。したがって、information_schemaに対するポリシーも追加する必要があります。Trinoでクエリを実行するためには、任意のユーザーにinformation_schemaへのアクセスが必要です。したがって、Rangerポリシーで{USER}変数を使用して、すべてのユーザーにアクセスを許可できます。

Trino CLIからもう一度アクセスを確認しましょう。

SQL関数を実行しようとすると、引き続きアクセス拒否が発生します。デフォルトポリシーのセクションで、all-functionsポリシー(ID:3)は、SQL関数を実行するアクセスを許可するポリシーです。SQL関数の実行はすべてのユーザーにとって要件であるため、all-functionsポリシー(ID:3)を編集し、関数へのアクセスを許可するために{USER}変数を使用してすべてのユーザーを追加しましょう。

まとめると、sf10スキーマのすべてのテーブルにtest-userへのアクセスを許可するために、3つの新しいポリシーを追加し、デフォルトのall-functionポリシーを編集しました。

これで、sf10スキーマのすべてのテーブルにアクセスしてクエリを実行できます。

次のステップでは、sf10スキーマの特定のテーブルへのtest-userへのアクセスを理解しましょう。

ステップ4: sf10スキーマの特定のテーブルへのアクセスを許可
#

前のステップで、sf10スキーマのすべてのテーブルへのアクセスを許可するためにポリシーを設定しましたので、schema-levelのポリシーは必要ありませんでした。特定のスキーマへのアクセスを許可するには、schema-levelのポリシーを追加し、その後table-levelのポリシーを設定できます。では、tpch.sf10schema-levelポリシーを追加しましょう。

次に、sf10-all-tables-policyをすべてのテーブルから特定のテーブルへと編集しましょう。nationテーブルのみへのアクセスを許可するポリシーを設定します。

最終的に、以下のようにアクティブなポリシーがあります。

では、Trino CLIからtest-userで再度クエリを実行しましょう。

test-userは、tpch.sf10スキーマのnationテーブルのみにアクセスできるようになりました。

すべてのステップをフォローしてこの終わりに到達した場合、おめでとうございます㊗️、TrinoとApache Rangerを設定する方法を理解しました。

第三部: 主なポイントと結論
#

  • PrestoSQLからTrinoへのリブランド後、Apache RangerのGitHubリポジトリのデフォルトプラグインは、まだ古いio.prestosqlパッケージを参照しているため、新しいTrinoで機能しません。この問題はJIRA こちらで追跡できます。

  • 新しいRangerバージョン2.2.0では、リブランドされたTrinoプラグインは利用できません。その間、ソースコードからApache Rangerをビルドするために このGitHubリポジトリを自由に使用し、Trino-Ranger統合を始めるために このGitHubリポジトリを使用してください。

  • TrinoのRangerポリシーを設定することは直感的ではありません。なぜなら、各レベルに対してアクセスポリシーを設定する必要があるからです。これに関するTrinoのリポジトリのオープンイシューが こちらにあります。

  • それにもかかわらず、information_schemaおよびall-functionsなどのいくつかの基本的なポリシーを{USER}変数を使用して設定することをお勧めします。これらのポリシーは、任意のユーザーがクエリを実行するために必要です。

良いドキュメントの欠如と統合プロセスの直感的でない性質のために、Apache RangerとTrinoの統合は難しいかもしれませんが、この記事が少しでも簡単にすることを願っています。Trinoを使用している場合は、より詳細な議論のために Trino Community Slackに参加することを強くお勧めします。読んでいただきありがとうございます。