2026年7月15日水曜日

Autonomous AI Databaseのデータベース・ツールを外部認証する - Okta編

本記事では、Okta Integratorを外部アイデンティティ・プロバイダーとした設定手順を紹介します。

以前の記事「Autonomous AI Databaseのデータベース・ツールを外部認証する - Microsoft Entra ID編」で使用しているMicrosoft Entra IDに関わる部分を、Okta Integratorに置き換えています。また、OktaはSQLclによる接続の認証に使用できません。そのため、SQLclの作業は行いません。

作業に使用するデータベースは、Entra IDのときと同様に、以下の構成のAutonomous AI Databaseを使用します。

データベース名SALESADBワークロード・タイプレイクハウスデータベースのバージョン19cです。

手元の作業ディレクトリは、salesadb_oktaとします。

Oktaのアプリケーションに設定するリダイレクトURIの形式です。

https://[パブリック・アクセスURLのホスト部]/adb/auth/v1/connect/okta/callback

Oktaでのアプリケーション作成手順などは、以前に公開している記事とほぼ同じです。


パッケージDBMS_CLOUD_FUNCTION_ADMINのCREATE_IDPに、OktaのDiscovery URL patternに関して、以下の説明がされています。
Org server: https://<okta-domain>/.well-known/openid-configuration
Default/custom server: https://<okta-domain>/oauth2/<authorization-server-id>/.well-known/openid-configuration
原因は不明ですが、カスタム(デフォルト含む)認可サーバーのDiscovery URLは設定不可でした。


Oktaの構成



OktaのAdmin Consoleにサインインします。

ディレクトリのグループを開き、グループを追加します。

作成したグループに、データベース・ツールに接続できるユーザーをまとめます。


グループの名前sales_dbusersとします。説明に、データベースに接続できるユーザーと書きました。

保存をクリックします。


グループに再度アクセスし、グループ一覧を更新します。

作成したグループsales_dbusersを開き、ユーザーを割り当てます。


ユーザーを割り当てをクリックします。


グループsales_dbusersにユーザーを割り当てます。


ユーザーの割り当てを完了します。


グループsales_dbusersの作成とユーザーの割り当てが完了しました。


アプリケーション・メニューのアプリケーションを開き、アプリ統合を作成します。


新しいアプリ統合を作成のダイアログが開きます。

サインイン方法OIDC - OpenID Connectを選択します。OIDC - OpenID Connectを選択すると、アプリケーションタイプの選択を求められます。アプリケーションタイプにはWebアプリケーションを選択します。

次へ進みます。


アプリ統合名SALESADBとします。付与タイプリフレッシュトークンチェックします。

サインインリダイレクトURLに、以下の形式のリダイレクトURIを設定します。

https://[パブリック・アクセスURLのホスト部]/adb/auth/v1/connect/okta/callback


画面下の割り当てに移動します。

アクセス制御選択されたグループにアクセスを制限を選択します。

選択されたグループとして、先ほど作成したsales_dbusersを選択します。

以上で保存します。


アプリケーションSALESADBが作成されます。

Oktaが発行するIDトークンにgroupsクレームを追加します。

サインオン・タブを開きます。


トークンクレームのセクションに、レガシー構成を表示という項目があります。これを広げます。

グループクレームというセクションが表示されるので、編集モードに切り替えます。

グループクレームのタイプフィルターを選択します。

グループのクレームフィルターとして、groups次で始まるsalesを設定します。

この設定によりIDトークンにクレームとしてgroupsが追加され、それにsalesで始まるグループ名の配列が渡されます。

保存をクリックします。


以上で、アプリケーションSALESADBの設定は完了です。

DBMS_CLOUD_FUNCTION_ADMIN.CREATE_IDP の引数に与える値を収集します。

アプリケーションの一般を開き、クライアントIDシークレットをコピーします。
 

セキュリティAPIからデフォルトの認可サーバーを開き、メタデータURIを確認します。


以上でOktaでの作業は完了です。



データベース・ツールの外部認証の構成




Oktaによる外部認証を有効にします。

アプリケーションSALESADBクライアントIDクライアント・シークレットは、すでに取得しています。

discovery_urlとして指定するメタデータURIは、デフォルトの認可サーバーのメタデータURIのホスト部より、以下の形式になります。

https://integrator-XXXXXXXXX.okta.com/.well-known/openid-configuration

