1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【OCI】Autonomous AI Database で多要素認証を行う

1
Last updated at Posted at 2026-03-08

OCIが提供するマネージド・データベースサービス Autonomous AI Database(以下,ADB)では,2026年2月にリリースされた新機能として,多要素認証(MFA)を構成できるようになりました。1

この記事では,ADB で MFA を利用するための構成手順を紹介します。
今回は以下の2パターンを取り上げます。

  • OMA を利用した ログイン時MFA
  • OMA / Email を利用した SQLアクセス時MFA

0. 概要

ADB で利用できる MFA には,次の2種類があります。

  • ログイン時 MFA(Login-Time MFA)
  • SQLアクセス時 MFA(SQL Access Token MFA)

ログイン時 MFA は,その名の通り ADB へのログイン時に MFA を要求する方式です。
一方,SQLアクセス時 MFA は SQL 実行前に追加認証を行う方式で,厳密には「多要素認証」というより,再認証に近い使い方です。

認証要素としては,専用アプリによるプッシュ通知や,電子メールなどによるワンタイムパスワード(以下OTP)を利用できます。形式ごとの対応状況は以下の通りです。

認証要素 チャンネル ログイン時 MFA SQLアクセス時 MFA
OTP 電子メール
OTP Slack
プッシュ通知 Oracle Mobile Authenticator (OMA)
プッシュ通知 Cisco Duo Mobile app

Oracle Mobile Authenticator (以下OMA) では OTP も生成できますが,ADB の MFA 構成ではプッシュ通知のみサポートされているようです。

本記事では,OMA と電子メールを認証要素として使用した MFA の構成方法を確認します。

1. 前提準備

まず,検証対象のデータベース・ユーザーとして MFA_USER を作成しておきます。
ADB なので,ユーザー作成自体は簡単に行えるはずです。

image.png

続いて,MFA_USER に以下の権限を付与します。

GRANT EXECUTE ON DBMS_MFA TO MFA_USER;

また,接続クライアントには SQLcl を使用します。事前に SQLcl をインストールし,ADB 接続用のクライアント・ウォレットをダウンロードしておきます。

2. 通知チャネルの設定

MFA の通知チャネルとして「OMA プッシュ通知」と「電子メール」を構成します。使用する要素のみの設定で問題ありません。

OMA プッシュ通知の設定

Oracle Mobile Authenticator(以下OMA)を利用するには,OCI が提供する IDaaS である Identity Domains のセットアップが必要です。
Identity Domain の作成方法については,以下の資料を参照してください。Defaultドメインを使用してもいいかと思います。

image.png

ここでは domain-db という名前の Domain を作成しています。
ドメイン・タイプは Oracle Apps Premium にしていますが,FREE でも問題ありません。

使用する Domain の詳細画面から,ドメインURLを控えておきます。

続いて,Domain 詳細画面の「統合アプリケーション」タブを開き,「アプリケーションの追加」をクリックします。

「機密アプリケーション」を選択します。
image.png

名前と説明を入力し,「送信」をクリックします。
image.png

作成後,忘れないように先にアクティブ化しておきます。
image.png

次に「OAuth構成」タブから「OAuth構成の編集」をクリックし,「このアプリケーションをクライアントとして今すぐ構成します」を選択します。
さらに「クライアント資格証明」にチェックを入れます。
image.png

設定画面下部のアプリケーション・ロールには,以下の2つを追加します。

  • MFA Client
  • User Administorator

image.png

その後,「送信」で確定します。

アプリケーションの詳細画面から,「クライアントID」と「クライアント・シークレット」を控えておきます。
image.png

ADB 側に Identity Domain の資格情報を登録するため,以下を実行します。
usernamepassword には,先ほど控えたクライアントIDとクライアント・シークレットを指定します。

BEGIN
  DBMS_CLOUD.CREATE_CREDENTIAL (
    credential_name => 'OMA_CRED',
    username        => '<client_id>',
    password        => '<client_secret>'
  );
END;
/

次に,作成した資格情報と Domain の API エンドポイントを紐付けます。
api_endpoint には,先ほど控えたドメインURLを指定します。

BEGIN
  DBMS_MFA_ADMIN.CONFIGURE_NOTIFICATION(
    notification_type => 'OMA',
    attributes        => JSON_OBJECT(
      'credential_name' VALUE 'OMA_CRED',
      'api_endpoint'    VALUE '<domain_url>'
    )
  );
END;
/

Email の設定

電子メールを通知チャネルとして設定します。

前提として,OCI Email Delivery サービスで「承認済送信者」として,送信元のドメインおよびメールアドレスをあらかじめ設定しておく必要があります。

Email Delivery サービスは,OCI コンソールの [開発者サービス] → [アプリケーション統合] → [電子メール配信] からアクセスできます。

image.png

