OCI IAMとBaseDBのトークン・ベースの認証連携②

今回は、IAMのグループとDatabaseの共有スキーマをマッピングする手順について紹介します。
前回設定した排他的マッピングは、IAMユーザーとDBスキーマを1:1でマッピングするため、ユーザー数の増加や権限の動的に変更すること等の管理が面倒になることも多いです。
共有マッピングの場合は、IAMのグループとDBスキーマまたはDBロールとマッピングし、IAMのユーザーは所属するグループの変更で動的に権限の変更が可能になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/399490b1-587e-7221-0a7f-de0dd149fa1f.png)



## 1. IAMグループの作成と割当て
以下4つのグループを作成
- **db_users, db_admins, resource_role, pdb_dba_role**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/d6e5f6ae-6f50-ac80-208c-e611c9f2d03a.png)

emp1とmgr1ユーザーにそれぞれ作成した以下のグループを割り当てる ※dbtoken_grpはそのまま
- emp1 <-- **db_users, resource_role**
- mgr1 <-- **db_admins, pdb_dba_role**

## 2. IAMユーザーとのDBスキーマのマッピング
BaseDBでIAMグループとDBの共有スキーマとロールを作成し、それぞれにDBのアクセス権限を付与する

```sql
-- DB:dbusersスキーマとIAM:db_usersグループをマッピングしたユーザーを作成
CREATE USER dbusers IDENTIFIED GLOBALLY AS 'IAM_GROUP_NAME=db_users';
grant connect to dbusers;

-- DB:dbadminsスキーマとIAM:db_adminsグループをマッピングしたユーザーを作成
CREATE USER dbadmins IDENTIFIED GLOBALLY AS 'IAM_GROUP_NAME=db_admins';
grant connect to dbadmins;

-- DB:resource_roleロールとIAM:resource_roleグループをマッピングしたロールを作成、resorce権限を付与
CREATE ROLE iam_resource_role IDENTIFIED GLOBALLY AS 'IAM_GROUP_NAME=resource_role';
grant resource to iam_resource_role;

-- DB:pdb_dba_roleロールとIAM:pdb_dba_roleグループをマッピングしたロールを作成、pdb_dba権限を付与
CREATE ROLE ima_pdb_dba_role IDENTIFIED GLOBALLY AS 'IAM_GROUP_NAME=pdb_dba_role';
grant pdb_dba to ima_pdb_dba_role;
```

上記の設定で意味するところは、IAMのdb_usersグループに割り当てられたIAMユーザーは、トークンで認証後にDBにはdbuserで接続され、connect権限を持つ。さらに、IAMのresource_roleグループに割り当てれば、DBのresource権限が付与される

## 3. 接続テスト
emp1とmgr1のそれぞれのDBトークンを取得し、DBに接続した際のマッピングされているユーザーと権限を確認する

```s
#前回のテストで実施したemp1の排他的マッピングを削除しておく
SQL> DROP USER emp1;

#emp1ユーザーのOCIプロファイルに変更
$ export OCI_CLI_PROFILE=emp1

#DBトークンを取得
$ oci iam db-token get
Private key written at /home/opc/.oci/db-token/oci_db_key.pem
db-token written at: /home/opc/.oci/db-token/token
db-token is valid until 2024-01-31 14:12:43

#トークン・ベースで接続
$ sqlplus /@iam
Connected to:
Oracle Database 19c EE High Perf Release 19.0.0.0.0 - Production
Version 19.21.0.0.0
SQL> show user
USER is "DBUSERS"  #DBスキーマ DBUSERSにマッピングされた

#権限はresourceロールの権限が付与されている
SQL> select * from SESSION_PRIVS;
PRIVILEGE
----------------------------------------
CREATE SESSION
CREATE TABLE
CREATE CLUSTER
CREATE SEQUENCE
CREATE PROCEDURE
CREATE TRIGGER
CREATE TYPE
CREATE OPERATOR
CREATE INDEXTYPE
SET CONTAINER

10 rows selected.

#mgr1に変更
$ export OCI_CLI_PROFILE=emp1

#DBトークンを取得
$ oci iam db-token get

#トークン・ベースで接続
$ sqlplus /@iam
SQL> show user
USER is "DBADMINS"　#DBスキーマ DBADMINSにマッピングされた

#権限はpdb_dbaロールの権限が付与されている
SQL> select * from SESSION_PRIVS;
PRIVILEGE
----------------------------------------
CREATE SESSION
CREATE PLUGGABLE DATABASE
SET CONTAINER
```
emp1の割り当てグループを変えることによって、DBに接続した際のユーザーや権限が動的に変わる。変更が反映されるまで1-2分程度かかる場合がある。

## WEBブラウザを使用したDBトークンの取得
上記のテストでは、IAMユーザの設定済みのAPIキーを使用してDBトークンを取得していましたが、WEBブラウザを使用したCLIセッションを利用すれば、IAMの二要素認証経由でDBトークンを取得するというフローも可能です。
まず、インターネットアクセス可能なWindowsにOCI CLIをインストールし、PowerShellで以下を実行します。

```shell
PS> oci session authenticate
Enter a region by index or name  <-- Regionの番号入力
    Please switch to newly opened browser window to log in!
    You can also open the following URL in a web browser window to continue:
https://login.ap-tokyo-1.oraclecloud.com/v1/oauth2/authorize?action=login&client_id=iaas_console&response_type=token+id_token&nonce=3d3da188-bd19-4f50-b59c-ec961211b5ec&scope=openid&public_key=eyJrdHkiOiAiUlNBIiwgIm4iOiAidHA2UD************
```
ブラウザに起動したOCIの認証画面からサインイン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/ec204f57-78b4-7f58-044b-e90dfb94f0ba.png)

```
#ログインが成功すれば、IAMへのアクセストークンが作成される
    Completed browser authentication process!
Enter the name of the profile you would like to create: emp1 <--任意のプロファイル名
Config written to: C:\Users\***\.oci\config

    Try out your newly created session credentials with the following example command:
    oci iam region list --config-file C:\Users\***\.oci\config --profile emp1 --auth security_token

#プロファイル名を指定して、DBトークンを取得 
oci iam db-token get --config-file C:\Users\***\.oci\config --profile emp1 --auth security_token
```
トークンを取得後は、同様にSQLPlusで使用してDBアクセスすることが可能です。

以上がBaseDBのトークン認証連携の設定手順とテスト方法です。ExaDB-Dでも基本的な設定の流れは同じになります。