Databricksにおけるワークスペースオブジェクトのアクセスコントロール

[Workspace object access control — Databricks Documentation](https://docs.databricks.com/security/access-control/workspace-acl.html) [2021/1/26時点]の翻訳です。

> [Databricksクイックスタートガイド](https://qiita.com/taka_yayoi/items/125231c126a602693610)のコンテンツです。

> **注意** アクセスコントロールは[Premium Plan](https://databricks.com/product/aws-pricing)以上で利用可能です。

ワークスペースアクセスコントロールを有効化しない限り、デフォルトで全てのユーザは、フォルダ、ノートブック、エクスペリメント、モデルを含む[ワークスペース](https://docs.databricks.com/workspace/index.html)のオブジェクトを作成、変更することができます。ワークスペースオブジェクトのアクセスコントロールによって、個々の権限がユーザの能力を規定することができます。本記事では、個々の権限及びどのようにワークスペースオブジェクトのアクセスコントロールを設定するのかを説明します。

ワークスペースオブジェクトのアクセスコントロールを利用するためには、DatabricksのAdministratorがワークスペースで機能を有効化する必要があります。[ワークスペースオブジェクトのアクセスコントロールの有効化](https://docs.databricks.com/administration-guide/access-control/workspace-acl.html)を参照ください。

本記事では以下を説明します：

- [フォルダのアクセス権](#フォルダのアクセス権)
- [ノートブックのアクセス権](#ノートブックのアクセス権)
- [ノートブック、フォルダのアクセス権設定](#ノートブックフォルダのアクセス権設定)
- [MLflowエクスペリメントのアクセス権](#mlflowエクスペリメントのアクセス権)
- [MLflowエクスペリメントのアクセス権設定](#mlflowエクスペリメントのアクセス権設定)
- [MLflowモデルのアクセス権](#mlflowモデルのアクセス権)
- [ライブラリとジョブのアクセスコントロール](#ライブラリとジョブのアクセスコントロール)

# フォルダのアクセス権

フォルダに対しては、5つのレベルのアクセス権を設定できます：**No Permissions**(アクセス権なし)、**Read**(読み取り)、**Run**(実行)、**Edit**(編集)、**Manage**(管理)です。下のテーブルに、それぞれのアクセス権で何ができるのかを示します。

| できること | No Permissions | Read | Run | Edit | Manage |
|:--|:-:|:-:|:-:|:-:|:-:|
|フォルダ内のアイテム一覧を表示   |x   |x   |x   |x   |x   |
|フォルダ内のアイテムを参照   |   |x   |x   |x   |x   |
|アイテムのコピー及びエクスポート   |   |x   |x   |x   |x   |
|アイテムの作成、インポート、削除   |   |   |   |   |x   |
|アイテムのリネーム、移動   |   |   |   |   |x   |
|アクセス権の変更   |   |   |   |   |x   |

フォルダ内のノートブックとエクスペリメントはフォルダのアクセス権を継承します。例えば、フォルダにおいて**Run**の権限を持つユーザーは、フォルダ内のノートブックに対しても**Run**のアクセス権を持ちます。

## デフォルトのフォルダアクセス権

- ワークスペースオブジェクトのアクセスコントロールに関わらず、以下のアクセス権が存在します：
    - 全てのユーザーは、**Workspace** > **Shared**フォルダにあるアイテムに対して**Manage**権限を持ちます。ノートブックを**Shared**フォルダに移動することで、**Manage**権限を許可することになります。
    - 全てのユーザーは、自身が作成したオブジェクトに対して**Manage**権限を持ちます。

- ワークスペースオブジェクトのアクセスコントロールが無効になっている場合、以下のアクセス権が存在します：
    - 全てのユーザーはWorkspaceフォルダ内の全てのアイテムに対して**Edit**権限を持ちます。

- [ワークスペースオブジェクトのアクセスコントロールが有効](https://docs.databricks.com/administration-guide/access-control/workspace-acl.html#enable-workspace-acl)になった場合、以下のアクセス権が存在します：
    - **Workspace**フォルダ
        - 管理者のみが**Workpsace**フォルダ内にアイテムを作成できます。
        - Workspaceフォルダに既にあるアイテムに関しては**Manage**権限を持つことになります。例えば、**Workspace**フォルダに**Documents**と**Temp**フォルダが存在した場合、全てのユーザーはそれらのフォルダに対する**Manage**権限を持ち続けることになります。
        - **Workspace**フォルダに作成されたアイテムに対してはアクセス権がありません。
    - ユーザーのアクセス権はフォルダに対して設定されるので、フォルダにアクセス権を設定した後においては、ユーザーは、作成されたアイテムであろうが、移動してきたアイテムであろうが全て同じアクセス権を持つことになります。
    - ユーザーのホームディレクトリに対しては、当該ユーザーは**Manage**権限をもち、他のユーザーはアクセス権がありません。

# ノートブックのアクセス権

[ノートブック](https://docs.databricks.com/workspace/workspace-assets.html#ws-notebooks)に対しては、5つのレベルのアクセス権を設定できます。：**No Permissions**(アクセス権なし)、**Read**(読み取り)、**Run**(実行)、**Edit**(編集)、**Manage**(管理)です。下のテーブルに、それぞれのアクセス権で何ができるのかを示します。

| できること | No Permissions | Read | Run | Edit | Manage |
|:--|:-:|:-:|:-:|:-:|:-:|
|セルの参照   |   |x   |x   |x   |x   |
|コメント   |   |x   |x   |x   |x   |
|%runあるいはノートブックワークフローによる実行   |   |x   |x   |x   |x   |
|ノートブックのアタッチ、デタッチ   |   |   | x  | x  |x   |
|コマンドの実行   |   |   | x  | x  | x  |
|セルの編集   |   |   |   | x  | x  |
|アクセス権の変更   |   |   |   |   | x  |

# ノートブック、フォルダのアクセス権設定

> **注意** 本章ではUIによるアクセス権管理方法を説明します。[Permissions API](https://docs.databricks.com/dev-tools/api/latest/permissions.html)による管理も可能です。

1. Permissionsダイアログを開きます
    - ノートブックの場合 - ノートブックの上部にある![](https://docs.databricks.com/_images/permissions.png)をクリックします。
    - フォルダの場合 - フォルダのドロップダウンメニューから**Permissions**を選択します。
    ![](https://docs.databricks.com/_images/permission-drop-down.png)

1. ユーザーあるいはグループにアクセス権を設定するためには、**Add Users and Groups**ドロップダウンでユーザー、グループを選択し、アクセス権を選択後**Add**をクリックします。
    ![](https://docs.databricks.com/_images/add-users.png)<br>ユーザー、グループのアクセス権を変更する場合には、permissionドロップダウンから権限を選択します。
![](https://docs.databricks.com/_images/change-permissions.png)

# MLflowエクスペリメントのアクセス権

MLflowエクスペリメントに対しては4つのレベルのアクセス権を設定できます：**No Permissions**(アクセス権なし)、**Read**(読み取り)、**Edit**(編集)、**Manage**(管理)です。下のテーブルに、それぞれのアクセス権で何ができるのかを示します。 

| できること | No Permissions | Read | Edit | Manage |
|:--|:-:|:-:|:-:|:-:|
|Run情報の参照、検索、Runの比較    |   | x  | x  | x  |
|Runアーティファクトの参照、一覧、ダウンロード   |   | x  | x  | x  |
|Runの作成、削除、リストア   |   |   | x  | x  |
|Runパラメータ、メトリクス、タグのロギング   |   |   |  x | x  |
|Runアーティファクトのロギング   |   |   | x  | x  |
|エクスペリメントのタグの編集   |   |   | x  | x  |
|Runとエクスペリメントの削除   |   |   |   | x  |
|アクセス権の設定   |   |   |   | x  |

> **注意**
>
> - エクスペリメントに対するアクセス権は、MLflowで管理されるDBFSに格納されたアーティファクトにのみ適用されます。詳細は、[MLflowアーティファクトのアクセス権](#MLflowアーティファクトのアクセス権)を参照ください。
> - エクスペリメントの作成、削除、リストアを行うためには、エクスペリメントを格納するフォルダの**Edit**、**Manage**権限が必要となります。
> - エクスペリメントに対して**Run**権限を指定することはできますが、これは**Edit**権限と等価となります。

# MLflowエクスペリメントのアクセス権設定

1. ExperimentのドロップダウンPermissionsダイアログを開きます。
2. Permissionを設定します。全てのユーザーは**all users**グループに所属しています。Administratorは**admins**グループに属しており、全てのアイテムに対する**Manage**権限を持っています。ユーザー、グループに対してpermissionを設定するためには、**Add Users and Groups**ドロップダウンからユーザー、グループを選択し、permissionを選択したあと**Add**をクリックします：
![](https://docs.databricks.com/_images/add-users.png)
<br>Permissionを変更するには、新たなpermissionをドロップダウンから選択します。
![](https://docs.databricks.com/_images/change-permissions.png)
3. **Save Changes**をクリックして保存するか、**Cancel**をクリックして変更を取り消します。

## MLflowアーティファクトのアクセス権

個々の[MLflowエクスペリメント](https://docs.databricks.com/applications/mlflow/tracking.html#experiments)はMLflow Runとしてロギングされるアーティファクトを格納する**Artifact Location**を有しています。MLflow 1.11以降、デフォルトでアーティファクトは[Databricks File System \(DBFS\)](https://docs.databricks.com/data/databricks-file-system.html)にあるMLflow管理のサブディレクトリに格納されます。MLflowエクスペリメントに対するアクセス権は、`dbfs:/databricks/mlflow-tracking`のプレフィクスを持つ**Artifact Location**に格納されたアーティファクトにも適用されます。アーティファクトをロギングあるいはダウンロードするためには、関連づけられているMLflowエクスペリメントに対して適切なアクセス権を持つ必要があります。

> **注意**
>
> - MLflow管理のサブディレクトリに格納されているアーティファクトには、[Python](https://pypi.org/project/mlflow/)/[Java](https://mvnrepository.com/artifact/org.mlflow/mlflow-client)/[R](https://cran.r-project.org/web/packages/mlflow/index.html)で利用できるMLflowクライアント(バージョン1.9.1以降)でのみアクセス可能です。[dbutils](https://docs.databricks.com/dev-tools/databricks-utils.html#dbutils-fs)や[DBFS API](https://docs.databricks.com/dev-tools/api/latest/dbfs.html)ではMLflow管理のサブディレクトリにアクセスすることはできません。
> - MLflowエクスペリメントを作成する際に、独自の格納場所を指定することもできます。デフォルトのMLflow管理のサブディレクトリ以外が指定された場合、MLflowエクスペリメントのアクセス権はアーティファクトには適用されません。

# MLflowモデルのアクセス権

MLflowモデルレジストリに登録されたMLflowモデルに対しては、6つのレベルのアクセス権を設定できます:**No Permissions**(アクセス権なし)、**Read**(読み取り)、**Edit**(編集)、**Manage Staging Versions**(ステージングバージョンの管理)、**Manage Production Versions**(プロダクションバージョンの管理)、**Manage**(管理)です。以下のテーブルに権限ごとにできることを示します。

| できること| No Permissions | Read | Edit | Manage Staging Versions | Manage Production Versions | Manage | 
|:--|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|モデルの作成   |x   |x   |x   |x   |x   |x   |
|モデル詳細、バージョン、ステージ変更リクエスト、アクティビティ、アーティファクトダウンロードURIの表示   |   | x  |x   |x   |x   |x   |
|モデルバージョンステージ変更依頼   |   | x  | x  | x  | x  | x  | 
|新バージョンのモデルの追加   |   |   | x  | x  | x  | x  | 
|モデルの記述更新   |   |   |  x | x  |  x |  x | 
|モデルのステージング状態の変更   |   |   |   |  x(None/Archived/Stagingのみ) | x  |  x |   
|モデルのステージング状態変更リクエストの承認・却下   |   |   |   |  x(None/Archived/Stagingのみ) |   x| x  |   
|モデルのステージング状態変更リクエストのキャンセル([注意](#リクエストのキャンセル))   |   |   |   |   |   |  x |   
|アクセス権の変更   |   |   |   |   |   | x  |   
|モデル名の変更   |   |   |   |   |   | x  |   
|モデル及びバージョンの削除   |   |   |   |   |   | x  |   

##### リクエストのキャンセル
> - ステージング状態変更リクエストをした本人は、リクエストをキャンセルできます。

## デフォルトのMLflowモデルのアクセス権

- ワークスペースオブジェクトのアクセスコントロールに関わらず、以下のアクセス権が存在します：
    - 全てのユーザーは新たにレジストリにモデルを作成する権限を持ちます。
    - 全てのAdministratorは、全てのモデルに対して**Manage**権限を持ちます。

- ワークスペースオブジェクトのアクセスコントロールが無効になっている場合、以下のアクセス権が存在します：
    - 全てのユーザーは全てのモデルに対して**Manage**権限を持ちます。

- [ワークスペースオブジェクトのアクセスコントロールが有効](https://docs.databricks.com/administration-guide/access-control/workspace-acl.html#enable-workspace-acl)になった場合、以下のアクセス権が存在します：
    - 全てのユーザーは、自身が作成したモデルに対して**Manage**権限を持ちます。
    - Administratorではないユーザーは、自身が作成していないモデルに対しては権限を持ちません(**No Permissions**)。

## MLflowモデルのアクセス権設定

全てのユーザーは`all users`グループに属します。Administratorは、全てのオブジェクトに対してManage権限を持つ`admins`グループに属します。

> **注意** 本章ではUIによるアクセス権管理方法を説明します。[Permissions API](https://docs.databricks.com/dev-tools/api/latest/permissions.html)による管理も可能です。

1. サイドバーの![](https://docs.databricks.com/_images/models-icon.png)アイコンをクリックします。
2. モデル名をクリックします。
3. モデル名の右の![](https://docs.databricks.com/_images/button-down.png)をクリックし**Permissions**を選択します。
![](https://docs.databricks.com/_images/model-permission.png)
4. **Select User or Group**ドロップダウンからユーザー、グループを選択します。
![](https://docs.databricks.com/_images/select-user.png)
5. Permissionを選択します。ユーザー、グループのpermissionを変更するには、新たなpermissionをドロップダウンから選択します。
![](https://docs.databricks.com/_images/select-permission.png)
6. **Add**をクリックします。
7. **Save**をクリックして保存するか、**Cancel**をクリックして変更を取り消します。

## MLflowモデルのアーティファクトのアクセス権

個々の[MLflowモデルバージョン](https://docs.databricks.com/applications/mlflow/model-registry.html#model-registry-concepts)のモデルファイルは、`dbfs:/databricks/model-registry/`のプレフィクスを持つMLflow管理のサブディレクトリに格納されます。

モデルバージョンファイルの正確な位置を取得するためには、モデルに対する**Read**権限を持っている必要があります。[REST API](https://docs.databricks.com/dev-tools/api/latest/mlflow.html)のエンドポイント`/api/2.0/mlflow/model-versions/get-download-uri`を用いることができます。URIを取得した後で、[DBFS API](https://docs.databricks.com/dev-tools/api/latest/dbfs.html)を用いてファイルをダウンロードすることができます。

MLflowクライアント([Python](https://pypi.org/project/mlflow/)/[Java](https://mvnrepository.com/artifact/org.mlflow/mlflow-client)/[R](https://cran.r-project.org/web/packages/mlflow/index.html))を用いることで、`mlflow.<flavor>.load_model()`のようにワークフローをラッピングした便利なメソッドを使用して、モデルをダウンロード、ロードすることができます。

> **注意**
> [dbutils](https://docs.databricks.com/dev-tools/databricks-utils.html#dbutils-fs)や`%fs`では、MLflow管理のサブディレクトリにアクセスできません。

# ライブラリとジョブのアクセスコントロール

全てのユーザーはライブラリを参照できます。ライブラリをクラスターにアタッチできるユーザーを制御するためには、[Cluster access control](https://docs.databricks.com/security/access-control/cluster-acl.html)を参照ください。誰がジョブを実行できるか、ジョブ実行結果を参照できるのかを制御するには[Jobs access control](https://docs.databricks.com/security/access-control/jobs-acl.html)を参照ください。

### Databricks 無料トライアル

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