はじめに
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 が送信されます。
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 が柔軟に設定可能: 用途に応じてカスタマイズできる
