Unity Catalogのキーコンセプト

[Key concepts \| Databricks on AWS](https://docs.databricks.com/data-governance/unity-catalog/key-concepts.html) [2022/3/10時点]の翻訳です。

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

:::note info
**プレビュー**
Unity Catalogは[パブリックプレビュー](https://docs.databricks.com/release-notes/release-types.html)です。Unity Catalog向けのアカウントコンソールUIは[プライベートプレビュー](https://docs.databricks.com/release-notes/release-types.html)です。プレビューに参加するには、Databricks担当者にお問合せください。
:::

本書では、どのようにしてUnity Catalogがお使いのレイクハウスにセキュリティとガバナンスをもたらすのか、キーコンセプトを説明します。

# アカウントコンソール

[アカウントコンソール](https://docs.databricks.com/administration-guide/account-settings-e2/account-console-e2.html)サービスは、Unity Catalogのメタストアを作成し、[アカウントレベルのユーザー、グループ](#アカウントレベルid)を管理し、その他のタスクを行うことができるweb UIです。カウントコンソールサービスは、米国でホストされています。ユーザー情報といくつかのメタデータは、米国で集中管理されています。パブリックプレビュー時点では、以下のフィールドは米国に保存されます。

- ワークスペースのメタデータ
- 請求のメタデータ
- アカウントのメタデータ
- テーブル名

# アカウントレベルID

Unity Catalogは、ユーザー、グループを解決し、アクセス権を強制するために、DatabircksのアカウントレベルのIDシステムを使用します。[Databricksのアカウントコンソールで直接設定](https://qiita.com/taka_yayoi/items/3f2df6ddea81521ee786#%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%83%AC%E3%83%99%E3%83%AB%E3%81%AE%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E3%81%AE%E8%BF%BD%E5%8A%A0)するか、自動でお使いのアイデンティティプロバイダー(IdP)と同期するように設定することができます。Unity Catalogで[アクセスコントロールポリシー](https://docs.databricks.com/data-governance/unity-catalog/data-permissions.html)を作成する際に、これらのアカウントレベルのユーザー、グループを参照します。

Databricksではワークスペースに対してローカルなグループを追加することはできますが、これらのローカルグループをUnity Catalogで使用することはできません。ローカルグループを参照するコマンドは、グループが見つかりませんというエラーになります。

Unity Catalogのユーザーはノートブック、Databricks SQLのクエリー、Databricks SQLのデータエクスプローラー、REST APIコマンドでUnity Catalogのデータにアクセスし、ワークスペースのローカルデータと結合するためには、ワークスペースにも追加されている必要があります。

# データのアクセス権

Unity Catalogでは、デフォルトでデータは保護されています。最初はユーザーはメタデータのデータにアクセスすることはできません。メタストア管理者とオブジェクトのオーナーが、Databricks SQLのデータエクスプローラー、あるいはSQLコマンドを用いてオブジェクトのアクセス権を管理することができます。

詳細は、[Unity Catalogにおけるデータのアクセス権](https://qiita.com/taka_yayoi/items/57589857e22569c56300)をご覧ください。

# オブジェクトモデル

以下の図では、Unity Catalogにおける主要なセキュリティ保護可能なオブジェクトを示しています。
![](https://docs.databricks.com/_images/object-model.png)

:::note info
**注意**
外部の格納場所やストレージ認証情報などいくつかのオブジェクトはこの図には含まれていません。これらのオブジェクトはカタログと同じレベルでメタストアの中に配置されています。
:::

## メタストア

メタストアはUnity Catalogにおけるトップレベルのコンテナーです。データアセット(テーブルとビュー)とそれらへのアクセスを管理するアクセス権を格納しています。Databricksのアカウント管理者はメタストアを作成し、どのワークロードがどのメタストアを使用するのかをコントロールするためにDatabricksワークスペースをメタストアに割り当てます。

:::note info
**注意**
Unity Catalogはビルトインのセキュリティと監査を持つ新たなメタストアを提供します。これは、[以前のバージョンのDatabricks](https://docs.databricks.com/data/metastores/index.html)で使用されていたHiveメタストアベースのメタストアとは異なるものです。
:::

### メタストア管理者

*メタストア管理者*は、誰がカタログを作成できるか、誰がテーブルにクエリーを実行できるか、と言ったメタストア内のセキュリティ保護可能なオブジェクトに対するアクセス権を管理することができます。

:::note info
**注意**
Unity Catalogのデータガバナンスモデルの詳細については、[Unity Catalogにおけるデータのアクセス権](https://qiita.com/taka_yayoi/items/57589857e22569c56300)をご覧ください。
:::

必要であれば、メタストア管理者はオブジェクトオーナーを変更することで、メタストアオブジェクトに対するアクセス権管理を他のユーザー、グループに移譲することができます。メタストアを作成したアカウントレベルの管理者がオーナーとなります。オブジェクトノーオナーが、当該オブジェクトと配下のオブジェクトに対する他のユーザーのアクセス権を許可することができます。

メタストアを作成したアカウント管理者が初期のメタストア管理者になります。アカウント管理者は[メタストアのオーナーを変更](https://qiita.com/taka_yayoi/items/3f2df6ddea81521ee786#%E6%8E%A8%E5%A5%A8%E3%83%A1%E3%82%BF%E3%82%B9%E3%83%88%E3%82%A2%E3%81%AE%E3%82%AA%E3%83%BC%E3%83%8A%E3%83%BC%E3%82%B7%E3%83%83%E3%83%97%E3%82%92%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E3%81%AB%E8%BB%A2%E9%80%81%E3%81%99%E3%82%8B)することで、他のユーザーにメタストア管理者を割り当てることができます。メタストアのオーナーであるかに関係なく、アカウント管理者は常にメタストアを管理することができます。

### デフォルトの格納場所

それぞれのメタストアは、Amazon S3のデフォルト格納場所で設定されます。これはマネージドテーブルのデフォルト格納場所にもなります。外部テーブルは他のS3パスにデータを格納します。

それぞれのメタストアへのアクセスは、メタストア作成時に設定される一つのストレージ認証情報を用いてデフォルトが設定されます。外部テーブルへのアクセスやお使いのクラウドテナントに格納されているデータファイルの読み込みなど、他の格納場所にアクセスできるように追加のストレージ認証情報を設定することができます。ユーザーのコードは決してストレージ認証情報へのフルアクセスを持つことはありません。その代わりに、Unity Catalogがそれぞれのユーザーやアプリケーションがリクエストされたデータにアクセスできるようにスコープが限定されたトークンを生成します。

## カタログ

カタログはUnity Catalogの[3レベルの名前空間](https://docs.databricks.com/data-governance/unity-catalog/queries.html#three-level-namespace-notation)の最初のレイヤーであり、データアセットを整理するために使用されます。ユーザーは、`USAGE`[データアクセス権](https://docs.databricks.com/data-governance/unity-catalog/data-permissions.html)を割り当てられたすべてのカタログにアクセスすることができます。

## スキーマ

スキーマ(データベースとも呼ばれます)は、Unity Catalogの[3レベルの名前空間](https://docs.databricks.com/data-governance/unity-catalog/queries.html#three-level-namespace-notation)の2番目のレイヤーであり、テーブルとビューを整理するために用いられます。スキーマ内のテーブルやビューの一覧を表示するには、ユーザーは当該スキーマと親のカタログに対する`USAGE`権限と、対象のテーブル、ビューに対する`SELECT`権限が必要となります。

## テーブル

テーブルはUnity Catalogの[3レベルの名前空間](https://docs.databricks.com/data-governance/unity-catalog/queries.html#three-level-namespace-notation)の3番目のレイヤーであり、データのレコードを格納しています。テーブルを作成するには、対象のスキーマに対する`CREATE`と`USAGE`権限と、親のカタログに対する`USAGE`権限が必要となります。テーブルにクエリーを実行するには、対象のテーブルに対する`SELECT`怪訝と、親のスキーマ、カタログに対する`USAGE`権限が必要となります。

テーブルには*マネージド*と*外部*があります。

### マネージドテーブル

マネージドテーブルは、Unity Catalogでテーブルを作成する際のデフォルトの方法となります。これらのテーブルは、それぞれのメタストアを作成する際に指定したマネージドの格納場所に格納されます。

- マネージドテーブルを作成するには、`LOCATION`句を指定せずに`CREATE TABLE`コマンドを実行します。
- マネージドテーブルを削除するには、`DROP`文を使用します。

マネージドテーブルがドロップされると、背後にあるデータもお使いのクラウドテナントから削除されます。マネージドテーブルでサポートされているフォーマットはDeltaのみです。

コマンドサンプル:

```sql:SQL
CREATE TABLE <example-table>(id STRING, value STRING)
```

### 外部テーブル

外部テーブルは、マネージドの格納場所の外の格納場所にデータが格納されるテーブルであり、Unity Catalogによって完全に管理されるわけではありません。外部テーブルに対して`DROP TABLE`を実行すると、Unity Catalogは背後にあるデータは削除しません。マネージドテーブルと同様に、外部テーブルに対するアクセス権を管理し、クエリーで使用することができます。外部テーブルを作成するには、`CREATE TABLE`文で`LOCATION`パスを指定します。外部テーブルには以下のファイルフォーマットを使用することができます。

- DELTA
- CSV
- JSON
- AVRO
- PARQUET
- ORC
- TEXT

外部テーブルの背後のクラウドストレージへのアクセスを管理するために、Unity Catalogは2つのオブジェクトタイプを導入しています。ストレージ認証情報と外部ロケーションです。

- *ストレージ認証情報*は、IAMロールのようにお使いのクラウドテナントに格納されているデータにアクセスするための認証、承認のメカニズムを表しています。それぞれのストレージ認証情報は、どのユーザー、グループが認証情報にアクセスできるのかを制御するUnity Catalogのアクセスコントロールポリシーの対象となっています。

    ユーザーが`USAGE`権限を持っていないストレージ認証情報を使用しようとするとリクエストは失敗し、Unity Catalogはユーザーの代わりにクラウドテナントに対する認証を試みません。

- *外部ロケーション*はストレージ認証情報とクラウドストレージのパスへの参照を含むオブジェクトです。外部ロケーションは、そのパスと配下のディレクトリ、ファイルのみへのアクセスを許可します。それぞれの外部ロケーションは、どのユーザー、グループが認証情報にアクセスできるのかを制御するUnity Catalogのアクセスコントロールポリシーの対象となっています。

    ユーザーが`USAGE`権限を持っていない外部ロケーションを使用しようとするとリクエストは失敗し、Unity Catalogはユーザーの代わりにクラウドテナントに対する認証を試みません。

メタストア管理者のみがストレージ認証情報と外部ロケーションを作成し、アクセスを許可することができます。

コマンドサンプル:

```sql:SQL
CREATE TABLE <example-table>
(id STRING, value STRING)
USING delta
LOCATION "s3://<your-storage-path>"
```

:::note info
**注意**
ユーザーが外部テーブルを作成するには、`CREATE TABLE`文で指定される`LOCATION`に対するアクセスを許可する外部ロケーション、ストレージ認証情報に対する`CREATE TABLE`権限を持っている必要があります。
:::

## ビュー

ビューはUnity Catalogの[3レベルの名前空間](https://docs.databricks.com/data-governance/unity-catalog/queries.html#three-level-namespace-notation)の3番目のレイヤーに存在しており、メタストアにある1つ以上のテーブル、ビューから構成される読み取り専用のオブジェクトです。ビューは、複数のスキーマ、カタログのテーブル、ビューから構成することができます。

コマンドサンプル:

```sql:SQL
CREATE VIEW main.default.experienced_employee
  (id COMMENT 'Unique identification number', Name)
  COMMENT 'View for experienced employees'
AS SELECT id, name
   FROM all_employee
   WHERE working_years > 5;
```

# クラスターセキュリティモード

アクセスコントロールの一貫性を保証し、強力なアイソレーション保証を強制するために、Unity Catalogは計算資源に対していくつかの要件を必要とします。このため、Unity Catalogでは、クラスターの*セキュリティモード*というコンセプトを導入します。Unity Catalogはデフォルトでセキュリティ保護がされています。クラスターが適切なセキュリティモードで設定されていない場合、クラスターはUnity Catalogのデータにアクセスすることができません。

Data Science & Engineeringクラスター、あるいはDatabricks Machine Learningクラスターを作成する際、以下のクラスターセキュリティモードを選択することができます。

- **None**: アイソレーションはありません。ワークスペースのローカルテーブルのアクセスコントロールやクレディンシャルパススルーを強制しません。Unity Catalogのデータにはアクセスできません。
- **Single User**: 一人のユーザー(デフォルトではクラスターを作成したユーザー)のみが使用できます。他のユーザーはクラスターにアタッチすることができません。**Single User**セキュリティモードのクラスターからビューにアクセスする際、ビューは当該ユーザーのアクセス権で実行されます。Single UserクラスターはPython、Scala、Rを用いたワークロードをサポートしています。initスクリプト、ライブラリのインストール、DBFS FuseマウントはSingle Userクラスターではサポートされています。自動化ジョブはSingle Userクラスターで実行すべきです。
- **User Isolation**: 複数ユーザーで共有できます。SQLワークロードのみがサポートされています。クラスターのユーザー間で厳密な分離を強制するために、ライブラリのインストール、initスクリプト、DBFS Fuseマウントは無効化されています。
- **Table ACL only (Legacy)**: ワークスペースローカルのテーブルアクセスコントロールを強制しますが、Unity Catalogにはアクセスできません。
- **Passthrough only (Legacy)**: ワークスペースローカルのクレディンシャルパススルーを強制しますが、Unity Catalogにはアクセスできません。

Unity Catalogのワークロードをサポートしているセキュリティモードは**Single User**と**User Isolation**だけです。

Databricks SQLのエンドポイントは、設定が不要な**User Isolation**を自動で使用します。

Unity Catalogの要件に応えられるように、セキュリティモードを**Single User**か**User Isolation*に設定することで、既存のクラスターをアップグレードすることができます。

以下の表では、それぞれのクラスターセキュリティモードでどの機能が有効化、無効化されているのかを説明しています。

:::note info
**注意**
以下のテーブルは横に長くなっています。すべてのカラムを参照するには横にスクロールしてください。
:::

| セキュリティモード | 言語サポート | Unity Catalog | レガシーテーブルアクセスコントロール | クレディンシャルパススルー |複数ユーザー| RDD API | DBFS Fuseマウント | initスクリプト、ライブラリインストール| Unity Catalogの動的ビュー |
|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|
| None  | すべて  | 𝙓  |  𝙓 |  𝙓 |✔| ✔  |  ✔ | ✔  | 𝙓  |
| Single User  | すべて  |   ✔| 𝙓  | 𝙓  |𝙓 |✔   |  ✔ | ✔  | 𝙓  |
| User Isolation  |  SQL | ✔  | ✔  | 𝙓  | ✔| 𝙓  | 𝙓  |  𝙓  | ✔  |
| Legacy table ACL  | SQL、Python、Scala、R  | 𝙓  | ✔  | 𝙓  | ✔| 𝙓  |  𝙓 | ✔  |  𝙓 |
|  Legacy passthrough | SQL、Python、Scala、R   | 𝙓  |𝙓   |  ✔  | ✔| ✔  |  ✔ |  ✔ | 𝙓  |


### Databricks 無料トライアル

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