また,メール配信にはSMTP資格証明が必要です。Identity Domain の適当なユーザーから SMTP資格証明を生成し,ユーザー名とパスワードを取得しておきます。

image.png

取得したユーザー名とパスワードを使って,ADB に資格情報を作成します。

BEGIN
  DBMS_CLOUD.CREATE_CREDENTIAL(
    credential_name => 'EMAIL_CRED',
    username        => '<username>',
    password        => '<password>'
  );
END;
/

次に,アクセス制御リスト(ACL)を更新し,データベースにSMTPホストへの接続権限を付与し,メールを送信できるようにします。
ドメインとポート番号は電子メール配信画面の「構成」メニューから確認することができます。

BEGIN
  DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE (
    host       => 'smtp.email.<region>.oci.oraclecloud.com',
    lower_port => 587,
    upper_port => 587,
    ace        => xs$ace_type(
                    privilege_list  => xs$name_list('SMTP'),
                    principal_name  => 'ADMIN',
                    principal_type  => xs_acl.ptype_db
                  )
  );
END;
/

その後,作成した認証情報を使って,OTPを配信するためのメール通知チャネルを設定します。

BEGIN
  DBMS_MFA_ADMIN.CONFIGURE_NOTIFICATION(
    notification_type => 'EMAIL',
    attributes       => JSON_OBJECT(
      'credential_name'            VALUE 'EMAIL_CRED',
      'smtp_host'                  VALUE 'smtp.email.<region>.oci.oraclecloud.com',
      'smtp_port'                  VALUE 587,
      'sender'                     VALUE '<mfa_alert_address>',
      'sender_email_display_name'  VALUE 'DB MFA ALERTS'
    )
  );
END;
/

3. OMAで ログイン時MFA を有効化する

まず,対象ユーザーを MFA に登録します。
ここでは DBユーザーとして MFA_USER を指定します。

BEGIN  
  DBMS_MFA_ADMIN.REGISTER_USER(  
    username   => '<db_user>',  
    type       => 'LOGON',  
    email      => '<mail_address>',  
    attributes => JSON_OBJECT('auth_method' VALUE 'oma_push')  
  );  
END;  
/ 

指定した email のユーザーが Identity Domain 側にまだ存在しない場合,以下のエラーが発生することがあります。

ORA-28470: Failure to enroll the user for Oracle Mobile Authenticator (OMA) Push Notification
ORA-06512: "SYS.DBMS_MFA_ADMIN", 行574
ORA-06512: "SYS.DBMS_MFA_ADMIN", 行1394
ORA-06512: 行2

https://docs.oracle.com/error-help/db/ora-28470/
Error at Line: 1 Column: 1

この場合,Domain 側には新規ユーザーが作成され,登録用のメールが送信されます。メールに従って OMA のセットアップを完了したあと,再度 REGISTER_USER を実行してください。

OMA設定

image.png

image.png

image.png

image.png

image.png

image.png

では,実際に接続して動作を確認します。

❯ ./sqlcl/bin/sql /nolog

SQLcl: Release 25.1 Production on Sat Mar 07 17:56:56 2026

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

SQL> set cloudconfig tns_files/adb_wallet/Wallet_ADBTPNRTDEV.zip
SQL> connect mfa_user@adbtpnrtdev_medium
Password? (**********?) ******************

<<<<< プッシュ通知が届いたら「許可」を選択 >>>>>

Connected.

このように,パスワード入力後に OMA のプッシュ通知による承認が入り,承認後に接続が完了します。

4. OMA で SQLアクセス時MFA を設定する

OMA を使った SQLアクセス時MFA を設定します。

BEGIN
  DBMS_MFA_ADMIN.REGISTER_USER (
    username   => '<db_user>',
    type       => 'SQL ACCESS',
    email      => '<mail_address>',
    attributes => JSON_OBJECT(
      'scope'            VALUE 'USER',
      'duration_min'     VALUE 5,
      'idle_timeout_min' VALUE 2,
      'auth_method'      VALUE 'OMA_PUSH'
    )
  );
END;
/

この例では,対象ユーザーを SQLアクセス時MFA に登録し,以下のように設定しています。

  • トークンの有効期間: 5 分
  • 無操作タイムアウト: 2 分
  • 認証方式: OMA プッシュ通知

同じユーザーを同じメールアドレスで別タイプ(LOGON/SQL ACCESS)として登録することで,ログイン時MFA と SQLアクセス時MFA の両方を併用できます。

では,実際に動作を確認します。

❯ ./sqlcl/bin/sql /nolog


SQLcl: Release 25.1 Production on Sat Mar 07 18:27:08 2026

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

SQL> set cloudconfig tns_files/adb_wallet/Wallet_ADBTPNRTDEV.zip
SQL> connect mfa_user@adbtpnrtdev_medium
Password? (**********?) ******************
Connected.