Oktaを外部アイデンティティ・プロバイダーとして使用する場合、IDPとしてデータベースに登録する必要があります。DBMS_CLOUD_FUNCTION_ADMIN.CREATE_IDPを呼び出します。
BEGIN
   DBMS_CLOUD_FUNCTION_ADMIN.CREATE_IDP(
      idp_name       => 'OKTA',
      client_id      => '<client-id>',
      client_secret  => '<client-secret>',
      params         => JSON_OBJECT(
                           'discovery_url' VALUE
                           'https://<okta-domain>/oauth2/default/.well-known/openid-configuration'
                           ));
END;
/
最初に、デフォルト認可サーバーのメタデータURIを指定し、エラーが発生することを確認します。

https://integrator-XXXXXXXXX.okta.com/oauth2/default/.well-known/openid-configuration

SQL> BEGIN

  2     DBMS_CLOUD_FUNCTION_ADMIN.CREATE_IDP(

  3        idp_name       => 'OKTA',

  4        client_id      => '0***********************',

  5        client_secret  => 'r2y*******************************************',

  6        params         => JSON_OBJECT(

  7                             'discovery_url' VALUE

  8                'https://integrator-XXXXXXX.okta.com/oauth2/default/.well-known/openid-configuration'

  9                          ));

 10  END;

 11* /

BEGIN

*

行でエラーが発生しました 1:

ORA-20001: Create IDP failed while invoking broker. ORA-20001: Broker invocation failed for method POST, endpoint databases/<database_ocid>/ext_auths, request_type idp. ORA-20400:

ORA-06512: "C##CLOUD$SERVICE.DBMS_CLOUD_FUNCTION_ADMIN", 行1399

ORA-20001: Broker invocation failed for method POST, endpoint databases/<database_ocid>/ext_auths, request_type idp. ORA-20400:

ORA-06512: "C##CLOUD$SERVICE.DBMS_CLOUD_FUNCTION_INT", 行5810

ORA-20400: 

ORA-06512: "C##CLOUD$SERVICE.DBMS_CLOUD_REQUEST$PDBCS_260617_0", 行7839

ORA-06512: 行1

ORA-06512: "C##CLOUD$SERVICE.DBMS_CLOUD_REQUEST_INTERNAL", 行96

ORA-06512: 行2

ORA-06512: "C##CLOUD$SERVICE.DBMS_CLOUD_FUNCTION_INT", 行5802

ORA-06512: "C##CLOUD$SERVICE.DBMS_CLOUD_FUNCTION_ADMIN", 行1391

ORA-06512: 行2


https://docs.oracle.com/error-help/db/ora-20001/



More Details :

https://docs.oracle.com/error-help/db/ora-20001/

https://docs.oracle.com/error-help/db/ora-06512/

https://docs.oracle.com/error-help/db/ora-20400/

SQL>


discovery_urlにOrg ServerのメタデータURIを指定します。

https://integrator-XXXXXXXXX.okta.com/.well-known/openid-configuration

Org Serverの認可サーバーを指定すると、IDPの作成に成功します。

SQL> BEGIN

  2     DBMS_CLOUD_FUNCTION_ADMIN.CREATE_IDP(

  3        idp_name       => 'OKTA',

  4        client_id      => '0o**************98',

  5        client_secret  => 'r2*************************************************',

  6        params         => JSON_OBJECT(

  7                             'discovery_url' VALUE

  8                             'https://integrator-XXXXXXXX.okta.com/.well-known/openid-configuration'

  9                          ));

 10  END;

 11* /


PL/SQLプロシージャが正常に完了しました。


SQL> 


登録済みのIDPを一覧します。

select * from dba_list_idp;

SQL> select * from dba_list_idp;


IDP_ID                                                                            IDP_NAME    CLIENT_ID               PARAMS                                                                              

_________________________________________________________________________________ ___________ _______________________ ___________________________________________________________________________________ 

