【Databricks】ワークスペースを作ったら最初に確認したいアクセス制御(ACL)設定

# はじめに
Databricks でワークスペースを立ち上げるにあたって、どのようなセキュリティ設定が必要かについて確認するために、公式のセキュリティガイドを確認しました。この記事ではそちらを基に、ワークスペースを作成する前と、した直後に確認しておきたいセキュリティの設定についてまとめています。

ワークスペース GUI ではアクセス制御リスト (ACL) を利用してファイルへのアクセス権限を設定することが可能です。基本的には、「何かにアクセスできる人（ユーザー/グループ）は誰か」「その人は何ができるか」をセットにしたルールを一つずつ設定します。

# ワークスペース作成後にやっておくこと
- ワークスペースやクラスターなどに対するアクセス制御の有効化
- クラスターやジョブに対してアクセスが必要なユーザーを設定
- データに対してアクセス許可を設定

# ワークスペースの設定
Databricks のセキュリティ設定は基本的に**アクセスができるユーザーにだけ特権を与える**という形式になっているようです。ただし、ワークスペース全体のアクセス制御を有効化していないとノートブックやクラスターが全員に見えてしまいますので、**初期設定としてワークスペースのアクセス制御を有効化しておく**ことが必要です。

はじめに、ワークスペース全体におけるファイル等へのアクセスに関する設定を行います。

1. 右上のタブをクリックし**管理者設定**を開く
2. ワークスペースの設定 (**Workspace Settings**)を選択
3. アクセス制御 (**Access Control**)の欄を確認する

以下に各設定の詳細を述べますが、基本的にすべて **Enabled** (有効)になっている事を確認すればOKです。
![2023-04-06_09h28_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327019/c59d3424-18b7-e7b7-7735-3cde02026053.png)
![2023-04-06_09h33_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327019/84807892-b2b7-e3c8-c803-0e78ac7ea1e5.png)

筆者が新規にワークスペースを作成した際は初期状態で「テーブルアクセス」以外は有効化されていました。

## ワークスペースのアクセス制御 (Workspace Access Control)
設定すると、ワークスペースの管理者以外はフォルダやノートブックなどのオブジェクトを開くことができなくなります。

なお、**これを設定するだけだとファイルの名前自体は見えてしまう**ので、次に示す表示コントロールの設定を併せて行う必要があります。

## ワークスペース表示コントロール (Workspace Visibility Control)
設定すると、管理者以外にファイル自体が見えなくなります。ワークスペース以外にも、ジョブ・クラスターにも同様の設定が存在します。

## クラスター・プール・ジョブのアクセス制御 (Cluster, Pool, and Jobs Access Control)
管理者のみがクラスターなどに対する以下の操作ができるように制限します。
- クラスター: クラスターの作成、アタッチ、再起動、クラスター毎の権限の編集
- プール: 作成、アタッチ、権限の編集
- ジョブ: 結果の閲覧、実行やキャンセル

# クラスターの作成許可
アクセス制限を設定すると、管理者以外はクラスターを作成できなくなりますが、ユーザー個別に特権を与えることもできます。

ただしクラスターを作成したユーザーはそのクラスターに対する全アクセスの権限が与えられ、クラスターを通してデータベースに不正アクセスされる可能性などがあるため、管理者以外は基本的に**全員外しておくことが推奨されます**。
![2023-04-06_10h34_40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327019/f4ce3f47-3495-68c1-85a2-152b27b5cf4a.png)

1. 右上のタブをクリックし**管理者設定**を開く
2. ユーザー（またはグループ）のタブを選択
3. 該当のユーザーの**無制限のクラスターの作成を許可する**のチェックボックスをクリック

# クラスター毎の設定
クラスターはそれぞれ、個別にアクセスの権限を設定することができ、さらにどの操作まで許可できるかという設定も可能です。例えば以下のようなケースです。
- クラスター#01の起動や停止をさせられる
- ただし構成を変更したり、#01以外のクラスターにはアクセスできない

## クラスターへの権限設定方法
![2023-04-06_09h57_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327019/2aeff42f-fc0a-80b3-230d-e2f34625bb20.png)
![2023-04-06_10h02_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327019/12893920-8601-3dbb-3039-a4de2ebd596c.png)
![2023-04-06_10h19_53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327019/ea22e69e-2e17-4066-ac11-872a8ceb388c.png)
![2023-04-06_10h22_58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327019/6695c26e-faff-926e-f2b5-290149079ce4.png)

1. サイドバーの**クラスター**をクリックしクラスター名を選択
2. **その他**から**権限**を選択
3. 下のプルダウンからリストを開き、追加したいユーザー/グループを選択
4. 与える権限をプルダウンで選択

