Autonomous Database：Azure Key Vaultに保存されているシークレットを使用して作成したクレデンシャルでBlob Storageにアクセスしてみた

# はじめに
Autonomous Databaseではマルチクラウド環境向けの様々な機能が実装されています。
先日の機能強化で、Azure Key Vault、AWS Secrets Manager、GCP Secret Managerといった各クラウドベンダーのシークレット管理サービスに格納されたシークレットを使用してクレデンシャルが作成できるようになりました。

そこで今回は、Azure Key Vaultに格納されているシークレットを使用してクレデンシャルを作成し、そのクレデンシャルを用いてAutonomous DatabaseからAzure Blob Storageにアクセスしてみました。

AWS Secrets Managerに格納されているシークレットを使用してクレデンシャルを作成する手順の記事はこちら。

https://qiita.com/500InternalServerError/items/913797575a446f9be00e

Google Cloud Secret Managerに格納されているシークレットを使用してクレデンシャルを作成する手順の記事はこちら。

https://qiita.com/500InternalServerError/items/d84d30868e5e7b6d30bf

# 1. Azure Key Vaultとシークレットの作成
Azureポータルにアクセスし、Key vaults（日本語環境では「キーコンテナー」）に移動します。

「Create」をクリックし、Key Vaultを作成します。
![スクリーンショット 2023-11-02 19.47.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/9743e415-6206-6615-291a-c396a26d0500.png)

ここでは「MyAzureKeyVault777」という名前のKey Vaultを作成しました。
![スクリーンショット 2023-11-02 19.52.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/3e281f42-4e0c-8896-5682-e94ebdfd50e2.png)

作成したKey Vault内にシークレットを作成します。
ここでは「StorageAccountAccessKey」という名前のシークレットを作成し、シークレットの値としてストレージアカウントのアクセスキーを設定しました。
![スクリーンショット 2023-11-02 19.56.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/bb01a729-7b16-0cb0-c564-6d84bd652c42.png)

Key Vault「MyAzureKeyVault777」内にシークレット「StorageAccountAccessKey」が作成できました。
![スクリーンショット 2023-11-02 19.59.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/ec4a4048-4c3d-08f1-b80f-213b9106e1f8.png)


# 2. Azureサービス・プリンシパルによる認証の有効化

DBMS_CLOUD_ADMIN.ENABLE_PRINCIPAL_AUTHプロシージャを使用して、Azureサービス・プリンシパルによる認証を有効化します。
providerにAZUREを指定します。
paramsのazure_tenantidにはAzureのテナントIDを指定します。
AzureのテナントIDはMicrosoft Entra IDのOverviewの画面で確認できます。
![スクリーンショット 2023-11-02 20.05.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/ce32850f-679e-b3e7-0cb2-3a9bd9a58e56.png)


```
SQL> BEGIN
  2      DBMS_CLOUD_ADMIN.ENABLE_PRINCIPAL_AUTH(
  3          provider => 'AZURE',
  4          username => 'admin',
  5          params   => JSON_OBJECT('azure_tenantid' value 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'));
  6  END;
  7* /

PL/SQLプロシージャが正常に完了しました。

SQL>
```
以下のSQLで、Azureサービス・プリンシパルの設定に必要な情報を確認し、それぞれの値をメモしておきます。
```
SQL> SELECT param_name, param_value FROM CLOUD_INTEGRATIONS
  2* WHERE param_name LIKE 'azure%';

PARAM_NAME           PARAM_VALUE                                                                                                                                                                       
____________________ _________________________________________________________________________________________________________________________________________________________________________________ 
azure_app_name       ADBS_APP_OCID1.AUTONOMOUSDATABASE.OC1.AP-TOKYO-1.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX                                                                     
azure_consent_url    https://login.microsoftonline.com/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/oauth2/v2.0/authorize?client_id=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx&response_type=code&scope=User.read    
azure_tenantid       xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx                                                                                                                                              

SQL>
```

ブラウザからazure_consent_urlのURLにアクセスし、「承諾」をクリックします。
![スクリーンショット 2023-11-01 20.35.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/f5b1a98d-ace1-2069-faef-2fd2bcb37125.png)

