2022年2月18日金曜日

OCI IAMユーザーにてAutonomous Databaseに接続する

 Autonomous Databaseの機能として、データベースに接続するときにOCI IAMのユーザーが使えるようになっています。

AskTOMのOffice Hourの以下のトピックで、製品マネージャが説明をしています。

Autonomous Database Authentication and Authorization - Integrating ADB-S with OCI IAM

マニュアルの記載は以下です。

https://docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/authenticating-and-authorizing-iam-users-oracle-autonomous-databases.html

APEXの管理者ユーザーと開発者ユーザーはデータベースのユーザーなので、この構成を行えばOCI IAMユーザーでAPEXの管理者ユーザーと開発者ユーザーを作れるか、と考えたのですがそれはできませんでした。

残念な結果でしたが、それとは別に、OCI IAMを使うために行った作業を記録しておきます。

作業はAlways FreeのAutonomous Transaction Processingで行なっています。作成直後の状態から始めます。


リソース・プリンシパルの有効化


Autonomous Databaseのリソース・プリンシパルを有効にします。

データベース・アクションSQLの画面を開きます。ビューDBA_CREDENTIALSを検索し、OCI$RESOURCE_PRINCIPALがないことを確認します。

select * from dba_credentials;


プロシージャDBMS_CLOUD_ADMIN.ENABLE_RESOURCE_PRINCIPALを実行し、リソース・プリンシパルを有効にします。

BEGIN
dbms_cloud_admin.enable_resource_principal;
END;


再度、ビューDBA_CREDENTIALSを検索します。credential_nameとしてOCI$RESOURCE_PRINCIPALenabledTRUEになっていることを確認します。



OCI IAMを使った外部認証の有効化


OCI IAMを使った外部認証を有効にします。

データベース・アクションSQLより、プロシージャDBMS_CLOUD_ADMIN.ENABLE_EXTERNAL_AUTHENTICATIONを実行します。引数typeOCI_IAMを与えます。


初期化パラメータのidentity_provider_typeOCI_IAMになっていることを、以下のSQL文を実行して確認します。

select name, value from v$parameter where name = 'identity_provider_type';



データベース接続ができるIAMユーザーの作成



データベース接続を行うIAMユーザーを、DBA_Debraとして作成します。

OCIコンソールのアイデンティティユーザーを開きます。

ユーザーの作成をクリックします。


ユーザー・タイプの選択としてIAMユーザーを選びます。名前DBA_Debra説明は必須項目なので、何か記述します。

作成をクリックします。


ユーザーDBA_Debraが作成されます。

リソースデータベース・パスワードを開き、データベース・パスワードの作成を実行します。


説明パスワードとなる文字列を2回入力し、データベース・パスワードの作成をクリックします。


以上でIAMユーザーの作成は完了です。



データベースのユーザーとロールに対応するグループの作成



データベース側に作成するグローバル・ユーザーおよびグローバル・ロールに対応するグループを作成します。

グローバル・ユーザーに対応するグループはAll_DB_Users、グローバル・ロールに対応するグループはDB_Adminとします。

OCIコンソールのアイデンティティグループを開きます。

グループの作成をクリックします。


名前All_DB_Users説明は必須項目なので何か記述し、作成をクリックします。


グループAll_DB_Usersが作成されます。

ユーザーをグループに追加をクリックし、ユーザーDBA_Debraを追加します。


ユーザーDBA_Debraを選択し、追加をクリックします。


同じ手順でグループDB_Adminを作成します。

グループAll_DB_UsersおよびDB_Adminが作成され、両方にユーザーDBA_Debraが所属していれば、OCI IAMの設定は完了です。



グローバル・ユーザーとグローバル・ロールの作成



データベース・アクションSQLより、グローバル・ユーザーUSER_SHAREDとグローバル・ロールSR_DBA_ROLEを作成します。

以下のCREATE USER文を実行し、グローバル・ユーザーUSER_SHAREDを作成します。

create user user_shared identified globally as 'IAM_GROUP_NAME=All_DB_Users';


続いて、グローバル・ロールSR_DBA_ROLEを作成します。以下のCREATE ROLE文を実行します。

create role sr_dba_role identified globally as 'IAM_GROUP_NAME=DB_Admin';


データベースへ接続できるようにユーザーUSER_SHAREDCREATE SESSION権限を与えます。

grant create session to user_shared;


グローバル・ロールSR_DBA_ROLEには、DBAとして必要な権限が与えられることが想定されていますが、今回の作業からは割愛します。

以上で、ユーザーDBA_Debraにて、データベースに接続できるようになりました。


接続の確認



SQLclとAutonomous Databaseのウォレットを使って接続確認を行います。

Autonomous Databaseの画面より、DB接続を開いてウォレットをダウンロードします。


SQLclはこちらよりダウンロードできます。

インスタンス名をAPEXDEV2とした場合、以下で接続します。

sql -cloudconfig Wallet_APEXDEV2.zip DBA_Debra@apexdev2_low

IAMユーザーのデータベース・パスワードとして設定したパスワードを正しく入力すると、データベースに接続できます。

% sql -cloudconfig Wallet_APEXDEV2.zip DBA_Debra@apexdev2_low



SQLcl: 金 2月 18 16:23:39 2022のリリース21.4 Production


Copyright (c) 1982, 2022, Oracle.  All rights reserved.


パスワード (**********?) ***********

接続先:

Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production

Version 19.14.0.1.0


SQL> 


接続に使ったユーザーはDBA_Debraですが、CURRENT_USERはUSER_SHAREDになります。

SQL> select sys_context('USERENV','CURRENT_USER') from dual;


   SYS_CONTEXT('USERENV','CURRENT_USER') 

________________________________________ 

USER_SHARED                              


SQL> 


ビューSESSION_ROLESを確認すると、ロールとしてSR_DBA_ROLEが割り当たっていることが確認できます。

SQL> select * from session_roles;


          ROLE 

______________ 

SR_DBA_ROLE    


SQL> 


以上でOCI IAMユーザーにてAutonomous Databaseに接続できることが確認できました。