Autonomous Databaseでリソースプリンシパルを有効化する

本記事は[Oracle Cloud Infrastructure Advent Calendar 2023](https://qiita.com/advent-calendar/2023/oci)のDay 12の記事として書かれています。

# はじめに
Autonomous Database(以下ADB)で主に以下のような操作を行うための認証方式としてリソース・プリンシパル(Resource Principal)が用意されています。

- DBMS_CLOUDパッケージの利用
- PL/SQL SDKの利用
- OCI関連のディクショナリの閲覧

似た仕組みとしてインスタンス・プリンスパル(Instance Principal)もありますが、リソース・プリンシパルはインスタンスではないリソースでも使用でき、より簡便に設定が可能です。
本記事では、リソース・プリンシパルの設定方法について解説します。
なお、ADBのインスタンスは作成済みの前提です。

# リソース・プリンシパルの有効化方法(ADMINユーザー)
SQL*PlusやSQLcl、Database ActionsなどにADMINユーザーでログインし、以下のコマンドを発行するだけです。
``` SQL
EXECUTE DBMS_CLOUD_ADMIN.ENABLE_RESOURCE_PRINCIPAL()
```

EXECUTEコマンドの場合、最後のピリオドは不要です(ピリオドをつけても問題なく動きます)。
また、「EXECUTE」の代わりに「EXEC」と短縮形で指定することも可能です。

上記環境であればEXECUTEコマンドがありますが、このコマンドがない環境から実施する場合は以下のように無名PL/SQLとして実行してください。

``` SQL
BEGIN
  DBMS_CLOUD_ADMIN.ENABLE_RESOURCE_PRINCIPAL();
END;
/
```

# リソース・プリンシパルの有効化の確認方法(ADMINユーザー)
以下のSQL文で確認が可能です。

``` SQL
SELECT owner, credential_name
  FROM dba_credentials 
 WHERE credential_name = 'OCI$RESOURCE_PRINCIPAL'
   AND owner = 'ADMIN'; 
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125837/6d514b2e-fde2-6f13-455f-3386af58b6c7.png)

検索結果に出てくる「OCI$RESOURCE_PRINCIPAL」を実際に認証方式を指定する箇所で指定してください。

# リソース・プリンシパルの有効化方法(ADMIN以外のDBユーザー)
SQL*PlusやSQLcl、Database ActionsなどにADMINユーザーでログインし、ADMINユーザーに対してリソース・プリンシパルを有効化した後に以下のコマンドを発行してください。
``` SQL
EXECUTE DBMS_CLOUD_ADMIN.ENABLE_RESOURCE_PRINCIPAL(username => '<DBユーザー名>')
```

# リソース・プリンシパルの有効化の確認方法(ADMIN以外のDBユーザー)
ADMIN以外のDBユーザーはADMINユーザーのようにDBA_CREDENTIALビューでは有効化を確認することができません。
以下のSQLで確認してください。
``` SQL
SELECT grantee, table_name, grantor
  FROM all_tab_privs
 WHERE grantor = 'ADMIN'
   AND table_name = 'OCI$RESOURCE_PRINCIPAL';
```

下記検索結果例はPLSQLSDKというDBユーザーへリソース・プリンシパルを有効化した結果となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125837/384d676b-62ce-c5d9-9178-56f00cddfbfb.png)


# 認可の設定について
リソース・プリンシパルを有効化しただけでは認証が通るだけで、実際の操作を行うためには該当操作の認可の設定も必要です。
認可の設定のためには
1. ADBからの操作のための動的グループの作成(初回のみ)
2. 動的グループに操作対象へのポリシーを付与

の作業を実施する必要があります。


## 動的グループの作成
1. まず、コンソールの該当ADBインスタンスの詳細画面でADBのOCIDを控えます。すぐにペーストするならコピーボタンによるコピーでも大丈夫です。
![20231204_adb09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125837/3a15ce59-1a4b-aed6-8d0c-b405d6d6c0de.png)



2. ハンバーガーメニューから「アイデンティティとセキュリティ」→「ドメイン」に移動し、ドメインの一覧から「Default」ドメインを選択します。環境によってはDefaultではないドメインが操作対象となります。

3. ドメインの詳細画面の左側のメニューから「動的グループ」を選択します。
![20231204_adb23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125837/e9ebfe42-0794-f488-6086-7615c8ef67d2.png)

4. 「動的グループの作成」をクリックします。
5.  動的グループの作成画面で以下を入力して動的グループを作成します。
    - 名前：動的グループの名称
    - 説明：動的グループの説明(省略可)
    - 一致ルール：「resource.id='1.のOCID'」
![20231204_adb15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125837/539755d0-28b9-7ede-9aa1-e29a39c602c0.png)


## ポリシーの付与
1. ハンバーガーメニューから「アイデンティティとセキュリティ」→「ポリシー」を選択します。
1. 「ポリシー」をクリックします。
1.ポリシーの作成画面で以下を入力してポリシーを作成します。
    - 名前：ポリシーの名称
    - 説明：ポリシーの説明(本画面では説明も必須項目)
    - ポリシー・ビルダー：必要なポリシーを設定。「dynamic-group」の後に、先に作成した動的グループを指定

![20231204_adb19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125837/c6ab1878-5d84-a4a1-0696-ebd9b275898c.png)
この例ではテナント全体に対してオブジェクト・ストレージのバケットの読み取り権限を付与していますが、実際には操作対象のリソースや許可範囲に合わせてto以降の内容を変更してください。

# その他注意点
[マニュアル](https://docs.oracle.com/en-us/iaas/autonomous-database-serverless/doc/resource-principal.html)のNoteの部分に記載がありますが、リソース・プリンシパルに対する動的グループやポリシーの反映には最大で2時間程度要します。設定したのに動かない、という場合は、しばらく待ってから再試行してみてください。

# 参照資料
- [ADBのマニュアル](https://docs.oracle.com/en-us/iaas/autonomous-database-serverless/index.html)
- 下記Qiita記事

https://qiita.com/ora_gonsuke777/items/a6f83ffd74c5d31e1ad9