2
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?

[Oracle Cloud][Autonomous AI Database] SQL Access MFA を試してみた。(2026/03/06)

2
Last updated at Posted at 2026-03-06

はじめに

Autonomous AI Databaseで、マルチファクタ認証(MFA)がサポートされ、ユーザー・パスワードに加えて追加の検証ファクタを必要とすることで、データベース・アクセスのセキュリティを強化できます。MFAは、データベース・ログイン、保護されたSQL文の実行、またはその両方に対して構成できます。
この記事では、SQL Access Token MFA(Emailによる One-Time Password 配信) を試してみました。

なお、Autonomous AI Database の MFA には以下の 2種類 があります。

MFA タイプ タイミング 認証チャネル
Login-Time MFA DBログイン時 Oracle Mobile Authenticator (OMA) / Cisco Duo
SQL Access Token MFA SQL実行時 Email (OTP: One-Time Password) / Slack (OTP) / OMA (プッシュ通知)

設定完了後、MFA 登録ユーザーが SQL を実行するには以下のフローが必要になります。

① 通常のパスワードでADBに接続
② DBMS_MFA.INITIALIZE_SESSION でOTPをメール送信リクエスト
③ 届いたメール(OTP)を確認
④ DBMS_MFA.SET_TOKEN でOTPをセット
⑤ SQL が実行可能になる

SQLを実行できるまでに OTP 認証が必須となるため、仮にパスワードが漏洩しても不正アクセスを防止できます。

事前準備

  • Oracle Autonomous AI Database(Serverless)がプロビジョニング済みであること
    • 2026年3月時点では、 Oracle database release 19cのみ対応しております。
  • ADMIN ユーザーでの接続が可能であること
  • SMTP 認証情報(ユーザー名・パスワード)が取得済みであること

手順

Step 1:Email 通知チャネルの設定

Autonomous Databaseに ADMINユーザで接続し、以下の手順で Email 通知チャネルを設定します。

1-1. SMTP 認証情報を Credential として登録

BEGIN
   DBMS_CLOUD.CREATE_CREDENTIAL(
       credential_name => 'EMAIL_CRED_MFA',
       username        => '<OCIのSMTPユーザー名>',  -- 例:ocid1.user.oc1..aaa...@ocid1.tenancy.oc1..aaa...
       password        => '<OCIのSMTP認証パスワード>'
   );
END;
/

注意: username は OCI コンソールの「Email Delivery > SMTP 認証情報」で確認できます。

1-2. データベースから SMTP ホストへのアクセス許可

BEGIN
  DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
    host        => 'smtp.email.ap-tokyo-1.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;
/

1-3. Email チャネルの設定

BEGIN
  DBMS_MFA_ADMIN.CONFIGURE_NOTIFICATION(
    notification_type => 'EMAIL',
    attributes       => JSON_OBJECT(
      'credential_name'           VALUE 'EMAIL_CRED_MFA',
      'smtp_host'                 VALUE 'smtp.email.ap-tokyo-1.oci.oraclecloud.com',
      'smtp_port'                 VALUE 587,
      'sender'                    VALUE 'mfa-alert@example.com',    -- Approved Sender のメールアドレス
      'sender_email_display_name' VALUE 'DB MFA Alert'
    )
  );
END;
/

Step 2:MFA 対象ユーザーの作成

検証用のユーザーを作成し、必要な権限を付与します。

-- テストユーザー作成
CREATE USER mfa_test_user IDENTIFIED BY "<パスワード>";
GRANT CREATE SESSION TO mfa_test_user;
GRANT SELECT ANY TABLE TO mfa_test_user;

-- DBMS_MFA パッケージの実行権限を付与
GRANT EXECUTE ON DBMS_MFA TO mfa_test_user;

-- SMTP ホストへのネットワークアクセス権限を付与
BEGIN
  DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
    host        => 'smtp.email.ap-tokyo-1.oci.oraclecloud.com',  -- リージョンに合わせて変更
    lower_port  => 587,
    upper_port  => 587,
    ace         => xs$ace_type(
                     privilege_list  => xs$name_list('SMTP'),
                     principal_name  => 'MFA_TEST_USER',
                     principal_type  => xs_acl.ptype_db
                   )
  );
END;
/

Step 3:ユーザーを SQL Access Token MFA に登録

BEGIN
  DBMS_MFA_ADMIN.REGISTER_USER(
    username   => 'MFA_TEST_USER',
    type       => 'SQL ACCESS',
    email      => 'mfa_test_user@example.com',    -- OTP 送信先メールアドレス
    attributes => JSON_OBJECT(
      'duration_min'     VALUE 60,     -- トークン有効期間(分)
      'scope'            VALUE 'SESSION',
      'idle_timeout_min' VALUE 15      -- 15分非操作でタイムアウト
    )
  );
END;
/

Step 4:MFA 動作確認

MFA 登録ユーザー(MFA_TEST_USER)で動作を確認します。

4-1. データベースに接続

CONNECT mfa_test_user/<パスワード>@<接続文字列>

接続自体は通常どおり成功します。

4-2. SQL 実行を試みる(MFA 認証前)

SELECT COUNT(*) FROM user_tables;
SQL Error: ORA-64660: Token Authorization is not complete for the user or the session.

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

ORA-64660 エラーが発生します。 MFA 認証が完了するまで SQL は実行できません。

4-3. セッション初期化(OTP メール送信のリクエスト)

BEGIN
  DBMS_MFA.INITIALIZE_SESSION(
    email => 'mfa_test_user@example.com'   -- 登録済みメールアドレス
  );
END;
/

登録済みのメールアドレスに 6桁の OTP が送信されます。

OTP メールのスクリーンショット
image.png

4-4. OTP をセット

BEGIN
  DBMS_MFA.SET_TOKEN(
    token => '123456'   -- メールで受信した OTP を入力
  );
END;
/

4-5. SQL を実行

SELECT COUNT(*) FROM user_tables;

今度は正常に実行できます。


Step 5:ユーザー登録解除(クリーンアップ)

検証後、登録を解除する場合は以下を実行します。

BEGIN
  DBMS_MFA_ADMIN.DEREGISTER_USER(
    username => 'MFA_TEST_USER',
    type     => 'SQL ACCESS',
    email    => 'mfa_test_user@example.com'
  );
END;
/

おわりに

Autonomous AI Database の SQL Access Token MFA を実際に試した結果、以下の点が確認できました。

  • 設定は比較的シンプル: SMTP の事前設定が必要ですが、SQL だけで MFA を有効化できる
  • セキュリティの向上: パスワードが漏洩しても OTP なしでは SQL が実行できない
  • 開発者・DBA 向け: DB Actions が使えなくなる制約があるため、主に API 経由アクセスや直接 DB 接続のユーザーに向いている
  • トークンの有効期間や idle_timeout が柔軟に設定可能: 用途に応じてカスタマイズできる

参考情報

2
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
2
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?