データのセキュリティと制御性を向上させるために、データ スタックは Ranger によって実装された Spark SQL 権限制御の実践に基づいています。

エンタープライズレベルのアプリケーションでは、データセキュリティとプライバシー保護が非常に重要です。データ スタックの基礎となるコンピューティング エンジンの1 つであるSpark は、データの漏洩や悪用を避けるために、許可された担当者のみがデータにアクセスできるようにする必要があります。Spark SQLによるきめ細かなデータ管理を実現し、データのセキュリティと制御性を向上させるため、Data StackはApache Rangerをベースとしたデータ処理に対するSpark SQLの権限制御を実装しています

この記事は、Apache Spark 2.4.8 と Apache Ranger 2.2 に基づいて原理を説明し、Ranger による Spark SQL 権限制御の実践的な調査に基づいた「 Kangaroo Cloud ワンストップ ビッグ データ 基本ソフトウェア スタック」について説明します。

Ranger に基づいて Spark SQL 権限制御を実装する

Apache Ranger は、 Hadoop エコシステムへの安全なアクセス制御を提供するオープンソースの権限管理フレームワークです。Rangerは、Hadoop、Hive、HBase、Kafka、およびその他のコンポーネントのアクセス制御が組み込まれた、統合データ セキュリティ管理のための拡張可能なフレームワークを開発者に提供します。

Ranger は、開発者が実装する必要がある Spark の権限制御プラグインを提供していません。Ranger データ スタックに基づいて、Spark SQL のライブラリ、テーブル、列、および UDF へのアクセス制御、行レベルの権限制御、およびデータの感度解除が行われます。管理と制御。次に、カスタム Ranger プラグインとSpark SQL Extensions メカニズムの2 つの部分に分けて実装原理を説明します。

カスタムレンジャープラグイン

Ranger に新しいサービスを追加する権限の検証は 2 つの部分に分けることができます: 最初の部分は Ranger の新しいサービス モジュールを追加することであり、2 番目の部分は Ranger権限検証プラグインを新しいサービスに追加することです

● Ranger が新しいサービス モジュールを追加

新しいサービス モジュールを Ranger に追加すると、Ranger Admin Web UI インターフェイスに対応するサービス モジュールが追加されます。これは、対応するリソースの認可ポリシーを対応するサービスに追加するために使用されます。新しいサービス モジュールの追加は、次の 3 つの手順に分かれています。

• 新しいサービスの説明ファイルを定義します。ファイル名は ranger-servicedef-<serviceName>.json です。サービスの名前、ranger 管理 Web インターフェイスに表示される名前、新しいサービス アクセス クラスの定義、およびそれを使用する必要性は、権限をチェックする必要があるリソースのリスト、チェックする必要があるアクセス タイプのリストなど、説明ファイルで定義されます。

ranger-servicedef-<serviceName>.json のコンテンツの主要部分は次のように解析されます。

{
  "id":"服务id,需要保证唯一",
  "name":"服务名",
  "displayName":"在Ranger Admin Web UI上显示的服务名",
  "implClass":"在Ranger Admin内部用于访问新服务的实现类",
  // 定义新服务用于权限校验的资源列表,如Hive中的database、table
  "resources":[
    {
      "itemId": "资源id, 从1开始递增",
      "name": "资源名",
      "type": "资源类型,通常为string和path",
      "level": "资源层级,同一层级的会在一个下拉框展示",
      "mandatory": "是否为必选",
      "lookupSupported": "是否支持检索",
      "recursiveSupported": false,
      "excludesSupported": true,
      "matcher": "org.apache.ranger.plugin.resourcematcher.RangerDefaultResourceMatcher",
      "validationRegEx":"",
      "validationMessage": "",
      "uiHint":"提示信息",
      "label": "Hive Database",
      "description": "资源描述信息"
    }
  ],
  // 定义资源需要进行校验的访问类型列表,如select、create
  "accessTypes":[
    {
      "itemId": "访问类型id, 从1开始递增",
      "name": "访问类型名称",
      "label": "访问类型在Web界面上的显示名称"
    }
  ],
  "configs":[
    {
      "itemId": "配置参数id, 从1开始递增",
      "name": "配置参数名称",
      "type": "参数类型",
      "mandatory": "是否必填",
      "validationRegEx":"",
      "validationMessage": "",
      "uiHint":"提示信息",
      "label": "在Web界面上的显示名称"
    }
  ]
}

• Ranger で新しいサービス モジュールに対応する実装クラスを開発し、ranger-servicedef-<serviceName>.json の implClass フィールドにクラス名を入力します。新しいサービス モジュールの実装クラスは、抽象クラス RangerBaseService を継承する必要があります。RangerBaseService は、Ranger のすべてのサービスの基本クラスです。すべてのサービスが共有および継承できるように、パブリック メソッドとプロパティのセットが定義されています。RangerBaseService は、アクセス制御、リソース管理、監査証跡などの基本機能を提供します。