## クラスターの権限レベル
権限なしを除くと3種類あり、下の権限はその上の権限も同時に持ちます。
- **アタッチ可**
  - クラスターにアタッチする
  - Spark UI を見る
  - メトリクス・ドライバーログを見る
- **再起動可能**
  - クラスターを起動・停止・再起動する
- **管理可能**
  - クラスターの編集
  - ライブラリのアタッチ
  - クラスターサイズの変更
  - クラスターへのアクセス権限の変更

クラスターを作成したユーザーは**自動的に「管理可能」になる**ことに注意しましょう。

# プールの権限設定
基本的にはクラスターと同様の設定方法で、上部のタブから該当するページを開いて選択します。

- **アタッチ可**
  - クラスターにアタッチする
- **管理可能**
  - 削除、編集、権限の変更

# ジョブの権限設定
「ワークフロー」メニューを開き、対応するジョブを選択すると現れる詳細画面を下の方にスクロールすると権限設定のボタンが表示されます。
![2023-04-27_14h12_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327019/3ac0b717-475c-cd23-f9eb-9d4e733010f8.png)


:::note warn
記事執筆時点ではUIが未訳でした。
:::

- **Can View**
  - ジョブの詳細や結果を見る
- **Can Manage Run**
  - 実行・キャンセル
- **管理可能 / Is Owner**
  - 設定変更、権限変更、削除

管理可能とオーナーはできることが同じですが、ジョブあたり1人だけオーナーになれるという違いがあるようです。

# データへのアクセス制御
ここまでの設定で、ワークスペース上にある各種オブジェクトに対する制御はできましたが、外部のストレージに置かれているデータベースに対しては個別に設定を行う必要があります。

Unity Catalog の機能を使えば、カタログ・スキーマ・テーブルといったデータオブジェクトに対して、ユーザーが可能な操作を定義することが簡単にできます。

## Data Explorer からのアクセス許可の管理
1. サイドバーの**データ**をクリック
2. 設定するデータオブジェクトを選択
3. **アクセス許可**の項目を選択してから、**許可**をクリック
4. ユーザー名もしくはグループ名を入力する
5. 付与したい権限を選択して **OK**

また、設定済みの権限を選択して**取り消し**をクリックすることで権限を取り消すこともできます。

:::note
付与できる権限の詳細については、[Unity Catalog の権限とセキュリティ保護可能なオブジェクト](https://learn.microsoft.com/ja-jp/azure/databricks/data-governance/unity-catalog/manage-privileges/privileges)を参照してください。また、こちらの知識があれば権限情報をSQLで操作する、ということも可能になります。
:::

# トークンベースの認証を利用
外部のアプリから REST API を通して接続するような場合にはセキュリティトークンを生成する必要がありますが、こちらを利用する際には事前の準備が必要となります。
![2023-04-06_10h56_45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327019/6644787a-5b3a-5543-0d44-d723c772d312.png)

1. **ワークスペースの設定**>**個人用アクセス トークン**を選択し、有効化
2. **確認**をクリック

トークン関連は基本的には API で操作することになりますが、一部 GUI 上でできる操作もあります。

## トークン生成
![2023-04-06_10h46_49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327019/42aa2d67-0136-f12b-1d21-a2091d0873af.png)
![2023-04-06_10h46_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327019/ac1f747f-af08-09f9-d2b8-b26f0267751e.png)

1. ユーザー名をクリック＞ユーザー設定
2. **アクセストークン**>**新しいトークンの作成**
3. 有効期限を設定する(デフォルト90日、空欄にすると無期限)
4. **生成**をクリックし、コピーする

## ユーザ毎のトークン利用可否設定
![2023-04-06_11h00_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327019/75c185df-5ac0-9645-fd99-d87f9dda998b.png)

1. **ワークスペースの設定**>**個人用アクセス トークン**の横にある**アクセス許可**をクリック
2. ユーザー名を選択し、権限を設定する

権限には「使用可能」と「管理可能」があります。後者は自分以外にも、全ユーザーのトークンを取り消したりアクセス拒否することが可能です。

# まとめ
以上のように ACL には多数の設定があり、セキュリティに詳しくない筆者は公式のドキュメントを読んだ際は理解に時間がかかりました。ただ、基本的にはホワイトリスト制になっているため、最低限必要なユーザーにだけ権限の設定を与えるという原則を守っていれば良い、と認識しました。

安全に運用するためには、まずワークスペースのアクセス制御設定をすべて有効化し、その上で**必要なユーザー以外にはオブジェクトの作成を許可しない**という方針をとる必要がありそうです。
# 参考文献
Microsoft Learn
- [セキュリティ ガイド](https://learn.microsoft.com/ja-jp/azure/databricks/security/)
- [データ ガバナンス ガイド](https://learn.microsoft.com/ja-jp/azure/databricks/data-governance/)