SQL> select count(*) from sh.sales;

Error starting at line : 1 in command -
select count(*) from sh.sales
Error at Command Line : 1 Column : 1
Error report -
SQL Error: ORA-64660: Token Authorization is not complete for the user or the session.

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

More Details :
https://docs.oracle.com/error-help/db/ora-64660/

この時点では追加認証が完了していないため,ORA-64660 が返ってきます。

続いて,セッションを初期化して OTP を要求します。
通知チャネルの設定に応じて,この操作により プッシュ通知(または OTP)が送信されます。

BEGIN
  DBMS_MFA.INITIALIZE_SESSION (
    email => '<mail_address>'
  );
END;
/
SQL> BEGIN
  2    DBMS_MFA.INITIALIZE_SESSION (
  3      email => 'xxxxxx@xxxxxx.com'
  4    );
  5  END;
  6* /
<<<<< プッシュ通知が届いたら「許可」を選択 >>>>>

PL/SQL procedure successfully completed.

SQL> select count(*) from sh.sales;

   COUNT(*) 
___________ 
     918843 

承認後は,通常どおり SQL を実行できるようになります。

5. Email で SQLアクセス時MFA を設定する

最後に,電子メールによる OTP を使って SQLアクセス時MFA を構成します。

まず,対象ユーザーが SMTPホストへ接続できるように ACL を設定します。

BEGIN
  DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE (
    host       => 'smtp.email.<region>.oci.oraclecloud.com',
    lower_port => 587,
    upper_port => 587,
    ace        => xs$ace_type(
                        privilege_list  => xs$name_list('SMTP'),
                        principal_name  => '<db_user>',
                        principal_type  => xs_acl.ptype_db
                  )
    );
END;
/

続いて,Email を認証方式としてユーザーを登録します。

BEGIN
  DBMS_MFA_ADMIN.REGISTER_USER(
    username   => '<db_user>',
    type       => 'SQL ACCESS',
    email      => '<mail_address>', 
    attributes => JSON_OBJECT(
      'auth_method'      VALUE 'EMAIL'
      'duration_min'     VALUE 60,
      'scope'            VALUE 'SESSION',
      'idle_timeout_min' VALUE 15
    )
  );
END;
/

では,実際に動作を確認します。

❯ ./sqlcl/bin/sql /nolog


SQLcl: Release 25.1 Production on Sun Mar 08 21:09:40 2026

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

SQL> set cloudconfig tns_files/adb_wallet/Wallet_ADBTPNRTDEV.zip
SQL> connect mfa_user@adbtpnrtdev_medium
Password? (**********?) ******************
Connected.
SQL> select count(*) from sh.sales;

Error starting at line : 1 in command -
select count(*) from sh.sales
Error at Command Line : 1 Column : 1
Error report -
SQL Error: ORA-64660: Token Authorization is not complete for the user or the session.

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

More Details :
https://docs.oracle.com/error-help/db/ora-64660/

OMA の場合と同様に,まずはトークン未承認のためORA-64660エラーになります。
ここで OTP を発行してもらいます。

BEGIN
  DBMS_MFA.INITIALIZE_SESSION(
    email => '<mail_address>'
  );
END;
/

すると,指定したメールアドレス宛てに OTP が送られてきます。
image.png

OTP: 60498892
Use the OTP above for SQL access. The OTP is valid for 60 minutes.

受信した OTP をSET_TOKEN で設定します。

BEGIN
  DBMS_MFA.SET_TOKEN(
    token => '<otp>'
  );
END;
/
実行例
SQL> BEGIN
  2    DBMS_MFA.SET_TOKEN(
  3      token => '60498892'
  4    );
  5  END;
  6* /

PL/SQL procedure successfully completed.

SQL> select count(*) from sh.sales;

   COUNT(*) 
___________ 
     918843 

これで SQLアクセス時MFA の認証が完了し,SQL を実行できるようになります。

6. ユーザーの MFA 登録解除

ユーザーに設定された認証要素を解除するには,以下を実行します。

BEGIN
  DBMS_MFA_ADMIN.DEREGISTER_USER(
    username => '<db_user>',
    type     => '<type>',        -- [LOGON]か[SQL ACCESS]から選択
    email    => '<mail_address>'
  );
END;
/

7. 参考リンク

DBMS_MFA_ADMINパッケージ
https://docs.oracle.com/ja-jp/iaas/autonomous-database-serverless/doc/dbms-mfa-admin-package.html

DBMS_MFAパッケージ
https://docs.oracle.com/ja-jp/iaas/autonomous-database-serverless/doc/dbms-mfa-package.html

  1. https://docs.oracle.com/ja-jp/iaas/autonomous-database-serverless/doc/whats-new-adwc.html

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?