Azureポータルで、Key vaultsに移動します。
作成したKey Vaultのアクセスポリシーの画面に移動し、「Create」をクリックします。
![スクリーンショット 2023-11-02 20.15.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/04399230-7d08-4052-7383-5bb3b7c5491a.png)

シークレットパーミッションのGetにチェックを入れ、「Next」をクリックします。
![スクリーンショット 2023-11-02 20.15.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/f99abe84-b59b-d74b-afe7-0ccea3c374e6.png)

プリンシパルにAutonomous Databaseのプリンシパルを設定します。
![スクリーンショット 2023-11-02 20.16.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/18555a8d-5989-3631-237d-633784161c0c.png)

ADBSと入力して検索し、2.で確認したazure_app_nameの値と同じ名前のプリンシパルを設定します。
![スクリーンショット 2023-11-02 20.17.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/bffb1f74-9d7b-dabe-16f8-d1a840f070f6.png)

そのまま「Next」をクリックします。
![スクリーンショット 2023-11-02 20.18.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/87bf2621-701d-eeff-e1bf-aab5d5c2f544.png)

設定内容を確認し、問題がなければ「Create」をクリックしてアクセス・ポリシーを作成します。
![スクリーンショット 2023-11-02 20.18.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/37a87812-a8b6-314f-eac7-12d78c99be09.png)

Autonomous DatabaseにKey Vault「MyAzureKeyVault777」からシークレットを取得することを可能にするポリシーが作成されました。
![スクリーンショット 2023-11-02 20.19.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/69fdcc88-f8bb-debb-859b-db63c565c7e1.png)

# 3. Azure Key Vaultに保存されているシークレットを使用したクレデンシャルの作成

Azure Key Vaultに保存されているシークレットを使用したクレデンシャルを作成します。
ここではAzure Blob Storageにアクセスするためのクレデンシャル「AZURE_SECRET_CRED」を作成します。
usernameにストレージ・アカウント名、secret_idにストレージ・アカウントのアクセスキーを保存しているAzure Key Vault内のシークレットの名前、azure_vault_nameにシークレットを保存しているKey Vaultの名前を指定します。

```
SQL> BEGIN DBMS_CLOUD.CREATE_CREDENTIAL(
  2      credential_name  => 'AZURE_SECRET_CRED',
  3      params  => JSON_OBJECT( 
  4        'username'          value 'myblobstorageaccount777', -- ストレージ・アカウント名
  5        'secret_id'         value 'StorageAccountAccessKey', -- シークレットの名前
  6        'azure_vault_name'  value 'MyAzureKeyVault777' )); -- Azure Key Vaultの名前
  7  END;
  8* /

PL/SQLプロシージャが正常に完了しました。

SQL>
```

# 3. Azure Key Vaultに保存されているシークレットを使用したクレデンシャルの使用

Azure Key Vaultに保存されているシークレットを使用して作成したクレデンシャルで、Azure Blob Storageにアクセスしてみます。
```
SQL> SELECT object_name FROM 
  2  DBMS_CLOUD.LIST_OBJECTS(
  3       'AZURE_SECRET_CRED', 
  4       'https://myblobstorageaccount777.blob.core.windows.net/mycontainer/'
  5* );

OBJECT_NAME    
______________ 
zaiko.csv      

SQL>
```
Azure Key Vaultに保存されているシークレットを使用して作成したクレデンシャルでAzure Blob Storageにアクセスできました。

# 参考情報
・[Use Vault Secret Credential with Azure Key Vault](https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/vault-secret-credentials-azure.html#GUID-BDF79861-7FBA-4066-88A5-E0CA0C414031)
・[ENABLE_PRINCIPAL_AUTH Procedure](https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/dbms-cloud-admin.html#GUID-DB61623B-E4AF-4F82-9AFE-DF58601D4852)
・[CREATE_CREDENTIAL Procedure](https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/dbms-cloud-subprograms.html#GUID-742FC365-AA09-48A8-922C-1987795CF36A)