[Oracle Cloud] Autonomous Databaseのログイン認証にIAM認証を使用してみた

#はじめに
Oracle Autonomous Database - Shared (ADB-S) と OCI IAM の統合によって可能になったことに、Oracle Cloud Infrastructure Identity and Access Management（IAM）の認証と認可を使用するようにAutonomous Databaseを構成して、IAMユーザーがIAM資格情報を使用してAutonomous Databaseにアクセスできるようにすることができます。
この機能の活用で以下のようなメリットがあります。

- 管理者は、ユーザーが組織に参加したり、役割を変更したり、組織を離れたりする際に、各データベースに個別に変更を加えることなく、すべてのADB-Sユーザーを一元的に管理できるようになりました。
- データベースユーザーは、データベースごとに異なるパスワードを覚えて使用する代わりに、単一のIAMデータベース証明書を使用してログインすることができます。

IAMでは、ユーザとデータベーススキーマのマッピングとデータベースの認証を一元化しています。
データベーススキーマは、IAMユーザ、または特定のIAMグループに属する複数のユーザーにマッピングすることができます。
同じIAMグループに属するデータベースユーザは、同じアクセス権を得ることができ、同じ責任を持つ複数のユーザーを管理するDBAの仕事を大幅に簡素化することができます。

ユーザは、複数のADB-Sデータベースに対して、一元管理された単一のユーザ名とパスワードで認証を行うことができるようになりました。
データベースクライアントに特別な設定やパッチは必要なく、現在データベースと連携しているクライアントはすべて正常に機能し続けます。

#構成ステップ
以下のステップで構成します。

1. Autonomous Databaseで外部認証としてIAM認証を有効化
- IAMグループとポリシーを作成
- Autonomous DatabaseグローバルユーザをIAMグループにマップ
- Autonomous DatabaseのグローバルロールをIAMグループにマップ
- IAMユーザのIAMデータベースパスワードを作成
- IAM認証を使用 してAutonomous Databaseに接続


# Autonomous Databaseで外部認証としてIAM認証を有効化
Database ActionsなどでAutonomous DatabaseにADMINユーザーとしてログインし、IAM認証を有効化

```
BEGIN
   DBMS_CLOUD_ADMIN.ENABLE_EXTERNAL_AUTHENTICATION( 
      type => 'OCI_IAM',
      force => TRUE );
END;
/
```

設定の確認

```
SELECT NAME, VALUE FROM V$PARAMETER WHERE NAME='identity_provider_type';
 
NAME                   VALUE   
---------------------- ------- 
identity_provider_type OCI_IAM 
```


# IAMグループとポリシーを作成
IAMにデータベースログイン用途のグループを作成し、Autonomous Databaseへのアクセスを許可するポリシーを作成、グループにIAMユーザを追加

グループ名の例：dbusers
ポリシーの例：allow group dbusers to use autonomous-database-family in tenancy


# Autonomous DatabaseグローバルユーザをIAMグループにマップ
IAMユーザがAutonomous Databaseへのアクセスするには、データベースグローバルユーザをIAMグループにマッピングします。
CREATE USER or ALTER USER文でIDENTIFIED GLOBALLY AS句を指定します。
CREATE USER global_user IDENTIFIED GLOBALLY AS 'IAM_GROUP_NAME=IAM_GROUP_NAME';

```
CREATE USER scott IDENTIFIED GLOBALLY AS 'IAM_GROUP_NAME=dbusers';
```


# Autonomous DatabaseのグローバルロールをIAMグループにマップ
Database ActionsなどでAutonomous DatabaseにADMINユーザーとしてログインし、CREATE ROLE文にIDENTIFIED GLOBALLY AS句にIAMグループ名を指定しロールを作成
CREATE ROLE global_role IDENTIFIED GLOBALLY AS    'IAM_GROUP_NAME=IAM_GROUP_of_WHICH_the_IAM_USER_IS_a_MEMBER';

```
CREATE ROLE export_role IDENTIFIED GLOBALLY AS    'IAM_GROUP_NAME=dbusers';
```

必要な権限やロールをグローバルロールに付与

```
GRANT CREATE SESSION TO export_role;
GRANT DWROLE TO export_role;
```


# IAMユーザのIAMデータベースパスワードを作成
IAMユーザの設定で「ユーザー機能の編集」で「データベース・パスワード」が有効になっていることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/7e437756-80cf-c1a1-f55a-2628e89550c6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/1685a8b6-c51d-baee-92f8-7cdcd8c9f55d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/9523a580-687d-242a-1d0a-e38e2175c993.png)

IAMユーザで「データベース・パスワード」から「データベース・パスワードの作成」をクリックし、パスワードを入力。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/cc7099f1-a950-f306-1577-a1a4937420c9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/c76b0262-3256-0bc0-7026-a954a1cb75cd.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/82323c1e-57d3-7517-9547-fa733c88be4f.png)


「データベース・ユーザー名の編集」をクリックし、Autonomous Databaseにログインの際に使用するグローバルユーザ名を入力。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/57e77823-1b02-6d9d-d170-7e12bd5c50a3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/2c4cf7d4-30a4-0ebb-4d73-15b958e0c071.png)

# IAM認証を使用 してAutonomous Databaseに接続
データベースクライアントを使用してIAMデータベースパスワードを持つIAMユーザのデータベースユーザでAutonomous Databaseにアクセス

```
CONNECT scott@atp_low
Enter password: password
```



# おわりに
IAMユーザでパスワードを一元管理してAutonomous Databaseにアクセスすることができました。
Autonomous DatabaseでIAM認証が有効になっている場合でも、そうでないデータベースユーザーはIDENTIFIED GLOBALLY以前と同じようにログインを続行できます。


# 参考情報

- [7.4 Configuring the Database Client Connection](https://docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/authenticating-and-authorizing-iam-users-oracle-autonomous-databases.html#GUID-6659F2D9-6928-4EEB-9A2F-FE9C7E0C6601)
- [Autonomous Database (ADB)を使ってみよう](https://oracle-japan.github.io/ocitutorials/database/#-autonomous-database-adb%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86)