Unity Catalogにおける権限およびセキュリティ保護可能オブジェクト

[Unity Catalog privileges and securable objects \| Databricks on AWS](https://docs.databricks.com/data-governance/unity-catalog/manage-privileges/privileges.html) [2022/12/14時点]の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

本書ではUnity Catalogにおける権限モデルを説明します。Hiveメタストアとこのモデルの違いについては[Unity CatalogとレガシーHiveメタストアを操作する](https://qiita.com/taka_yayoi/items/befd7538a8a988f847b6)をご覧ください。

:::note
**注意**
本書では権限モデルバージョン1.0におけるUnity Catalog権限と継承モデルを参照します。パブリックプレビュー期間にUnity Catalogメタストアを作成している場合には、[Upgrade to privilege inheritance](https://docs.databricks.com/data-governance/unity-catalog/manage-privileges/upgrade-privilege-model.html)に従うことで、権限モデルバージョン1.0にアップグレードすることができます。
:::

# 権限の管理

権限はメタストア管理者、オブジェクトのオーナー、オブジェクトを格納するカタログやスキーマのオーナーによって許可されます。SQLコマンド、[Unity Catalog CLI](https://docs.databricks.com/dev-tools/cli/unity-catalog-cli.html)、データエクスプローラを用いてメタストアのオブジェクトに対する権限を管理することができます。権限を管理するためにどのようにデータエクスプローラを使うのかに関しては[Manage Unity Catalog permissions in Data Explorer](https://docs.databricks.com/data/manage-permissions.html)をご覧ください。

SQLで権限を管理するには、ノートブックやDatabricks SQLのクエリーエディタで以下の構文を用いて[GRANT](https://docs.databricks.com/sql/language-manual/security-grant.html)や[REVOKE](https://docs.databricks.com/sql/language-manual/security-revoke.html)文を使用します。

```sql:SQL
GRANT privilege_type ON securable_object TO principal
```

ここでは:

- `privilege_type`は[Unity Catalogの権限のタイプ](#unity-catalogの権限タイプ)です。
- `securable_object`は[Unity Catalogにおけるセキュリティ保護可能オブジェクト](#unity-catalogにおけるセキュリティ保護可能オブジェクト)です。
- `principal`はユーザー、サービスプリンシパル(`applicationId`の値で表現されます)、グループです。

例えば、以下のコマンドは`main`という親カタログにある`default`というスキーマにテーブルを作成する権限を`finance`というグループに許可します。

```sql:SQL
GRANT CREATE TABLE ON SCHEMA main.default TO finance;
```

SQLコマンドを用いた権限の付与に関しては、[Privileges and securable objects in Unity Catalog](https://docs.databricks.com/sql/language-manual/sql-ref-privileges.html)をご覧ください。

また、[Databricks Terraform](https://docs.databricks.com/dev-tools/terraform/index.html)や[databricks\_grants](https://registry.terraform.io/providers/databricks/databricks/latest/docs/resources/grants#storage-location-grants)を用いて権限を管理することもできます。

# Unity Catalogにおけるセキュリティ保護可能オブジェクト

セキュリティ保護可能オブジェクトはUnity Catalogメタストアで定義されるプリンシパルに権限を付与可能なオブジェクトです。Unity Catalogにおけるセキュリティ保護可能オブジェクトは階層になっています。
![](https://docs.databricks.com/_images/object-hierarchy.png)

セキュリティ可能オブジェクトは:

- **メタストア:** メタデータのトップレベルのコンテナです。それぞれのUnity Catalogメタストアはデータを整理するために3レベルの名前空間(`catalog.schema.table`)を提供します。
- **カタログ:** オブジェクト階層の最初のレイヤーであり、データアセットを整理するために使用されます。
- **スキーマ:** データベースとも呼ばれるスキーマはオブジェクト階層の2番目のレイヤーでありテーブルとビューを格納します。
- **テーブル:** オブジェクト階層の最下層にあるテーブルは*外部*テーブル(お使いのクラウドストレージの外部ロケーションに格納されます)あるいは*マネージド*テーブル(Databricksで明示的に作成したクラウドストレージのストレージコンテナに格納されます)となります。
- **ビュー:** スキーマに格納される1つ以上のテーブルから作成される読み取り専用のオブジェクトです。
- **外部ロケーション:** Unity Catalogメタストアに含まれるストレージ資格情報とクラウドストレージパスへのリファレンスを格納するオブジェクトです。
- **ストレージ資格情報:** Unity Catalogメタサウトアに含まれるクラウドストレージへのアクセスを提供する長期のクラウド資格情報をカプセル化するオブジェクトです。
- **関数:** スキーマに格納されるユーザー定義関数です。
- **共有:** Delta Sharingを用いた共有を意図したテーブルに対する論理的グループです。共有はUnity Catalogメタストアに格納されます。
- **受信者:** Delta Sharingを用いてデータを共有できる組織、ユーザーグループを識別するオブジェクトです。これらのオブジェクトはUnity Catalogメタストアに格納されます。
- **提供者:** Delta Sharingを用いたデータ共有を可能にする組織を表現するオブジェクトです。これらのオブジェクトはUnity Catalogメタストアに格納されます。

# 継承モデル

Unity Catalogにおけるセキュリティ可能オブジェクトは階層型であり、権限は下流に継承されます。権限が継承される最上位のオブジェクトはカタログです。これは、カタログやスキーマに付与した権限は自動で、現在かつ将来においてカタログ、スキーマに含まれるすべてのオブジェクトに権限が付与されることを意味します。Unity Catalogメタストアに付与された権限は継承されません。

例えば、以下のコマンドはカタログ`main`のすべてのスキーマに存在するすべてのテーブル、ビューに対する`SELECT `権限を`finance`グループに付与します:

```sql:SQL
GRANT SELECT ON CATALOG main TO finance;
```

同様に、アクセスのスコープを小さくするためにスキーマに対する権限付与を行うこともできます。

```sql:SQL
GRANT SELECT ON SCHEMA main.default TO finance;
```

継承モデルはデータに対するデフォルトのアクセスルールをセットアップする簡単な方法を提供します。例えば、以下のコマンドによって、機械学習チームはスキーマにテーブルを作成し、他の人が作成したテーブルを読み込めるようになります。

```sql:SQL
CREATE CATALOG ml;
CREATE SCHEMA ml.team_sandbox;
GRANT USE_CATALOG ON CATALOG ml TO ml_team;
GRANT USE_SCHEMA ON SCHEMA ml.team_sandbox TO ml_team;
GRANT CREATE TABLE ON SCHEMA ml.team_sandbox TO ml_team;
GRANT SELECT ON SCHEMA ml.team_sandbox TO ml_team;
```

# Unity Catalogの権限タイプ

以下のテーブルでは、カタログのそれぞれのセキュリティ可能オブジェクトに対してどの権限タイプが適用されるのかをまとめています。

| セキュリティ可能オブジェクト | 権限 |
|:--|:--|
| メタストア  |  `CREATE CATALOG, CREATE EXTERNAL LOCATION, CREATE RECIPIENT, CREATE SHARE, CREATE PROVIDER` |
| カタログ  | `ALL PRIVILEGES, CREATE SCHEMA, USE CATALOG`<br><br>以下の権限タイプはカタログ内のセキュリティ可能オブジェクトに適用されます。カタログに存在する適切な現在かつ将来のオブジェクトに適用するために、カタログレベルでこれらの権限を付与することができます。<br><br>`CREATE FUNCTION, CREATE TABLE, CREATE VIEW, EXECUTE, MODIFY, SELECT, USE SCHEMA`  |
| スキーマ  | `ALL PRIVILEGES, CREATE FUNCTION, CREATE TABLE, CREATE VIEW, USE SCHEMA`<br><br>以下の権限タイプはスキーマ内のセキュリティ可能オブジェクトに適用されます。スキーマに存在する適切な現在かつ将来のオブジェクトに適用するために、スキーマレベルでこれらの権限を付与することができます。<br><br>`EXECUTE, MODIFY, SELECT`  |
| テーブル  |  `ALL PRIVILEGES, SELECT, MODIFY` |
| ビュー  | `ALL PRIVILEGES, SELECT`  |
| 外部ロケーション  | `ALL PRIVILEGES, CREATE EXTERNAL TABLE, READ FILES, WRITE FILES, CREATE MANAGED STORAGE`  |
| ストレージ資格情報  | `ALL PRIVILEGES, CREATE EXTERNAL LOCATION, CREATE EXTERNAL TABLE, READ FILES, WRITE FILES`  |
| 関数  | `ALL PRIVILEGES, EXECUTE`  |
| 共有  | `SELECT` (`RECIPIENT`に付与することができます)  |
| 受信者  | None  |
| 提供者  | None  |

メタストアで権限を管理する際、SQLコマンドにメタストア名を含めてはいけません。Untiy Catalogはワークスペースにアタッチされたメタストアの権限を付与、剥奪します。例えば、以下のコマンドはワークスペースにアタッチされたメタストアでカタログを作成する権限を`engineering`というグループに付与します。

```sql:SQL
GRANT CREATE CATALOG ON METASTORE TO engineering
```

## ALL PRIVILEGES

**適用可能なオブジェクトタイプ:** `CATALOG, EXTERNAL LOCATION, STORAGE CREDENTIAL, SCHEMA, FUNCTION, TABLE, VIEW`

明示的に指定することなしに、セキュリティ可能オブジェクトとその子供の部ジェクトに適用可能なすべての権限を付与、剥奪するために使用されます。これは、アクセス権チェックが行われた際に利用可能なすべてのアクセス権を展開します。

:::note
**注意**
この権限は階層の高次レベルで適用された際にはパワフルなものとなります。例えば、`ALL PRIVILEGES ON CATALOG main TO analysts`はカタログのすべてのオブジェクト(スキーマ、テーブル、ビュー、関数)に対するすべての権限をアナリストチームに付与します。
:::

## CREATE CATALOG

**適用可能なオブジェクトタイプ:** Unity Catalogメタストア

Unity Catalogメタストアでのカタログの作成を許可します。

## CREATE EXTERNAL LOCATION

**適用可能なオブジェクトタイプ:** Unity Catalogメタストア, `STORAGE CREDENTIAL`

ストレージ資格情報に適用された際、ストレージ資格上を用いて外部ロケーションを作成することを許可します。また、この権限はメタストアに外部ロケーションを作成することを許可します。

## CREATE EXTERNAL TABLE

**適用可能なオブジェクトタイプ:** `EXTERNAL LOCATION, STORAGE CREDENTIAL`

外部ロケーションやストレージ資格情報を用いて、お使いのクラウドテナントに直接外部テーブルを作成することを許可します。ストレージ資格情報ではなく外部ロケーションにこの権限を付与することをお勧めします(これは、パスのスコープであり、あなたのクラウドテナントでユーザーが外部テーブルを作成できる場所をよりコントロールできるためです)。

## CREATE FUNCTION

**適用可能なオブジェクトタイプ:** `SCHEMA`

スキーマに関数を作成することを許可します。権限は継承されるので、`CREATE FUNCTION`はカタログで許可することもでき、カタログの現在と将来のスキーマで関数を作成できることを許可することができます。

ユーザーは親のカタログの`USE CATALOG`権限と親のスキーマの`USE SCHEMA`権限を有している必要があります。

## CREATE MANAGED STORAGE

**適用可能なオブジェクトタイプ:** `EXTERNAL LOCATION`

カタログ、スキーマレベルでマネージドテーブルを格納するロケーションを指定することを許可し、メタストアのデフォルトルートストレージを上書きします。

## CREATE PROVIDER

**適用可能なオブジェクトタイプ:** Unity Catalogメタストア

メタストアでDelta Sharing提供者オブジェクトの作成を許可します。提供者はDelta Sharingを用いてデータを共有できる組織やユーザーグループを特定します。提供者の作成は受信者のDatabricksアカウントのユーザーによって実行されます。[Share data securely using Delta Sharing](https://docs.databricks.com/data-sharing/index.html)をご覧ください。

## CREATE RECIPIENT

**適用可能なオブジェクトタイプ:** Unity Catalogメタストア

メタストアでDelta Sharing受信者オブジェクトの作成を許可します。受信者はDelta Sharingを用いてデータが共有される組織やユーザーグループを特定します。受信者の作成は提供者のDatabricksアカウントのユーザーによって実行されます。[Share data securely using Delta Sharing](https://docs.databricks.com/data-sharing/index.html)をご覧ください。

## CREATE SCHEMA

**適用可能なオブジェクトタイプ:** `CATALOG`

スキーマの作成を許可します。また、ユーザーはカタログに対する`USE CATALOG`権限が必要です。

## CREATE SHARE

**適用可能なオブジェクトタイプ:** Unity Catalogメタストア

メタストアに共有の作成を許可します。共有はdelta Sharingを用いた共有を意図したテーブルの論理的グループです。

## CREATE TABLE

**適用可能なオブジェクトタイプ:** `SCHEMA`

スキーマでテーブルを作成することを許可します。権限は継承されるので、カタログに`CREATE TABLE`を付与することができ、カタログの現在そして将来のスキーマでテーブルを作成することを許可します。

ユーザーは親のカタログの`USE CATALOG`権限と親のスキーマの`USE SCHEMA`権限を有している必要があります。

## CREATE VIEW

**適用可能なオブジェクトタイプ:** `SCHEMA`

スキーマでビューを作成することを許可します。権限は継承されるので、カタログに`CREATE TABLE`を付与することができ、カタログの現在そして将来のスキーマでビューを作成することを許可します。

ユーザーは親のカタログの`USE CATALOG`権限と親のスキーマの`USE SCHEMA`権限を有している必要があります。

## EXECUTE

**適用可能なオブジェクトタイプ:** `FUNCTION`

ユーザーが親のカタログの`USE CATALOG`権限と親のスキーマの`USE SCHEMA`権限を有している場合には、ユーザー定義関数を呼び出すことを許可します。

権限は継承されるので、カタログやスキーマに`EXECUTE`を付与することができ、カタログやスキーマで現在そして将来の関数を実行することを許可します。

## MODIFY

**適用可能なオブジェクトタイプ:** `TABLE`

ユーザーが親のカタログの`USE CATALOG`権限と親のスキーマの`USE SCHEMA`権限を有している場合には、テーブルに対する追加、更新、削除を行うことを許可します。

権限は継承されるので、カタログやスキーマに`MODIFY`を付与することができ、カタログやスキーマで現在そして将来のテーブルに`MODIFY`を実行することを許可します。

## READ FILES

**適用可能なオブジェクトタイプ:** `EXTERNAL LOCATION, STORAGE CREDENTIAL`

クラウドオブジェクトストレージから直接ファイルを読み込むことを許可します。ストレージ資格情報ではなく外部ロケーションにこの権限を付与することをお勧めします(これは、パスのスコープであり、あなたのクラウドテナントでユーザーがデータを読み込める場所をよりコントロールできるためです)。

## SELECT

**適用可能なオブジェクトタイプ:** `TABLE, VIEW, SHARE`

テーブルやビューに適用される際には、ユーザーが親のカタログの`USE CATALOG`権限と親のスキーマの`USE SCHEMA`権限を有している場合には、テーブルやビューを参照することを許可します。共有に適用されると、受信者は共有を参照できるようになります。

権限は継承されるので、カタログやスキーマに`SELECT`を付与することができ、カタログやスキーマの現在そして将来のテーブルやビューに`SELECT`を実行することを許可します。

## USE CATALOG

**適用可能なオブジェクトタイプ:** `CATALOG`

この権限はカタログ自身へのアクセスを許可しませんが、カタログ内のすべてのオブジェクトを操作する際に必要となります。例えば、テーブルからデータをselectするには、ユーザーは当該テーブルの`SELECT`権限と親のカタログに対する`USE CATALOG`権限と親スキーマに対する`USE SCHEMA`権限が必要となります。

これは、カタログのオーナーがそれぞれのスキーマやテーブルのオーナーが彼らが生成するデータをどこまで共有できるのかを制限できるようになるため有用です。例えば、別のユーザーに`SELECT`を許可したテーブルのオーナーは、親のカタログに対する`USE CATALOG`権限と親のスキーマに対する`USE SCHEMA`権限を付与しない限り、`SELECT`が付与されたユーザーはテーブルを読み込むことはできません。

## USE SCHEMA

**適用可能なオブジェクトタイプ:** `SCHEMA`

この権限はスキーマ自身へのアクセスを許可しませんが、スキーマ内のすべてのオブジェクトを操作する際に必要となります。例えば、テーブルからデータをselectするには、ユーザーは当該テーブルの`SELECT`権限と親のカタログに対する`USE CATALOG`権限と親スキーマに対する`USE SCHEMA`権限が必要となります。

権限は継承されるので、カタログに`USE SCHEMA`権限を付与することがd系、カタログの現在、将来のすべてのスキーマにおいて`USE SCHEMA`権限が自動で付与されるようになります。

## WRITE FILES

**適用可能なオブジェクトタイプ:** `EXTERNAL LOCATION, STORAGE CREDENTIAL`

クラウドオブジェクトストレージに直接ファイルを書き込むことを許可します。ストレージ資格情報ではなく外部ロケーションにこの権限を付与することをお勧めします(これは、パスのスコープであり、あなたのクラウドテナントでユーザーがデータを書き込める場所をよりコントロールできるためです)。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)