Azure Key Vault-backed scopesを使ったDatabricks Secretsの作成および管理

この記事は2024.03.13時点で作成されました。

関連Official Document：
https://learn.microsoft.com/ja-jp/azure/databricks/security/secrets/secret-scopes
## はじめに
Azure Databricksでは以下の二つのタイプのSecret Scopeがあります。

1. Azure Key Vault-backed scopes
2. Databricks-backed scopes

この記事では`1. Azure Key Vault-backed scopes`を使ったDatabricks Secretsの作成および管理方法を説明します。

## Secret作成の始め方
1. Azure portalでKey vault instanceを作成
2. Azure Databricks UIでSecret Scopeを作成
3. Azure portalのkey vault画面でSecretを作成
4. SecretをDatabricks Notebookで読み込む(`dbutils`利用)
5. 作成されたSecretを他のPrincipal(GroupやUser)に権限付与
6. Public access制限(Optional)

Azure Key Vault-backed scopesを使ったDatabricks Secretsを管理するにあたって、ツールによってできる作業がそれぞれ違います。

この記事では一番簡単に行ける`Azure Web UI + Databricks Secrets API`で説明します。

| オペレーション| Azure Web UI | Databricks CLI | Databricks Secrets API |
|:-:|:-:|:-:|:-:|
| Create a scope  | O  | O(AAD Token必要)  | X |
| List all scopes | O | O | O  |
 | Create a secret | O  | X | X |
| Delete a secret | O  | O | X |
| List all secrets in a scope | O  | O | O |
| Get ACL | X  | O | O |
| Create update an ACL  | X  | O | O |

## Azure Key vault、Scope、Secretの関係
Azure key vaultに一つのSecret Scopeを作成し、そのScopeの中に複数のSecretを作成します。

Use caseでScopeを別途作りたい場合、別途Azure key vaultを作成し新しいScopeを作成してください。

![Screenshot 2024-03-13 at 15.46.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662905/141b2fb0-3dcf-31b5-530b-1d10da7c7f13.png)

## Azure portalでKey vault instanceを作成
Azure portalで`Key vaults` iconをクリックします。
![Screenshot 2024-03-13 at 15.49.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662905/dac47958-f370-d696-2b3c-1074857297ca.png)

`+Create`ボタンを押します。
![Screenshot 2024-03-13 at 15.50.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662905/df453aef-177a-abc3-0bde-1989831d39e0.png)

Key vault nameを決めます。
Nextボタンを押します。
![Screenshot 2024-03-13 at 15.51.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662905/812c5922-a9e5-bbfa-9faf-d10b96cd099e.png)

Permission modelは`Vault access policy`を選択します。
Nextボタンを押します。
![Screenshot 2024-03-13 at 15.53.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662905/af864a34-4471-a1b9-57eb-c4a207fdd3f8.png)

一旦Networkingは後で調整できるため、DefaultのままNextボタンを押します。
![Screenshot 2024-03-13 at 15.55.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662905/5530956e-817a-2722-4c75-861c22f1ee70.png)

Createボタンをクリックして新しいKey vaultを作成します。
![Screenshot 2024-03-13 at 15.55.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662905/aa498976-4f1a-f250-170e-6d213dd8baec.png)

## Azure Databricks UIでSecret Scopeを作成
### Secret scope作成
https://<databricks-instance>#secrets/createScope でCreate Secret Scope UIにアクセスします。


![Screenshot 2024-03-13 at 16.00.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662905/62de9b08-6cce-0d75-3a0d-8d09c597c43f.png)

DNS NameとResource IDはAzure Key vaultの`Properties`メニューで取得します。

| Databricks UI | Azure UI |
|:-:|:-:|
| DNS Name  | Vault URI  |
| Resource ID  | Resource ID  |

![Screenshot 2024-03-13 at 16.02.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662905/ad504d5d-d5b5-e6c9-53e2-c51c4531b8a9.png)

