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-admin、ranger-usersync、ranger-auditの3つの主要なコンポーネントがあります。これらのコンポーネントについて紹介しましょう。
注: このチュートリアルではranger-usersyncの設定は範囲外であり、usersyncコンポーネントは使用しません。
Ranger Admin#
Ranger Adminコンポーネントは、異なるアクセスレベルのポリシーを作成できるUIコンポーネントです。Ranger Adminはバックエンドデータベースを必要とし、この場合、Ranger Admin UIのバックエンドデータベースとしてPostgresを使用しています。
Ranger Audit#
Ranger Auditコンポーネントは、リソースの各アクセスイベントのログを収集して表示します。Rangerはsolrとelasticsearchの2つの監査方法をサポートしています。私たちは、Ranger監査ログを保存するためにelasticsearchを使用し、それをRanger Audit UIでも表示します。
Trino#
Trinoは、高速な分散クエリエンジンです。hive、postgres、oracleなど複数のデータソースに接続できます。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についての重要なポイント
named-docker-volumesを使用しています。例:ranger-es-data、ranger-pg-dataは、elasticsearchやPostgresなどのサービスのデータをコンテナの再起動後も永続化します。Ranger-AdminおよびRanger-Trino Pluginの事前ビルドされたtarファイルは、このデモリポジトリのリリースアセットとしてこちらで利用可能です。
ranger-Adminプロセスは最小限1.5 GBのメモリを必要とします。Ranger-Admin tarファイルには
install.propertiesとsetup.shが含まれています。setup.shスクリプトはinstall.propertiesから設定を読み取ります。次のパッチファイルは、Ranger-Adminコンポーネントのinstall.propertiesのデフォルトバージョンと比較して行われた設定変更を説明しています。
- Ranger-Trino-Plugin tarファイルにも
install.propertiesとenable-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で設定できます。
- Trino Ranger Pluginの
install.propertiesファイルは、次のパッチファイルに示されているように設定する必要があります。docker環境でTrinoがデプロイされていることをenable-plugin-scriptに通知するために、2つの新しく導入されたカスタム変数を使用していることに注意してください。
- 最後に、以下に示すように、すべてを
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-userとranger-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.sf10のschema-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に参加することを強くお勧めします。読んでいただきありがとうございます。
