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に参加することを強くお勧めします。読んでいただきありがとうございます。