【Databricks】Unity Catalogの権限管理を整理してみた

# 背景・目的
Unity Catalogでの権限管理の挙動が、整理したいと思います。

# まとめ
下記の特徴があります。
|特徴 | 説明|
|:--|:--|
|設定可能な方法|・カタログエクスプローラー<BR>・ノートブックのSQLステートメント<BR>・Databricks SQLクエリ<BR>・Unity Catalog REST API<BR>・Terraform|
|管理者権限を付与できるロール|・Databricksアカウント管理者<BR>・ワークスペース管理者<BR>・メタストア管理者|
|オブジェクト所有者|オブジェクト所有者は、他のプリンシパルに特権を付与する事も含めて、そのオブジェクトに対する全ての特権を持つ|
|Unity Catalogの特権付与できるロール|・メタストア管理者<BR>・オブジェクトの所有者<BR>・オブジェクトを含むカタログまたはスキーマの所有者|
|特権の継承|特権は継承される。<BR>・カタログ<BR>・スキーマ|
|基本オブジェクト権限|・オブジェクト所有者またはメタストア管理者は、オブジェクトのすべての許可を一覧表示できる<BR>・カタログやスキーマの所有者は、配下のオブジェクトに対する許可を確認できる|

## 権限管理
権限管理を下記に整理します。


|権限 |内容|対象|前提|継承|
|:--|:--|:--|:--|:--|
|ALL PRIVILEGES|すべての特権を付与|・CATALOG<BR>・EXTERNAL LOCATION<BR>・STORAGE CREDENTIAL<BR>・SCHEMA<BR>・FUNCTION<BR>・REGISTERED MODEL<BR>・TABLE<BR>・VIEW<BR>・VOLUME|
|APPLY TAG|オブジェクトにタグを<BR>追加および編集|・CATALOG<BR>・SCHEMA<BR>・REGISTERED MODEL<BR>・TABLE<BR>・VIEW|※1|
|CREATE CATALOG|Unity Catalog メタストアに<BR>カタログを作成|・Unity Catalog metastore|
|CREATE CONNECTION|レイクハウスフェデレーションシナリオで<BR>外部データベースへの接続を作成|・Unity Catalog metastore|
|CREATE EXTERNAL LOCATION|外部ロケーションを作成|・Unity Catalog metastore<BR>・STORAGE CREDENTIAL|
|CREATE EXTERNAL TABLE|クラウド テナントに<BR>外部テーブルを直接作成|・EXTERNAL LOCATION<BR>・STORAGE CREDENTIAL|
|CREATE EXTERNAL VOLUME|外部ロケーションを使用して<BR>外部ボリュームを作成|・EXTERNAL LOCATION|
|CREATE FOREIGN CATALOG|レイクハウス フェデレーション シナリオで<BR>、外部データベースへの接続を使用して外部カタログを作成|・CONNECTION|
|CREATE FUNCTION|スキーマに関数を作成|・SCHEMA<BR>・CATALOG|※1|◯|
|CREATE MODEL|スキーマに MLflow 登録済みモデルを作成|・SCHEMA<BR>・CATALOG|※1|◯|
|CREATE MANAGED STORAGE|カタログ レベルまたは<BR>スキーマ レベルでマネージ テーブルを格納する場所を指定し、メタストアの既定のルート ストレージをオーバーライド|・EXTERNAL LOCATION|
|CREATE SCHEMA|スキーマを作成|・CATALOG|※1|
|CREATE STORAGE CREDENTIAL| Unity Catalog メタストアにストレージ資格情報を作成|・Unity Catalog metastore|
|CREATE TABLE|スキーマにテーブル<BR>またはビューを作成|・SCHEMA<BR>・CATALOG|※1|◯|
|CREATE VOLUME|スキーマにボリュームを作成|・SCHEMA<BR>・CATALOG|※1|◯|
|EXECUTE|ユーザー定義関数を呼び出したり、<BR>推論のためにモデルをロード|・FUNCTION<BR>・REGISTERED MODEL|※1|◯|
|MANAGE ALLOWLIST|許可リスト内の initScript、JAR、<BR>および Maven 座標のパスを追加または変更|・Unity Catalog metastore|
|MODIFY|データを追加、更新、および削除|・TABLE|※1|◯|
|READ FILES|クラウドオブジェクトストレージから<BR>直接ファイルを読み取る|・VOLUME<BR>・EXTERNAL LOCATION|
|READ VOLUME|ボリューム内に格納されている<BR>ファイルとディレクトリを読み取る|・VOLUME<BR>・SCHEMA<BR>・CATALOG|※1|◯|
|SELECT|テーブルまたはビューから参照|・TABLE<BR>・VIEW<BR>・SHARE|※1|◯|
|USE CATALOG|ユーザーがカタログ内の任意のオブジェクトと<BR>対話するために必要|・CATALOG|
|USE CONNECTION|レイクハウス フェデレーション シナリオで<BR>外部データベースへの接続に関する詳細を一覧表示および表示|・CONNECTION|
|USE SCHEMA|ユーザーがスキーマ内の任意のオブジェクトと<BR>対話するために必要|・SCHEMA<BR>・CATALOG|
|WRITE FILES|クラウドオブジェクトストレージにファイルを<BR>直接書き込める|・VOLUME<BR>・EXTERNAL LOCATION|
|WRITE VOLUME|ボリューム内に格納されているファイルと<BR>ディレクトリを追加、削除、または変更|・VOLUME<BR>・SCHEMA<BR>・CATALOG|※1|◯|