新しいサービスモジュールの実装クラスの開発は比較的簡単で、RangerBaseServiceを継承し、validateConfigメソッドとlookupResourceメソッドを実装するだけです。validateConfigメソッドはサービスの構成が正しいかどうかを検証するために使用され、lookupResourceメソッドはサービスの構成が正しいかどうかを検証するために使用されます。リソースをロードしています

• 最初の手順と 2 番目の部分が完了したら、設定ファイル ranger-servicedef-<serviceName>.json と新しいサービス モジュールに対応する実装クラス jar パッケージを Ranger Admin の CLASSPATH に配置し、提供されている REST API を使用します。 Ranger Admin によって Ranger

● 新しいサービスに Ranger 権限検証プラグインを追加します。

Ranger の権限検証を新しいサービスに実装するには、対応する権限制御プラグインを開発して新しいサービスに登録する必要があります。プラグインの実装時に、リソースをインターセプトするためのサービス内のエントリ ポイントを見つける必要があります。リクエストにアクセスし、Ranger API を呼び出してアクセスを承認します。次に、Ranger 権限検証プラグインの開発における 4 つの重要なクラスを紹介します。

• RangerBasePlugin: Ranger 権限検証のコア クラス。主にポリシーの取得、ポリシー キャッシュの更新、およびリソース アクセス権限検証の完了を担当します。

• RangerAccessResourceImpl: 認証リソースをカプセル化する実装クラス。このようなクラスは、認証インターフェイスを呼び出すときに構築する必要があります。

• RangerAccessRequestImpl: 認証リソース、ユーザー、ユーザー グループ、アクセス タイプ、その他の情報のカプセル化オブジェクトを含む、リソース アクセスを要求するための実装クラス認証インターフェイス isAccessAllowed を呼び出すときは、RangerAccessRequestImpl をパラメータとして渡す必要があります。

• RangerDefaultAuditHandler: 監査ログ処理クラス

Ranger 権限検証プラグインの実装は、次の手順に分かれています。

• RangerBasePlugin を継承するターゲット クラスを作成します。通常は、ターゲット クラスによって実装されたコンストラクターで親クラスのコンストラクターを呼び出し、対応するサービス タイプ名を入力し、RangerBasePlugin の init メソッドを書き換えて、親クラスを呼び出すだけで済みます。 init メソッド init メソッドを書き換えました。

RangerBasePlugin の init メソッドはポリシー プルを実装し、バックグラウンド スレッドを開始してローカル キャッシュ ポリシーを定期的に更新します。

• 接続クラスを作成します。これは、ターゲット サービスのすべてのリソース要求をインターセプトし、リソース要求認証のために RangerBasePlugin の isAccessAllowed メソッドを呼び出すようにターゲット サービスを構成するために使用されます。Spark SQL が Ranger の権限検証を実装するには、Spark SQL の拡張機能メカニズム (後述) に基づいており、Spark 拡張機能をカスタマイズして Spark に登録し、SQL構文解析段階で生成された抽象構文ツリーを走査することで完了します。リソースへのアクセス用。

Spark SQL 拡張機能のメカニズム

Spark SQL 拡張機能は SPARK-18127 で導入され、Spark ユーザーがカスタム SQL 構文解析、新しいデータ ソースの追加など、SQL 解析のパーサー、アナライザー、オプティマイザー、およびプランナーの段階で拡張機能をカスタマイズできるようにする柔軟なメカニズムを提供します。

ファイル

SparkSessionExtensionsは、Spark SQL Extensions メカニズムのコア クラスです。SparkSessionExtensions は、次のメソッドを含むユーザー定義の拡張ルールを保存します。

• buildResolutionRules: Analyzer の解決フェーズに追加されたビルド拡張ルール

• injectResolutionRule: アナライザーの解決フェーズに拡張ルール ジェネレーターを登録します。

• buildPostHocResolutionRules: Analyzer のポストホック解決フェーズに追加されたビルド拡張ルール

• injectPostHocResolutionRule: 拡張ルール ジェネレーターをアナライザーのポストホック解決ステージに登録します。

• buildCheckRules: 拡張チェック ルールを構築します。分析ステージの後に実行され、LogicalPlan に問題があるかどうかをチェックします。

• injectCheckRule: 拡張チェックルールジェネレーターを登録します。

• buildOptimizerRules: オプティマイザーフェーズで呼び出されて実行される拡張最適化ルールを構築します。

• injectOptimizerRule: 拡張最適化ルール ジェネレーターを登録します。

• buildPlannerStrategies: LogicalPlan を実行可能ファイルに変換するための拡張物理実行計画戦略を構築します。

• injectPlannerStrategy: 拡張物理実行計画戦略ジェネレーターを登録します。

• buildParser: 拡張解析ルールを構築します。

• injectParser: 拡張解析ルールジェネレーターを登録します。

Spark SQL Extensions メカニズムに基づいてカスタム ルールを実装するのは簡単です。まず、Function1[SparkSessionExtensions, Unit] を実装するクラスを作成します。SparkSessionExtensions は関数の入力パラメータとして使用され、SparkSessionExtensions の対応するメソッドが呼び出されてカスタム ルールを登録します。解析ルールを対応する SQL 解析ステージに渡して実行し、作成したクラスをパラメータ spark.sql.extensions を介して Spark に登録します。