### 作成されたSecret scope確認
[Secrets API](https://docs.databricks.com/api/azure/workspace/secrets/listscopes)を利用し、

Secret scopeが正常に作成されているかを確認します。
まずPAT(Personal Access Token)を用意します。
[Databricksパーソナルアクセストークン](https://qiita.com/taka_yayoi/items/f5493a4169e95e1a7a61#databricks%E3%83%91%E3%83%BC%E3%82%BD%E3%83%8A%E3%83%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3)を参照

Databricks notebookで以下のコードを実行します。
`<workspace uri>`と`<token value>`はカスタマイズします。

```python
import requests
workspace_uri='<workspace uri>'

TOKEN = '<token value>'

response= requests.get(
    f"https://{workspace_uri}/api/2.0/secrets/scopes/list",
    headers={'Authorization': 'Bearer {}'.format(TOKEN)}
)
print(response)
print(response.text)
```

Sample responseは以下のようです。

```j
<Response [200]>
{"scopes":[{"name":"[REDACTED]-demo-akv","backend_type":"AZURE_KEYVAULT","keyvault_metadata":{"resource_id":"/subscriptions/xxxx/resourceGroups/[REDACTED]-akv/providers/Microsoft.KeyVault/vaults/[REDACTED]-demo-akv","dns_name":"https://[REDACTED]-xxxx/"}}]}
```

## Azure portalのkey vault画面でSecretを作成

### Secret作成
Azure key vault instanceの`Secrets`メニューをクリックします。
![Screenshot 2024-03-13 at 16.17.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662905/38629966-77ac-8b24-0fc4-49317a887db5.png)

Generate/Importボタンをクリックします。
![Screenshot 2024-03-13 at 16.19.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662905/8f82912f-673b-aeab-d168-dd7cf7b0e037.png)

SecretのNameとSecret Valueを入力し、Createボタンをクリックします。

![Screenshot 2024-03-13 at 16.20.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662905/96d3b9ea-db26-fc33-91f9-294a394d3aac.png)

### 作成されたSecret確認

Azure portalのSecretsメニューかDatabricks NotebookでSecrets APIを利用し、作成されたSecretが確認できます。

#### Azure portalのSecretsメニューで確認した場合

新しく作成した`jdbc-username`が表示されます。
ただ、Public accessを制限すると見えなくなる可能性があります。
![Screenshot 2024-03-13 at 16.20.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662905/18623e46-d564-0f2e-5b03-07884ce935ad.png)

#### Databricks NotebookでSecrets APIを利用し、作成されたSecretを確認

[Secrets API](https://docs.databricks.com/api/azure/workspace/secrets/listsecrets)を利用し、

Secretが正常に作成されているかを確認します。
まずPAT(Personal Access Token)を用意します。
[Databricksパーソナルアクセストークン](https://qiita.com/taka_yayoi/items/f5493a4169e95e1a7a61#databricks%E3%83%91%E3%83%BC%E3%82%BD%E3%83%8A%E3%83%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3)を参照

Databricks notebookで以下のコードを実行します。
`<workspace uri>`と`<token value>`、`<scope name>`はカスタマイズします。

```python
import json
import requests
workspace_uri='<workspace uri>'

TOKEN = '<token value>'

response= requests.get(
    f"https://{workspace_uri}/api/2.0/secrets/list",
    headers={'Authorization': 'Bearer {}'.format(TOKEN)},
    data=json.dumps({
  "scope": "<scope name>"
    }
))
print(response)
print(response.text)
```

## 作成されたSecretを他のPrincipal(GroupやUser)に権限付与

### Secretに権限付与
[Secrets API](https://docs.databricks.com/api/azure/workspace/secrets/putacl)を利用し、

作成されたSecretを他のPrincipal(GroupやUser)に権限付与します。
まずPAT(Personal Access Token)を用意します。
[Databricksパーソナルアクセストークン](https://qiita.com/taka_yayoi/items/f5493a4169e95e1a7a61#databricks%E3%83%91%E3%83%BC%E3%82%BD%E3%83%8A%E3%83%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3)を参照

Databricks notebookで以下のコードを実行します。
`<workspace uri>`と`<token value>`、`<scope name>`、`>principal name>`はカスタマイズします。permissionは`READ | WRITE | MANAGE`のうち選びます。

```python
import json
import requests
workspace_uri='<workspace uri>'

TOKEN = '<token value>'
response= requests.post(
    f"https://{workspace_uri}/api/2.0/secrets/acls/put",
    headers={'Authorization': 'Bearer {}'.format(TOKEN)},
    data=json.dumps({
  "scope": "<scope name>",
  "principal": "<principal name>",
  "permission": "<READ | WRITE | MANAGE>"
})
)
print(response)
print(response.text)
```

### Secretの権限確認

Databricks notebookで以下のコードを実行します。

Databricks notebookで以下のコードを実行します。
`<workspace uri>`と`<token value>`、`<scope name>`はカスタマイズします。

```python
response= requests.get(
    f"https://{workspace_uri}/api/2.0/secrets/acls/list",
    headers={'Authorization': 'Bearer {}'.format(TOKEN)},
    data=json.dumps({
  "scope": "<scope name>"
})
)
print(response)
print(response.text)
```

## Public access制限(Optional)

Azure PortalのAzure key vault instanceのNetworkingメニューでPublic accessを制限することができます。

`Disable public access`を選択し、`Allow trusted Microsoft services to bypass this firewall`にチェックを入れます。

この設定でPublic accessが制限されますが、Azure DatabricksとKey vault instance間はAzure backboneで通信できるようになります。

![Screenshot 2024-03-13 at 16.57.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662905/c30d09f6-91cd-5a69-3f1b-b0bf481c5c91.png)

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