※1 USE CATALOGとUSE SCHEMAを持っている必要がある。

# 概要
[Unity Catalogで権限を管理する](https://docs.databricks.com/ja/data-governance/unity-catalog/manage-privileges/index.html)を元に整理します。


> アクセス制御は、 カタログ エクスプローラー、ノートブックの SQL ステートメント、Databricks SQL クエリー、Unity Catalog REST API、または Terraform を使用して設定できます。

- アクセス制御は、下記を利用して設定が可能
    - カタログエクスプローラー
    - ノートブックのSQLステートメント
    - Databricks SQLクエリ
    - Unity Catalog REST API
    - Terraform

> 最初は、ユーザーはメタストア内のデータにアクセスできません。アクセスは、メタストア管理者、オブジェクトの所有者、またはオブジェクトが格納されたカタログまたはスキーマの所有者のいずれかが許可できます。

- 最初は、メタストア内のデータにアクセスできないため、下記のロールが許可する
    - メタストア管理者
    - オブジェクトの所有者
    - オブジェクトが格納されたカタログ、スキーマの所有者のいずれか

## 管理者権限
> Databricks アカウント管理者、ワークスペース管理者、メタストア管理者には、Unity Catalog を管理するための既定の特権があります。

- 管理者権限は、下記のロールが付与できる
    - Databricksアカウント管理者
    - ワークスペース管理者
    - メタストア管理者




## オブジェクトの所有権
> Unity Catalog 内のすべてのセキュリティ保護可能なオブジェクトには所有者があります。オブジェクト所有者は、他のプリンシパルに特権を付与する機能を含め、そのオブジェクトに対するすべての特権を持ちます。

- オブジェクト所有者は、他のプリンシパルに特権を付与する事も含めて、そのオブジェクトに対する全ての特権を持つ

### Unity Catalog オブジェクトの所有権を管理する
[Unity Catalog オブジェクトの所有権を管理する](https://docs.databricks.com/ja/data-governance/unity-catalog/manage-privileges/ownership.html)を下に整理します。

> Unity Catalog 内のセキュリティ 保護可能な各オブジェクト には所有者がいます。 所有者は、プリンシパルと呼ばれる任意のユーザー、サービスプリンシパル、またはアカウントグループにすることができます。 オブジェクトを作成するプリンシパルが、その初期所有者になります。 オブジェクトの所有者は、他のプリンシパルに権限を付与する権限に加えて、テーブルに対する SELECT や MODIFY など、オブジェクトに対するすべての権限を持っています。 オブジェクトの所有者は、オブジェクトをドロップできます。

- Unity Catalogのオブジェクトには所有者がいる
- 所有者はプリンシパルとして下記に分類できる
    - 任意のユーザ
    - サービスプリンシパル
    - アカウント
- オブジェクト所有者は、下記が可能
    - 他のプリンシパルに権限を付与する事ができる
    - テーブルに対してすべての権限を有している
    - Dropができる

#### 所有者の権限
> オブジェクトの所有者には、そのオブジェクトに対するすべての権限が自動的に付与されます。 さらに、オブジェクト所有者は、オブジェクト自体とそのすべての子オブジェクトに対する特権を付与できます。 つまり、スキーマの所有者は、スキーマ内のテーブルに対するすべての権限を自動的に付与するわけではありませんが、スキーマ内のテーブルに対する権限を自分自身に付与できます。

- オブジェクトの所有者は、そのオブジェクトに対する全ての権限が自動的に付与される
- その全ての子オブジェクトに対して、自分自身で付与できる

#### メタストアとカタログの所有権
> メタストア管理者は、メタストアの所有者です。 メタストア管理者は、メタストア管理者ロールを転送することで、メタストアの所有権を再割り当てできます

- メタストア管理者は、メタストア所有権を再割り当てできる

> ワークスペースで Unity Catalog が自動的に有効になった場合、ワークスペースはデフォルトによってメタストアにアタッチされ、メタストア内のワークスペースのワークスペース カタログが作成されます。 ワークスペース管理者はデフォルトの所有者であり、ワークスペースカタログの所有権を再割り当てできます。 デフォルトによって割り当てられるメタストア管理者はいませんが、アカウント管理者は必要に応じてメタストア管理者のアクセス許可を付与できます。

- ワークスペース管理者はデフォルトの管理者
- 再割り当て可能


## Unity Catalog 特権
> アクセス権限は、メタストア管理者、オブジェクトの所有者、またはオブジェクトを含むカタログまたはスキーマの所有者のいずれかが付与できます。 Unity Catalog 権限とセキュリティ保護可能なオブジェクトを参照してください。

- アクセス権は、下記のロールが付与できる
    - メタストア管理者
    - オブジェクトの所有者
    - オブジェクトを含むカタログまたはスキーマの所有者

### Unity Catalog 特権とセキュリティ保護可能なオブジェクト
[Unity Catalog 特権とセキュリティ保護可能なオブジェクト](https://docs.databricks.com/ja/data-governance/unity-catalog/manage-privileges/privileges.html#unity-catalog-privileges-and-securable-objects)を元に整理します。

#### 誰が権限を管理できますか?
> 特権は、メタストア管理者、オブジェクトの所有者、またはオブジェクトを含むカタログまたはスキーマの所有者によって付与できます。

> ワークスペースで Unity Catalog が自動的に有効になった場合、ワークスペースはデフォルトによってメタストアにアタッチされ、メタストア内のワークスペースのワークスペース カタログが作成されます。 ワークスペース管理者は、ワークスペースカタログのデフォルト所有者です。 所有者は、ワークスペースカタログとすべての子オブジェクトに対する権限を管理できます。

> すべてのワークスペース・ユーザーには、ワークスペース・カタログに対する USE CATALOG 特権が付与されます。 ワークスペース・ユーザーは、カタログ内のdefault・スキーマに対するUSE SCHEMA、CREATE TABLE、CREATE VOLUME、CREATE MODEL、CREATE FUNCTION、CREATE MATERIALIZED VIEW特権も受け取ります。

#### 権限を管理する方法
> メタストア オブジェクトの特権は、SQL コマンド、 Unity Catalog CLI (レガシ)、またはカタログ エクスプローラーを使用して管理できます。 カタログ エクスプローラーを使用して特権を管理する方法については、「 カタログ エクスプローラーで Unity Catalog のアクセス許可を管理する」を参照してください。


SQL で特権を管理するには、次の構文を使用して、ノートブックまたは Databricks SQL クエリー エディターで GRANT ステートメントと REVOKE ステートメントを使用します。

#### 一般的な Unity Catalog 特権タイプ
##### ALL PRIVILEGES

適用可能なオブジェクトタイプは下記の通り。

- CATALOG
- EXTERNAL LOCATION
- STORAGE CREDENTIAL
- SCHEMA
- FUNCTION
- REGISTERED MODEL
- TABLE
- VIEW
- VOLUME

##### APPLY TAG
- オブジェクトにタグを追加および編集することを許可する
- テーブルまたはビューに APPLY TAG を付与すると、列のタグ付けも有効になる
- 親カタログに対する USE CATALOG 特権と、親スキーマに対する USE SCHEMA 特権を持っている必要がある
- 適用可能なオブジェクトタイプは下記の通り
    - CATALOG
    - SCHEMA
    - REGISTERED MODEL
    - TABLE
    - VIEW

##### CREATE CATALOG
- ユーザーが Unity Catalog メタストアにカタログを作成できる
- 適用可能なオブジェクトタイプは下記の通り
    - Unity Catalog metastore

##### CREATE CONNECTION
- レイクハウスフェデレーションシナリオで外部データベースへの接続を作成できる
- 適用可能なオブジェクトタイプは下記の通り
    - Unity Catalog metastore

##### CREATE EXTERNAL LOCATION
- 外部ロケーションを作成する
- 適用可能なオブジェクトタイプは下記の通り
    - Unity Catalog metastore
    - STORAGE CREDENTIAL

##### CREATE EXTERNAL TABLE
- 外部ロケーションまたはストレージ資格情報を使用して、クラウド テナントに外部テーブルを直接作成する
- Databricks では、ストレージ資格情報ではなく外部ロケーションにこの特権を付与することを推奨している
- 適用可能なオブジェクトタイプは下記の通り
    - EXTERNAL LOCATION
    - STORAGE CREDENTIAL

##### CREATE EXTERNAL VOLUME
- 外部ロケーションを使用して外部ボリュームを作成する
- 適用可能なオブジェクトタイプは下記の通り
    - EXTERNAL LOCATION

##### CREATE FOREIGN CATALOG
- レイクハウス フェデレーション シナリオで、外部データベースへの接続を使用して外部カタログを作成する
- 適用可能なオブジェクトタイプは下記の通り
    - CONNECTION

##### CREATE FUNCTION
- ユーザーがスキーマに関数を作成する
- 特権は継承されるため、CREATE FUNCTION カタログにも付与できる
- 親カタログに対する USE CATALOG 特権と、親スキーマに対する USE SCHEMA 特権を持っている必要がある
- 適用可能なオブジェクトタイプは下記の通り
    - SCHEMA
    - CATALOG

##### CREATE MODEL
- スキーマに MLflow 登録済みモデルを作成できる
- 特権は継承されるため、カタログに CREATE MODEL を付与することもできる
- 親カタログに対する USE CATALOG 特権と、親スキーマに対する USE SCHEMA 特権を持っている必要がある
- 適用可能なオブジェクトタイプは下記の通り
    - SCHEMA
    - CATALOG

##### CREATE MANAGED STORAGE
- カタログ レベルまたはスキーマ レベルでマネージ テーブルを格納する場所を指定し、メタストアの既定のルート ストレージをオーバーライドできる
- 適用可能なオブジェクトタイプは下記の通り
    - EXTERNAL LOCATION

##### CREATE SCHEMA
- ユーザーがスキーマを作成できる
- カタログに対する USE CATALOG 特権も持っている必要がある
- 適用可能なオブジェクトタイプは下記の通り
    - CATALOG

##### CREATE STORAGE CREDENTIAL
- Unity Catalog メタストアにストレージ資格情報を作成できる
- 適用可能なオブジェクトタイプは下記の通り
    - Unity Catalog メタストア

##### CREATE TABLE
- スキーマにテーブルまたはビューを作成できる
- 特権は継承されるため、カタログに対して CREATE TABLE を付与することもできる
- 親カタログに対する USE CATALOG 特権と、親スキーマに対する USE SCHEMA 特権を持っている必要がある
- 適用可能なオブジェクトタイプは下記の通り
    - SCHEMA
    - CATALOG

##### CREATE VOLUME
- スキーマにボリュームを作成できる
- 特権は継承されるため、カタログに CREATE VOLUME を付与することもできる
- 親カタログに対する USE CATALOG 特権と、親スキーマに対する USE SCHEMA 特権を持っている必要がある
- 適用可能なオブジェクトタイプは下記の通り
    - SCHEMA
    - CATALOG

##### EXECUTE
- ユーザーはユーザー定義関数を呼び出したり、推論のためにモデルをロードできる
    - 関数の場合、 EXECUTE 関数は、関数定義とメタデータを表示する権限を付与する
    - 登録済みモデルの場合、 EXECUTE は、登録済みモデルのすべてのバージョンのメタデータを表示し、モデル ファイルをダウンロードする権限を付与する
- 親カタログに対する USE CATALOG 特権と、親スキーマに対する USE SCHEMA 特権を持っている必要がある
- 適用可能なオブジェクトタイプは下記の通り
    - FUNCTION
    - REGISTERED MODEL

##### MANAGE ALLOWLIST
- 共有アクセス モードで Unity カタログ対応クラスターを管理する許可リスト内の initScript、JAR、および Maven 座標のパスを追加または変更できる
- 適用可能なオブジェクトタイプは下記の通り
    - Unity Catalog メタストア

##### MODIFY
- ユーザーがテーブルに対して SELECT 、親カタログに USE CATALOG 、親スキーマに USE SCHEMA を持っている場合、ユーザーがテーブルに対してデータを追加、更新、および削除できる
- 適用可能なオブジェクトタイプは下記の通り
    - TABLE

##### READ FILES
- クラウドオブジェクトストレージから直接ファイルを読み取る
- Databricks では、ボリュームに対してこの特権を付与し、限られたユース ケースでは外部の場所に付与することを推奨
- 適用可能なオブジェクトタイプは下記の通り
    - VOLUME
    - EXTERNAL LOCATION

##### READ VOLUME
- ユーザーが親カタログにも USE CATALOG し、親スキーマにも USE SCHEMA がある場合、ボリューム内に格納されているファイルとディレクトリを読み取ることができる
- 適用可能なオブジェクトタイプは下記の通り
    - VOLUME
    - SCHEMA
    - CATALOG

##### SELECT
- ユーザーはテーブルまたはビューから選択できるようになる
- 適用可能なオブジェクトタイプは下記の通り
    - TABLE
    - VIEW
    - SHARE

##### USE CATALOG
- スキーマ自体へのアクセスを許可しませんが、ユーザーがスキーマ内の任意のオブジェクトと対話するために必要
- 適用可能なオブジェクトタイプは下記の通り
    - SCHEMA
    - CATALOG

##### USE CONNECTION
- レイクハウス フェデレーション シナリオで外部データベースへの接続に関する詳細を一覧表示および表示できる
- 接続に対する CREATE FOREIGN CATALOG または接続の所有権が必要
- 適用可能なオブジェクトタイプは下記の通り
    - CONNECTION

##### USE SCHEMA
- スキーマ自体へのアクセスを許可しませんが、ユーザーがスキーマ内の任意のオブジェクトと対話するために必要
- ユーザーはそのテーブルに対する SELECT 権限を持ち、その親スキーマとその親カタログに対する USE CATALOG USE SCHEMA 必要
- 適用可能なオブジェクトタイプは下記の通り
    - SCHEMA
    - CATALOG

##### WRITE FILES
- クラウドオブジェクトストレージにファイルを直接書き込める
- Databricks では、ボリュームに対してこの特権を付与することを推奨
- 適用可能なオブジェクトタイプは下記の通り
    - VOLUME
    - EXTERNAL LOCATION

##### WRITE VOLUME
- ボリューム内に格納されているファイルとディレクトリを追加、削除、または変更できるようにする
- 適用可能なオブジェクトタイプは下記の通り
    - VOLUME
    - SCHEMA
    - CATALOG


## 特権の継承
> Unity Catalog 内のセキュリティ保護可能なオブジェクトは階層構造であり、特権は下位に継承されます。つまり、カタログに対する特権を付与すると、カタログ内の現在および将来のすべてのオブジェクトに特権が自動的に付与されます。 同様に、スキーマに付与された権限は、そのスキーマ内の現在および将来のすべてのオブジェクトに継承されます。

- 特権は下位に継承される
- 例）
    - カタログに対する特権を付与すると、カタログ内のオブジェクトに特権が自動的に付与される
    - スキーマに付与された権限は、そのスキーマ内のオブジェクトに継承される

## 基本オブジェクト権限
> Unity Catalog では、カタログ、スキーマ、表、ビュー、および関数に対する特権を管理するための SQL キーワード SHOW、GRANT、および REVOKE がサポートされています。

> オブジェクトの所有者またはメタストア管理者は、オブジェクトのすべての許可を一覧表示できます。 オブジェクトがカタログまたはスキーマ (表やビューなど) 内に含まれている場合、カタログまたはスキーマの所有者は、オブジェクトに対するすべての許可をリストすることもできます。

- オブジェクト所有者またはメタストア管理者は、オブジェクトのすべての許可を一覧表示できる
- カタログやスキーマの所有者は、配下のオブジェクトに対する許可を確認できる

# 考察
今回は、権限を整理してみました。今後、実際に試してみたいと思います。

# 参考
https://docs.databricks.com/ja/data-governance/unity-catalog/manage-privileges/index.html

https://docs.databricks.com/ja/data-governance/unity-catalog/manage-privileges/ownership.html