データスタックでの Spark SQL 権限制御の実践

Spark は主に、データ スタック内のオフライン データ ウェアハウスシナリオでオフライン データをバッチ処理するために使用されます。ほとんどのシナリオでは、ほとんどのデータは MySQL、Oracle などのビジネス データベースに保存されます。データ スタックでは、最初に ChunJun を使用してデータが収集され、データはビジネス データベースから ODS に同期されます。 Hive ライブラリのレイヤーを抽出し、Hive または Spark エンジンを通じて処理し、データをバッチ計算し、最終的に結果データを ChunJun を通じて対応するビジネス データベースに同期します。

ファイル

対応するビジネス データベースのほとんどはリレーショナル データベースであり、各リレーショナル データベースはすでに非常に完全な権限管理メカニズムを備えていますが、初期のデータ スタックでは、Hive 上のデータのセキュリティ管理が不足していました。各ユーザーが閲覧できるため、データプライバシー保護が欠如しています。

Hive データのセキュリティの問題を解決するために、Ranger を使用して Hive のアクセス許可を制御することにしました。

Ranger は非常に包括的なデータ セキュリティ管理フレームワークであり、ユーザーがアクセス許可とポリシーを設定するための Web UI を提供し、Ranger を使いやすくしています。Ranger には、豊富なセキュリティ関連機能、より細かい制御機能があり、データベース テーブル レベルの権限管理に加え、行レベルのフィルタリングやデータの非感作などの非常に実用的な機能もサポートしています。Ranger の拡張もより柔軟であり、Ranger 上で新しいサービスの権限制御を実装するのも簡単です。

Datastack では、Spark を使用して Hive 内のデータを処理し、Hive は Ranger を使用してデータのアクセス許可を制御するため、データ セキュリティを確保するために、Datastack は Ranger に基づいた Spark SQL アクセス許可制御プラグインを開発しまし

新しいサービス用の Ranger 権限制御プラグインのカスタマイズは 2 つの部分に分かれていると前述しましたが、最初の部分は、Ranger Admin Web UI インターフェイスに対応するサービス モジュールを追加することです。Spark がデータの処理にのみ使用されることを考慮すると、 Hive の場合、権限ポリシーは Hive と一貫している必要があるため、Spark SQL が Ranger に基づいて権限制御プラグインを実装する場合、ホイールを繰り返すのではなく、HADOOP SQL サービス モジュールを直接再利用し、同じポリシーのセットを使用します。 Hive なので、Spark で同じポリシーのセットを使用するだけで済みます。ターミナル側で Ranger の権限管理プラグインを開発します。

ファイル

Spark SQL Extensions メカニズムに基づいて、RangerSparkSQLExtension クラスを作成しました。このクラスでは、SparkSessionExtensions.injectOptimizerRule メソッドを呼び出して SQL 解析のオプティマイザー ステージを登録することにより、優れた認証ルール、行レベルのフィルタリング ルール、およびデータ非感作ルールを実装します。

データ マスキング ルールを例にとると、データ マスキング ルールが一致すると、ルールは論理プランにプロジェクト ノードを追加し、masking_function 関数呼び出しのロジックを追加します。次の図は、ID = 1 の select name from t1 を例として、データ非感作ルールに一致する前後の変化を示しています。

ファイル

要約する

Data Stack は常にデータ セキュリティとプライバシー保護に取り組んでおり、Spark SQL の Ranger ベースの権限制御の実現は、Data Stack のデータ セキュリティの探求の 1 つです。この記事では、Ranger に基づいて Spark SQL 権限検証を実装する原理について説明します。Spark SQL は、Ranger に基づいて、権限管理と制御においてより強力な制御と豊富な機能を備えています。

将来的には、セキュリティの確保を前提に、複数回実行される可能性のある権限検証ルールをSQLオプティマイザに登録するなど、データスタックのさらなるパフォーマンスの最適化が行われ、一部の不要な認証が増加します。今後ともナンバースタックにご注目ください。

「Dutstack 製品ホワイトペーパー」: https://www.dtstack.com/resources/1004?src=szsm

「データ ガバナンス業界実践ホワイト ペーパー」ダウンロード アドレス: https://www.dtstack.com/resources/1001?src=szsm Kangaroo Cloud のビッグデータ製品、業界ソリューション、顧客事例について詳しく知りたい、相談したい場合は、 Kangaroo Cloud 公式 Web サイトにアクセスしてください: https://www.dtstack.com/?src=szkyzg

同時に、ビッグデータのオープンソース プロジェクトに興味のある学生は、最新のオープンソース テクノロジー情報を交換するために「Kangaroo Cloud Open Source Framework DingTalk Technology qun」に参加することを歓迎します。qun 番号: 30537511、プロジェクト アドレス: https: // github.com/DTStack

{{名前}}
{{名前}}

おすすめ

転載: my.oschina.net/u/3869098/blog/8796785