Azure ADのトークンでOracle Base Databaseに認証する

Oracle Database23cの新機能として、Azure ADのトークンでOracle Databaseへの認証できるようになりました。
元々Azure ADのトークンでOracleの自立型データベース「Autonomous Database」には認証できたのですが、23cの新機能としてAutonomous DatabaseだけでなくOracle Base Database,オンプレミスのOracle DatabaseでもAzure ADのトークンで認証ができるようになりました。
本機能はOracle Database23cの新機能リリースと同時に19cにもバックポートされ、19cでもご利用いただけます。
※21cではご利用いただけません。

本記事ではAzure ADのトークンでOracle Base Database23cのPDBに認証する手順を紹介します。

# 前提条件
+ こちらの[Qiita](https://qiita.com/jenlia3/private/46003b6006343986a38c)を参考に、Base DatabaseでTLS通信を有効化していること
+ Azure ADのアカウントを取得していること
+ Azure ADでOracle Databaseにアクセスするユーザーを作成していること
+ [Azure AD ドキュメント](https://learn.microsoft.com/en-us/cli/azure/install-azure-cli-linux?pivots=script)を参考に、Azure CLIをOracle Databaseのクライアントにインストールしていること
+ バージョン19cまたは23cのデータベースであること
+ バージョン19cのクライアントを使用していること
+ Base DatabaseのあるサブネットのSecurity ListまたはNetwork Security Groupでポート443へのegress通信が許可されていること。
+ Base Databaseがプライベートサブネットにある場合、NAT Gatewayが構成されていること
+ その他の条件は[ドキュメント](https://docs.oracle.com/en/cloud/paas/bm-and-vm-dbs-cloud/azure/index.html#GUID-177F7732-3FBF-46A7-AE4E-AA7C997A94C4)をご参照ください


# 1. Azure ADにBase Databaseをアプリとして登録する

Microsoft Azureポータルにログインし、「Azure Active Directory」を選択します。

![スクリーンショット 2023-09-04 14.48.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3424859/f9b7ee4c-fb7f-52f5-8b7c-260cbc6dca22.png)

画面左側のメニューから「アプリの登録」を選択します。
![スクリーンショット 2023-09-04 14.50.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3424859/604d7e84-8d62-a7d8-d338-f57ffedefe31.png)

アプリの登録画面にて、「新規登録」をクリックします。
![スクリーンショット 2023-09-04 14.53.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3424859/60ee11b0-d7c7-afdd-9bb5-fa9f7a554082.png)

任意のアプリケーションの名前を入力します。
![スクリーンショット 2023-09-04 16.16.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3424859/b287a07a-920a-bc1d-645e-6ae67ac0c580.png)
「サポートされているアカウントの種類」はご利用のAzure ADの環境、ユースケースに合わせて選択してください。
リダイレクトURIは何も入力せずに登録ボタンをクリックします。

アプリケーションの登録後、概要ページに表示される「アプリケーション（クライアント）ID」を手元にコピーし、「APIの公開」ページを開きます。
![スクリーンショット 2023-09-04 16.19.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3424859/251d1d00-e439-1d84-7faa-6776afebc836.png)

「APIの公開」画面上部にある、アプリケーションIDのURI「追加」ボタンから以下URIを入力し、「保存」ボタンをクリックします。
```
https://<テナントのプライマリ・ドメイン>/<アプリケーション（クライアント）ID>
例）https://xxxgmail.onmicrosoft.com/92922fff-e062-45c5-9dfe-0bc888655223
```
:::note 
テナントのプライマリ・ドメインはAzure Active Directoryの概要ページから確認できます。
:::

続いて、同ページの「Scopeの追加」ボタンをクリックします。
![スクリーンショット 2023-09-04 16.32.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3424859/2e9fb29e-2612-2f3d-39dc-15409e4178e2.png)


スコープの追加画面では以下情報を入力し、スコープを追加します。
+ スコープ名 - session:scope:connect
+ 同意できるのは誰ですか - 管理者とユーザー
+ 管理者の同意の表示名 - 任意
+ 管理者の同意の説明 - 任意
+ 状態 - 有効
![スクリーンショット 2023-09-04 16.36.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3424859/f5faa79d-58c2-bf14-f36e-d3402f68f702.png)

# 2. Azure ADアプリロールの作成
手順1で登録したアプリケーションの詳細画面の「アプリロール」ページを開き、「アプリロールの作成」をクリックします。
![スクリーンショット 2023-09-04 16.39.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3424859/7600fabf-1c74-7278-1dea-f3859fa44ba9.png)
アプリロールの作成画面にて以下情報を入力し、「適用」ボタンをクリックします。
![スクリーンショット 2023-09-04 19.53.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3424859/e0f8d7e2-9786-2527-cbeb-9bc8781ceb47.png)
+ 表示名 - 任意
+ 許可されたメンバーの種類 -　「両方（ユーザー/グループ+アプリケーション」 
+ 値 -　Oracle Databaseのロールとマッピングするロール名　例）dba_admin ※スペースは入れないでください 
+ 説明 - 任意


# 3. Databaseアプリにロールとユーザーを割り当て
Azure Active Directoryの概要ページの画面左側のメニューから「エンタープライズ　アプリケーション」を選択します。
![スクリーンショット 2023-09-04 20.00.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3424859/0caeca16-d6a4-17e7-d754-679cf84461d1.png)

手順1で作成したアプリケーションを選択します。
![スクリーンショット 2023-09-04 20.02.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3424859/28cdff4f-13ed-0429-7300-cbe34e809068.png)

アプリケーションの概要ページのGetting Started配下にある「ユーザーとグループの割り当て」をクリックします。
![スクリーンショット 2023-09-04 20.04.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3424859/3a1e401b-987b-5024-90b5-6e686c6eb9bf.png)

ユーザーとグループの画面上部にある「ユーザーまたはグループの追加」ボタンをクリックします。
![スクリーンショット 2023-09-04 20.06.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3424859/cc056b19-532d-209c-ea1f-ef026765787b.png)

割り当ての追加画面にて、Databaseにアクセスするユーザーとロールをそれぞれ選択して「割り当て」ボタンをクリックします。
![スクリーンショット 2023-09-04 20.08.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3424859/468f3c60-b750-07a0-a710-31b04f09075f.png)
![スクリーンショット 2023-09-04 20.08.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3424859/3870b2a7-0996-1d5c-05dc-28c5ab43bcaa.png)



# 4. アプリロールにアクセス許可を付与する
Azure Active Directoryの概要ページから「アプリの登録」ページを開き、手順1で作成したDatabaseのアプリケーションを開きます。
![スクリーンショット 2023-09-04 20.16.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3424859/c2603a28-ab83-d86e-54b9-a9491cbf0475.png)

Databaseアプリケーションの概要画面左側の「所有者」ページを開き、操作を実行しているユーザーが「所有者」として割り当てられていることを確認します。
※所有者が割り当てられていない場合は、画面上部の「所有者の追加」ボタンから操作を実行しているユーザーを手動で割り当ててください。
![スクリーンショット 2023-09-04 20.21.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3424859/2d38ba53-87df-740b-26d0-815d0dd0ca90.png)

Databaseアプリケーション概要画面左側の「APIのアクセス許可」ページを開き、「アクセス許可の追加」ボタンをクリックします。
![スクリーンショット 2023-09-04 20.23.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3424859/8a58c304-202e-dcb2-810e-1c6202bde9d2.png)

「自分のAPI」のタブを開き、手順1で作成したDatabaseアプリケーションを選択します。
![スクリーンショット 2023-09-04 20.40.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3424859/2102fe6a-6396-6081-7e9b-0a2b3fe19ff6.png)

「アプリケーションの許可」を選択し、手順2で作成したアプリロールにチェックを入れ、「アクセス許可の追加」ボタンをクリックします
![スクリーンショット 2023-09-04 20.41.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3424859/6321eb38-99d6-ba8b-c893-4d5f55e96707.png)

APIのアクセス許可画面の「既存のディレクトリに管理者の同意を与えます」を選択し、「はい」をクリックします。
![スクリーンショット 2023-09-04 20.43.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3424859/d12d783d-9d08-a6bb-7165-0dd672a73148.png)


# 5. Base DatabaseでAzure ADによる外部認証を有効化する

Base DatabaseにSYSDBA権限でアクセスし、以下SQLコマンドで外部認証を有効化します。

```ruby:SQL*Plus
#今回はPDBにアクセスするので、PDBで外部認証を有効化します。
SQL>alter session set container=<PDB名>；
SQL>ALTER SYSTEM SET IDENTITY_PROVIDER_TYPE=AZURE_AD SCOPE=BOTH;
SQL>SELECT NAME, VALUE FROM V$PARAMETER WHERE NAME='identity_provider_type';
NAME                    VALUE 
----------------------  ------- 
identity_provider_type  AZURE_AD

#Azure ADの情報を登録
SQL>ALTER SYSTEM SET IDENTITY_PROVIDER_CONFIG = '{"application_id_uri" : "<手順1で設定したアプリケーションID URI>", "tenant_id" : "<テナントID>", "app_id" : "<手順1で作成したDatabaseアプリケーションのアプリケーションクライアントID>"
}' SCOPE=BOTH;

#例)
SQL>ALTER SYSTEM SET IDENTITY_PROVIDER_CONFIG = '{"application_id_uri" : "https://xxxgmail.onmicrosoft.com/92922fff-e062-45c5-9dfe-0bc888655223", "tenant_id" : "df4a6dc0-cb54-486f-a9f4-7ca3ecf170db", "app_id" : "af3ba28b-d80c-44bb-b8af-dc03601b6b42"}' SCOPE=BOTH;
```
:::note 
テナントIDはAzure Active Directoryの概要ページから確認できます。
:::

# 6. Oracle Databaseユーザーの作成とAzure ADとのマッピング

Oracle Databaseのユーザーは、直接Azure ADのユーザーとマッピング、もしくはAzure ADのアプリロールとマッピングすることができます。
また、Oracle DatabaseのロールをAzure ADのアプリロールとマッピングすることもできます。

![スクリーンショット 2023-09-05 17.35.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3424859/c32b6d97-fcea-4543-ab81-a93017059089.png)

Oracle Databaseにアクセスし、`identified globally　as`でマッピングするAzure ADユーザーを指定してDatabaseユーザーを作成します。
```ruby:SQL*Plus
$sqlplus / as sysdba
SQL>alter session set container=<PDB名>;
SQL>CREATE USER <ユーザー名> IDENTIFIED GLOBALLY AS 'AZURE_USER=<AZURE ADユーザー名>'
#例）
SQL>CREATE USER AZUREUSER1 IDENTIFIED GLOBALLY AS 'AZURE_USER=XXX@YYYGMAIL.ONMICROSOFT.COM';

SQL>GRANT CREATE SESSION TO <ユーザー名>;
#例）
SQL>GRANT CREATE SESSION TO AZUREUSER1;
```
また、Oracle DatabaseのロールにAzure ADのアプリロールをマッピングことや、Oracle DatabaseのユーザーをAzure ADのアプリロールとマッピングすることもできます。

```ruby:Oracle DatabaseのロールにAzure ADのアプリロールをマッピングする場合

SQL>CREATE ROLE <ロール名> IDENTIFIED GLOBALLY AS 'AZURE_ROLE=<Azure ADアプリロール名>;
#例）
SQL>CREATE ROLE AZURE_DBA IDENTIFIED GLOBALLY AS 'AZURE_ROLE=dba_admin';

SQL>GRANT CREATE SESSION TO <ロール名>;
#例）
SQL>GRANT CREATE SESSION TO AZURE_DBA;
```
```ruby:Orale DatabaseのユーザーにAzure ADのアプリロールをマッピングする場合
SQL>CREATE USER <ユーザー名> IDENTIFIED GLOBALLY AS 'AZURE_ROLE=<Azure ADアプリロール名>;
#例）
SQL>CREATE USER AZUREUSER2 IDENTIFIED GLOBALLY AS 'AZURE_ROLE=dba_admin';

SQL>GRANT CREATE SESSION TO <ユーザー名>;
#例）
SQL>GRANT CREATE SESSION TO AZUREUSER2;
```
:::note
Azure ADアプリロール名には、手順2で作成したアプリロールの「値」を入力します。
:::

既存のユーザーをAzure ADのユーザーとマッピングしたい場合は、ALTER USERで変更します。
```ruby:既存のOracle DatabaseユーザーをAzure ADのユーザーとマッピングする場合
SQL>ALTER USER <ユーザー名>　IDENTIFIED GLOBALLY AS 'AZURE_USER=<AZURE ADユーザー名>';
```



# 7. Azure ADにクライアントをアプリとして登録する

Azure Active Directoryの概要ページ、画面左側のメニューから「アプリの登録」ページを開きます。
![スクリーンショット 2023-09-04 14.50.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3424859/8f23a448-cde1-6046-a6b1-ac39467276b5.png)

アプリの登録画面の「新規登録」ボタンをクリックします。
![スクリーンショット 2023-09-05 10.57.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3424859/e2206857-737e-3be3-9ffd-18dcea5e9f02.png)

アプリケーションの登録画面で以下情報を入力し、登録します。
+ 名前 - 任意
+ サポートされているアカウントの種類 - ご利用のAzure ADの環境、ユースケースに合わせて選択してください
+ リダイレクトURI - 「パブリッククライアント/ネイティブ（モバイルとデスクトップ）」を選択し`http://<クライアントのIPアドレス>`を入力します。ローカルPCの場合は`http://localhost`と入力してください。

![スクリーンショット 2023-09-05 11.20.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3424859/e27e0d63-800e-8926-5683-b3bb4dc0c02f.png)

作成したクライアントのアプリケーションの「アプリケーション（クライアント）ID」を手元にメモします。
![スクリーンショット 2023-09-05 12.06.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3424859/14040006-f14e-e61a-f012-ee1f1b4a913f.png)

アプリの登録画面から、手順1で登録したDatabaseのアプリケーションの「APIの公開」ページを開き、画面下部の「クライアントアプリケーションの追加」をクリックします。
![スクリーンショット 2023-09-05 13.38.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3424859/c07476bf-64ee-6d27-e278-c6963c30ddfa.png)

クライアントIDに、登録したクライアントのアプリケーションの「アプリケーション（クライアント）ID」を入力します。
承認済みのスコープにチェックをいれ、「アプリケーションの追加」ボタンをクリックします。
![スクリーンショット 2023-09-05 13.40.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3424859/46bccabd-b367-e49c-a8b9-07e32a28e9c4.png)


# 8. Azure　ADのトークンを取得する

Azure ADのトークンを取得します。
Azure ADのトークンを取得する方法は色々ありますが、今回はAzure CLIコマンドを使用してトークンを取得します。
Azure CLI以外の方法でトークンを使用する方法は[ドキュメント](https://docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/authenticating-and-authorizing-microsoft-azure-active-directory-users-oracle-databases.html#GUID-3128BDA4-A233-48D8-A2B1-C8380DBDBDCF)をご確認ください。

また、Azure CLIコマンドのインストール方法についてはこちらの[ドキュメント](https://learn.microsoft.com/en-us/cli/azure/install-azure-cli-linux?pivots=apt)をご確認ください。

Azure CLIをインストールしたLinuxインスタンスにアクセスし、以下コマンドを実行します。
```
$az login
To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code NXDZADCPA to authenticate.
```
コマンドの出力結果に表示されたURLとコードを手元にメモしてください。
まずはURLにブラウザでアクセスすると、コードを入力する画面が表示されます。コマンドの出力結果に表示されたコードを入力します。

![スクリーンショット 2023-09-05 14.26.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3424859/2934b303-2d4f-b3c7-c30d-cfd73b044fdb.png)


続いてログインするユーザーを選択する画面が表示されます。
ここでは、手順5で作成したOracle DatabaseのユーザーとマッピングされたAzure ADユーザーを選択してください。
ユーザーが表示されない場合は、「+別のアカウントを使用する」からログインするユーザーを指定してください。

![スクリーンショット 2023-09-05 14.26.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3424859/03e6dc12-067e-ec57-d4f0-e63b5ad86302.png)

Azure ADユーザーのパスワードを入力します。
![スクリーンショット 2023-09-05 14.27.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3424859/58414dc8-ccaf-b7f9-3153-798b769aa0d5.png)

ログインできたら、「Microsoft Azure CLIにサインインしますか？」というメッセージが表示されるので、「続行」ボタンをクリックします。
![スクリーンショット 2023-09-05 14.27.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3424859/76d9dbf1-e193-a864-900b-72940c1f8eb5.png)

Azure CLIにサインインできたらブラウザのタブを閉じます。
Linuxのクライアントのターミナルに以下のようなメッセージが表示されたらログイン成功です。
```
[
  {
    "cloudName": "AzureCloud",
    "homeTenantId": "df4a6dc0-cb54-486f-a9f4-7ca3ecf170db",
    "id": "e6318636-deca-404f-92de-9defbbbfe1f7",
    "isDefault": true,
    "managedByTenants": [],
    "name": "Azure subscription 1",
    "state": "Enabled",
    "tenantId": "df4a6dc0-cb54-486f-a9f4-7ca3ecf170db",
    "user": {
      "name": "xxx@yyygmail.onmicrosoft.com",
      "type": "user"
    }
  }
]
```

続いて、以下コマンドを実行しトークンを取得します。
```
token=$(az account get-access-token --resource=<手順1で作成したDatabaseアプリケーションのアプリケーションID URI> --query accessToken --output tsv)
#例）
token=$(az account get-access-token --resource=https://xxxgmail.onmicrosoft.com/af3ba28b-d80c-44bb-b8af-dc03601b6b42 --query accessToken --output tsv)

#取得したトークンを任意のファイル名に出力します
$echo "$token" >> token

#トークンを任意のディレクトリに保存します。今回は/test/oracle/というディレクトリに保存します。
$sudo mkdir /test/oracle/
$sudo mv token /test/oracle/
```
:::note
Azure CLIをインストールして初めてトークンを取得する場合は、以下のようなエラーメッセージが表示されます。
The user or administrator has not consented to use the application with ID '04b07795-8ddb-461a-bbee-02f9e1bf7b46' named 'Microsoft Azure CLI'. Send an interactive authorization request for this user and resource.
これはAzure CLIというアプリケーションが、手順1で登録したDatabaseのアプリケーションの「承認済みのクライアントアプリケーション」として登録されていないからです。
この場合は、エラーメッセージに表示されたIDを手順1で登録したDatabaseのアプリケーションの「APIの公開」から、クライアント　アプリケーションに追加してください。
:::

Azure ADのトークンの有効期限はデフォルトで１時間です。取得して１時間を経過した場合は、再度以下コマンドでトークンを取得してください。
```
token=$(az account get-access-token --resource=<手順1で作成したDatabaseアプリケーションのアプリケーションID URI> --query accessToken --output tsv)
```

# 9. SQL*Plusの構成
SQL*Plusコマンド実行時にトークンを使用するようにsqlnet.oraとtnsnames.oraファイルを修正します。

クライアント側のsqlnet.oraファイルを開き、以下3行を追記します。
```ruby:sqlnet.ora
SSL_SERVER_DN_MATCH=ON
TOKEN_AUTH=OAUTH
TOKEN_LOCATION=<トークンを保存したディレクトリ>
```
トークンのファイル名が「token」の場合は、tokenファイルがあるディレクトリを指定します。
トークンのファイル名が「token」以外の場合は、ファイル名を含めたディレクトリを指定します。
例)
ファイル名がtokenの場合：/test/oracle
ファイル名がazure.tokenの場合：/test/oracle/azure.token


続いて、tnsnames.oraファイルを編集し、接続詞に`SSL_SERVER_CERT_dn`,`TOKEN_AUTH`,`TOKEN_LOCATION`を追記します。

```ruby:tnsnames.ora
DB23C_PDB1_tls =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCPS)(HOST = 10.0.0.231)(PORT = 1522))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = db23c_pdb1.sub09140234280.vcntest.oraclevcn.com)
    )
    (SECURITY =
      (SSL_SERVER_CERT_dn="CN=<作成した証明書で登録したCN（PDBのサービス名）>")
      (TOKEN_AUTH=OAUTH)
      (TOKEN_LOCATION="<トークンを保存したディレクトリ>")
    )
  )

例）
DB23C_PDB1_tls =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCPS)(HOST = 10.0.0.231)(PORT = 1522))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = db23c_pdb1.sub09140234280.vcntest.oraclevcn.com)
    )
    (SECURITY =
      (SSL_SERVER_CERT_dn="CN=db23c_pdb1.sub09140234280.vcntest.oraclevcn.com")
      (TOKEN_AUTH=OAUTH)
      (TOKEN_LOCATION="/test/oracle/azure.token")
    )
  )

```

# 10. Base Databaseのネイティブ・ネットワーク暗号化の無効化
トークンによる認証と、ネイティブ・ネットワーク暗号化（NNE）は同時に有効化することができないので、Base Databaseのsqlnet.oraを修正します。
sqlnet.oraファイルにある`SQLNET.ENCRYPTION_*`と`SQLNET.CRYPTO_*`の行を全て削除します。
```ruby:sqlnet.ora
# ENCRYPTION_WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=/opt/oracle/dcs/commonstore/wallets/tde/$ORACLE_UNQNAME)))

ENCRYPTION_WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=/opt/oracle/dcs/commonstore/wallets/$ORACLE_UNQNAME/tde)))

#以下SQLNET.ENCRYPTION_*とSQLNET.CRYPTO_*で始まる行を全て削除
SQLNET.ENCRYPTION_SERVER=REQUIRED
SQLNET.CRYPTO_CHECKSUM_SERVER=REQUIRED
SQLNET.ENCRYPTION_TYPES_SERVER=(AES256,AES192,AES128)
SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER=(SHA256,SHA384,SHA512,SHA1)
SQLNET.ENCRYPTION_CLIENT=REQUIRED
SQLNET.CRYPTO_CHECKSUM_CLIENT=REQUIRED
SQLNET.ENCRYPTION_TYPES_CLIENT=(AES256,AES192,AES128)
SQLNET.CRYPTO_CHECKSUM_TYPES_CLIENT=(SHA256,SHA384,SHA512,SHA1)
SQLNET.EXPIRE_TIME=10
```

# 11. Base Databaseにアクセスする

最後にトークンを使用してOracle Databaseにアクセスできるか動作確認します。
```ruby:SQL*Plus
$sqlplus /nolog
SQL*Plus: Release 19.0.0.0.0 - Production on Mon Sep 4 04:44:11 2023
Version 19.19.0.0.0
Copyright (c) 1982, 2022, Oracle.  All rights reserved.

SQL>connect /@ <PDB接続詞>

例）
SQL>connect /@DB23C_PDB1_tls
Connected.
```
Connectedと表示されたらAzure ADのトークンでの認証に成功です。

以下SQLで接続しているユーザー名とプロトコルも確認できます。
```ruby:SQL*Plus
SQL>show user;
USER is "AZUREUSER1"
SQL>SELECT SYS_CONTEXT('USERENV','NETWORK_PROTOCOL') FROM dual;

SYS_CONTEXT('USERENV','NETWORK_PROTOCOL') 
------------------------------------------
tcps
```

以上の手順で、Azure ADのトークンでOracle Base Databaseにアクセスする設定は完了です。

エラーが発生した場合、例えばBase DatabaseのOSレベルでインターネット（ポート443）へのトラフィックが拒否されていないか、などネットワークの設定を見直してみてください。
また、取得したトークンは、こちらの[サイト](https://jwt.io/)で解析することで、中身にどのような資格情報が含まれているかを確認することも可能です。正しくトークンが取得されているか、トークンの中身を確認したい場合にご利用ください。

トークンに関するエラーやBase Databaseへの接続に失敗する場合、クライアントのsqlnet.oraファイルに以下を追記することで、指定したディレクトリにトレースログを出力することが可能です。
```ruby:sqlnet.ora
EVENT_25701=15
DIAG_ADR_ENABLED=TRUE
ADR_BASE=<トレースログを出力するディレクトリ>

例）ADR_BASE=/oracle/oauth2/trace
```
sqlnet.oraで指定したディレクトリ配下にトレースログが出力されます。
```ruby:例）/oracle/oauth2/trace/oradiag_opc/diag/clients/user_opc/host_3143765784_110/trace/ora_7413_140070222014976.trc

KPUZLN_TOKEN_CLIENT_TRC: OCI_ATTR_TOKEN_ISBEARER is not set to TRUE.

	KPUZLN_TOKEN_CLIENT_TRC: Read OAUTH token Params.
	Info = TOKEN_AUTH has the value of OAUTH.

	KPUZLN_TOKEN_CLIENT_TRC: Read OAUTH token Params.
	TOKEN_LOCATION specified: /test/oracle/azure.token

	KPUZLN_TOKEN_CLIENT_TRC: Retry read OAUTH token from file.
	reason = Either /test/oracle/azure.token is not a directory, or the directory does not contain a file named "token".
	file type = 3

	KPUZLN_TOKEN_CLIENT_TRC: OAUTH token is successfully read from file.

	KZIAMC_CLIENT_TRC= base64 decode successful
	KZIAMC_CLIENT_TRC= prepare json parsing successful.
	KPUZLN_TOKEN_CLIENT_TRC: JSON parse of exp is successful.
	KPUZLN_TOKEN_CLIENT_TRC: Token is not expired.

	KPUZLN_TOKEN_CLIENT_TRC: TCPS check passed!
	reason = Protocol is TCPS which is required for token based authentication.

	KPUZLN_TOKEN_CLIENT_TRC: SSL_SERVER_DN_MATCH read info!
	reason = SSL_SERVER_DN_MATCH was not found in tnsnames.ora

	KPUZLN_TOKEN_CLIENT_TRC: SSL_SERVER_DN_MATCH read succeeded!
	reason = SSL_SERVER_DN_MATCH read from sqlnet.ora

	KPUZLN_TOKEN_CLIENT_TRC: SSL_SERVER_DN_MATCH check succeeded!
	reason = SSL_SERVER_DN_MATCH value is TRUE
```