免責事項:このブログに表明されたすべての意見や見解は著者のみのものであり、著者の雇用主や他の団体、個人に必ずしも属するものではありません。この記事はいかなるクラウド/データ管理プラットフォームのプロモーションではありません。すべての画像とコードスニペットはAzure/Databricksのウェブサイトで公開されています。
私の他のDZoneの記事では、Databricks Unity Catalogが何であるか、ユニティカタログにおける特権モデルの仕組み、スキーマレベル、およびカタログとスキーマレベルの両方での権限管理を自動化するためのスクリプトについて説明しました。
この記事では、ユニティカタログのテーブルレベルでの権限管理を自動化するためのスクリプトを提供することを目的としています。
ユニティカタログテーブルレベルの特権
ユニティカタログ(Databricks)では、特定のテーブルやビューへのアクセスを制御したい場合、スキーマ内のすべてのオブジェクトに対して権限を適用するのではなく、テーブルレベルで権限を適用する必要があります。テーブルレベルの権限は、以下のシナリオにおいて有用です:
1. 粒度の高いアクセス制御
特定のテーブルやビューへのアクセスを付与または制限する必要がある場合、スキーマ全体に影響を与えずに行うことができます。
これは、スキーマに機密データが含まれている場合、特定のテーブルへのアクセスを許可し、他のテーブルへのアクセスを制限したいときに特に重要です。
2. 機密データの保護
スキーマ内の特定のテーブルに機密または制限されたデータ(例:個人を特定できる情報、財務データ)が含まれている場合、テーブルレベルの権限を適用して、認可されたユーザーのみがこれらのテーブルを表示または照会できるようにすることができます。
たとえば、一部の要約または集約データテーブルへのアクセスを許可する一方で、機密情報を含む生データや詳細テーブルへのアクセスを制限することが考えられます。
3. 特定のチーム/ユーザーへのアクセスの委任(スキーマが複数のチーム向けのテーブルを含む場合)
異なるユーザーまたはチームが同じスキーマ内の異なるテーブルへのアクセスを必要とする場合です。たとえば、営業チームは顧客関連のテーブルへのアクセスが必要な一方で、財務チームは収益テーブルへのアクセスが必要です。
テーブルレベルで権限を適用することで、各チームは自分の業務に関連するテーブルにのみアクセスできるようになります。
4. データガバナンスの遵守
厳格なデータガバナンスポリシーを実施する際には、より詳細なレベル(個々のテーブルまで)でアクセスを制御する必要があるかもしれません。テーブルレベルの権限は、ユーザーまたはロールが作業することを許可されたデータのみへのアクセスを付与することで、遵守を確保するのに役立ちます。
5. スキーマ内の混合アクセスニーズの処理
スキーマに機密性や機密度の異なるテーブルが含まれる場合、スキーマレベルで権限を適用すると広すぎる場合があります。テーブルレベルの権限を使用すると、特定のニーズに基づいて各テーブルに個別にアクセスを管理できます。
テーブルレベルで適用できる権限
- SELECT: テーブルへの読み取りアクセスを許可し、ユーザーがクエリを実行できるようにします。
- MODIFY: オブジェクトにデータを追加、削除、および変更する権限を与えます。
- APPLY TAG: オブジェクトにタグを適用する権限を与えます。
- ALL PRIVILEGES: すべての権限を与えます。
自動化スクリプト
前提条件
- Unityカタログがすでに設定されていること。
- 主体がDatabricksワークスペースに関連付けられていること。
- 権限スクリプトを実行するユーザーが、テーブル、スキーマ、およびカタログに適切な権限を持っていること。
ステップ1:ノートブックを作成し、変数を宣言する
Databricksワークスペースにノートブックを作成します。ワークスペースにノートブックを作成するには、サイドバーの「+」をクリックし、新規を選択し、ノートブックを選択します。
ワークスペースに空のノートブックが開きます。ノートブックの言語がPythonに選択されていることを確認してください。
ノートブックセルに以下のコードスニペットをコピーして貼り付け、セルを実行してください。
catalog = 'main' # Specify your catalog name
schema = 'default' # Specify your schema name
tables_arr= 'test1,test2' # Specify the Comma(,) seperated values of table name
tables = tables_arr.split(',')
principals_arr = '' # Specify the Comma(,) seperated values for principals in the blank text section (e.g. groups, username)
principals = principals_arr.split(',')
privileges_arr = 'SELECT,APPLY TAG' # Specify the Comma(,) seperated values for priviledges in the blank text section (e.g. SELECT,APPLY TAG)
privileges = privileges_arr.split(',')
ステップ2: カタログとスキーマを設定
以下のコードブロックをコピーして新しいセルに貼り付け、セルを実行してください。
query = f"USE CATALOG `{catalog}`" #Sets the Catalog
spark.sql(query)
query = f"USE SCHEMA `{schema}`" #Sets the Schema
spark.sql(query)
ステップ3: プリンシパルと権限をループ処理し、カタログ、スキーマ、テーブルに権限を適用
以下のコードブロックをコピーして新しいセルに貼り付け、セルを実行して権限を適用してください。
for principal in principals:
query = f"GRANT USE_CATALOG ON CATALOG `{catalog}` TO `{principal}`" # Use catalog permission at Catalog level
spark.sql(query)
query = f"GRANT USE_SCHEMA ON SCHEMA `{schema}` TO `{principal}`" # Use schema permission at Schema level
spark.sql(query)
for table in tables:
for privilege in privileges:
query = f"GRANT `{privilege}` ON `{table}` TO `{principal}`" # Grant priviledges on the tables to the pricipal
print(query)
spark.sql(query)
検証
Databricks UIを開き、「データエクスプローラ」で「カタログ」に移動して権限を検証できます。カタログがデータセクションに表示されたら、カタログをクリックし、スキーマを展開して権限を適用したスキーマ内のテーブルを選択し、「権限」タブに移動します。テーブルに適用されたすべての権限が表示されます。以下は、メインカタログとinformation_schema
スキーマ内のout-of-boxカタログテーブルに適用された権限のスクリーンショットです。
検証の一環として、ノートブックで以下のSQLスクリプトを実行してテーブルのすべての権限を表示することもできます。
SHOW GRANTS ON TABLE table_name;
結論
Databricks Unity Catalogにおけるテーブルレベルの権限管理の自動化は、Unity Catalog内の最も低いレベルでの権限適用を一貫して効率的に行うのに役立ちます。提供されたコードは、単一のカタログとスキーマ内で複数のプリンシパルとテーブルに対して複数のテーブルレベルの権限を割り当てる実用的な方法を示しています。100以上のテーブルが存在し、異なるプリンシパルに対して異なる権限を提供する必要があるカタログでは、上記の自動化により手動のエラーと労力が大幅に削減されます。
Source:
https://dzone.com/articles/automate-databricks-unity-catalog-permissions-at-table-level