OKTA-f477****-****-****-****-********8a54-1cf6****-****-****-****-********6d96    OKTA        0o****************98    {"discovery_url":"https://integrator-XXXXXXXX.okta.com/.well-known/openid-configu    


SQL> 


以上で、外部アイデンティティ・プロバイダーとしてOktaが登録されました。

データベース・ユーザーとしてWKSP_APEXDEVを作成します。このユーザーは、Oracle APEXのワークスペースAPEXDEVのデフォルト・パーシング・スキーマとして使用します。

データベース・ユーザーWKSP_APEXDEVには、Oktaのグループsales_dbusersを割り当てます。WKSP_APEXDEVには最低限の権限のみを割り当ています。

create user wksp_apexdev identified globally as 'OKTA_GROUP=sales_dbusers';
alter user wksp_apexdev quota 25m on data;
grant create session to wksp_apexdev;
grant create table, create view, create procedure, create sequence to wksp_apexdev;

SQL> create user wksp_apexdev identified globally as 'OKTA_GROUP=sales_dbusers';


User WKSP_APEXDEVは作成されました。


SQL> alter user wksp_apexdev quota 25m on data;


User WKSP_APEXDEVが変更されました。


SQL> grant create session to wksp_apexdev;


Grantが正常に実行されました。


SQL> grant create table, create view, create procedure, create sequence to wksp_apexdev;


Grantが正常に実行されました。


SQL> 


スキーマWKSP_APEXDEVをREST有効にします。ORDS別名apexdev(これがAPEXワークスペース名として扱われます)を割り当てます。
BEGIN
    ORDS_ADMIN.ENABLE_SCHEMA(
        p_enabled             => TRUE,
        p_schema              => 'WKSP_APEXDEV',
        p_url_mapping_type    => 'BASE_PATH',
        p_url_mapping_pattern => 'apexdev',
        p_auto_rest_auth      => FALSE);
END;
/

SQL> BEGIN

  2      ORDS_ADMIN.ENABLE_SCHEMA(

  3          p_enabled             => TRUE,

  4          p_schema              => 'WKSP_APEXDEV',

  5          p_url_mapping_type    => 'BASE_PATH',

  6          p_url_mapping_pattern => 'apexdev',

  7          p_auto_rest_auth      => FALSE);

  8  END;

  9* /


PL/SQLプロシージャが正常に完了しました。


SQL> 


以上で、データベース・ツールの認証にOktaを使用できるようになりました。



データベース・ツールへの接続




Autonomous AI Databaseに接続し、使用するツールとしてSQL Developer Webを選択します。


SSOでサインインをクリックします。


外部アイデンティティ・プロバイダーとしてOktaを選択します。


Oktaのサインイン画面に移行します。

グループsales_dbusersに含まれているユーザーでサインインします。


サインイン手順については省略します。

HTTPのステータス・コードとして404 Not Foundが返されました。これは、ORDS別名として設定したapexdevではなく、スキーマ名がURLに含まれるために発生しています。

ブラウザに表示されているURLの/ords/wksp_apexdev/_sdw/の部分を/ords/apexdev/_sdw/に変更して、URLにアクセスします。

Oktaでユーザー認証した場合、/ords/apexdev/_sdw/に変更しても、404 Not Foundが返されます。


この事象は、Oracle IAM(Microsoft Entra IDでも可)で外部認証を有効にすると回避できました。
BEGIN
   DBMS_CLOUD_ADMIN.ENABLE_EXTERNAL_AUTHENTICATION(
      type  => 'OCI_IAM',
      force => TRUE
   );
END;
/

Oktaで認証したユーザーにて、データベース・ツールに接続できました。



Oracle APEXへの接続




以前の記事「Autonomous AI Databaseのデータベース・ツールを外部認証する - Microsoft Entra ID編」で使用しているMicrosoft Entra IDに関わる部分を、Oktaに置き換えます。

APEXにアクセスすると、Oktaで認証したユーザーが認識されていることが確認できます。


APEXの管理サービスにユーザーADMINでサインインします。

ワークスペースとしてAPEXDEVを作成し、Oktaのユーザーを管理者として作成します。


注)APEXの管理者ユーザーまたは開発者ユーザーを作成すると、同名のデータベース・ユーザーが作成されていました。ユーザー認証は、外部アイデンティティ・プロバイダーによって行われています。CREATE SESSION権限が割り当たっていないため、そのユーザーでデータベースに接続できません。より安全性を求める場合、NO AUTHENTICATION(パスワード無し)に変更できます。データベース・ユーザーからパスワードを除いても、APEXへのサインインは可能です。

再度、APEXへのサインインを試みます。

今度はサインインしたユーザーに、APEXのワークスペースAPEXDEVが割り当たっています。

サインインするワークスペースとしてAPEXDEVを選択します。


APEXのワークスペースに接続できました。


以上で、外部アイデンティ・プロバイダーで認証したユーザーで、Oracle APEXの開発ツールに接続できました。

今回の記事は以上になります。