3
2

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 Databaseの外部認証 - Microsoft Entra IDとトークン・ベースの認証連携 -

3
Last updated at Posted at 2026-03-03

以前の記事でOracle DatabaseのOAauth2によるトークン・ベース認証について紹介しました。最近では、Oracle Database@AzureやAWSなど他社クラウドでOracle Databaseを使用するケースも増えてきており、ますます外部認証連携を求められることが増えてきたように感じます。
実際にEntra ID(旧Azure AD)との連携で苦労されているのは何度か目にしていますので、改めて設定方法について最新化してまとめ直しました。できるだけシンプルに必要最小限で動作するような設定にしていますので、まずは基本構成として捉えて頂ければと思います。

詳しくはドキュメントにありますので、こちらも合わせてご確認下さい。

本手順は、ドキュメントに従ってEntra ID v1トークンの設定手順になっています。Entra ID v2を使用する場合は、Entra ID v1トークンの場合と設定が異なる箇所を一番最後に補足しておきます

Entra IDにOracle Datatabase接続用のアプリを作成する

Entra IDの概要からテナントIDとプライマリドメインをメモしておく
image.png

アプリの登録 -> 新規登録をクリック
image.png

好きな名前を入力して登録
image.png

作成後、アプリケーションIDをメモしておく
image.png

アプリ内のAPI公開 -> アプリケーションIDのURIの追加をクリック
アプリケーションURIは、以下の組み合わせで指定する

https://<テナントのプライマリ・ドメイン>/<アプリケーション(クライアント)ID>
例)https://xxxxxxx.onmicrosoft.com/xxxxxxxx-xxxx-4ad4-bf58-8a5fa8008b8a

image.png

すぐ下にあるScopeの追加をクリックし、スコープ名をsession:scope:connectに指定して、同意できるのを管理者とユーザーに指定して登録する
image.png

アプリロールの作成

登録したアプリにアプリロールを作成する。このアプリ・ロールは、EntraIDのユーザとデータベースのロールとの紐づけに使用する。EntraIDに以下のユーザーとグループを作成する

アプリロール -> アプリロールの作成をクリック。表示名と値は、db_users、許可されたメンバーは両方を選択し作成する。同様の手順でdb_admins, resource_role, pdb_dba_roleも作成する
image.png

以下のように作成できていればOK
image.png

次にAPIのアクセス許可からアクセス許可の追加をクリック
image.png

自分のAPI -> 作成したアプリをクリック
image.png

アプリケーションの許可を選択し、作成したすべてのアプリロールをチェックしてアクセス許可の追加をクリック
image.png

"Oracleに管理者の同意を与えます"をクリック。状態が"Oracleに付与されました"になればOK
image.png

Entra IDのユーザー・グループとアプリロールの紐づけ

Oracle Databaseに接続する実際にEntraIDのユーザーやグループとアプリロールをマッピングする

Entra IDに2つのユーザーを作成する(dbmgr, dbuser001)
image.png

Entra IDに2つのグループを作成する(resource_role, pdb_dba_role)
image.png

エンタープライズアプリから作成したアプリをクリックする
image.png

ユーザーとグループの割り当てをグループ
image.png

Add user/groupをクリック
image.png

ユーザーとグループをクリックし、ユーザーは、dbuser001を選択する
image.png

ロールをdb_usersに指定して作成する
image.png

同様の手順で、dbmgrユーザーにdb_adminsロール、pdb_dba_role, resource_roleグループにもそれぞれ同名のロールを割り当てる。※グループへの割り当ては、有償プランのEntraIDのみ可能。無償プランの場合は、赤枠のユーザーのみのマッピングだけしておく
image.png

Oracle Databaseの設定

Entra ID連携をするためのOracle Databaseは、下記の要件を満たす必要がある

  • Oracle Database 19c(19.18~)以上
  • TLS接続設定済みである
  • ネイティブネットワーク暗号を無効化してある
  • DB ServerからEntraIDのエンドポイントにアクセスできる

OCIのDatabase Cloudサービスから作成した最近のデータベースは、TLSがデフォルトで設定済みになっている場合がある (リスナーがポート2484でtcpsのリスニング)
TLSの設定ができていない場合は、こちらの記事を参考にTLSの設定を済ませておく

SYSユーザーでPDBに接続して以下を実行する

-- IDENTITY_PROVIDER_TYPEをAZURE_ADにする
SQL> ALTER SYSTEM SET IDENTITY_PROVIDER_TYPE=AZURE_AD SCOPE=BOTH;
SQL> SELECT NAME, VALUE FROM V$PARAMETER WHERE NAME='identity_provider_type';
NAME                    VALUE 
----------------------  ------- 
identity_provider_type  AZURE_AD

-- Entra IDの情報を登録
/* 例) ALTER SYSTEM SET IDENTITY_PROVIDER_CONFIG = '{"application_id_uri" : "<アプリケーションURI>", "tenant_id" : "<テナントID>", "app_id" : "<アプリケーションID>"
}' SCOPE=BOTH; */
SQL> ALTER SYSTEM SET IDENTITY_PROVIDER_CONFIG = '{"application_id_uri" : "https://xxxxxxxx.onmicrosoft.com/xxxxxxxx-xxxx-4ad4-bf58-8a5fa8008b8a", "tenant_id" : "8f32d4c7-52aa-xxxx-xxxx-9e9daf45b567", "app_id" : "xxxxxxxx-xxxx-4ad4-bf58-8a5fa8008b8a"}' SCOPE=BOTH;

-- Entra IDとマッピングするユーザーとロールを作成する
-- DBユーザーとEntra IDのロールをマッピングする
-- db_users
SQL> CREATE USER azure_globalusr IDENTIFIED GLOBALLY AS 'AZURE_ROLE=db_users';
SQL> grant connect to azure_globalusr;

-- db_admins
SQL> CREATE USER azure_dbadmins IDENTIFIED GLOBALLY AS 'AZURE_ROLE=db_admins';
SQL> grant connect,dba to azure_dbadmins;

-- DBロールとEntra IDのロールをマッピングする
-- resource_role
SQL> CREATE ROLE azure_resource_role IDENTIFIED GLOBALLY AS 'AZURE_ROLE=resource_role';
SQL> grant resource to azure_resource_role;

-- pdb_dba_role
SQL> CREATE ROLE azure_pdb_dba_role IDENTIFIED GLOBALLY AS 'AZURE_ROLE=pdb_dba_role';
SQL> grant pdb_dba to azure_pdb_dba_role;

クライアントから接続テストを行う

今回のテストは、Azure CLIを使用してデータベースへの接続を行う。公式ドキュメントを参考にAZure CLIをクライアントにインストールする

クライアントのsqlnet.oraには、以下の設定を追加する

SSL_SERVER_DN_MATCH=ON
TOKEN_AUTH=OAUTH
TOKEN_LOCATION=/xxx/xxx/xxxx  <---トークンを出力するディレクトリ

tnsnames.oraには、トークン認証するための接続情報を追加

サービス名 =
   (description= (retry_count=20)(retry_delay=3)
      (address=(protocol=tcps)(port=xxxx)(host=xxxxxxxxxx))
      (connect_data=(service_name=xxxxxxxx))
      (security=(ssl_server_dn_match=yes)(TOKEN_AUTH=OAUTH)))
  )
  
ex)
azure =
   (description= (retry_count=20)(retry_delay=3)
      (address=(protocol=tcps)(port=2484)(host=xxxxx.xxxxxx.tokyovcn2.oraclevcn.com))
      (connect_data=(service_name=pdbxxxxx.xxxxxx.tokyovcn2.oraclevcn.com))
      (security=(ssl_server_dn_match=yes)(TOKEN_AUTH=OAUTH)))
  )

データベースに接続するためには、まずEntraIDからトークンを取得し、それをデータベースへ送信するフローになる。Azure CLIを使用してトークンをEntra IDから取得する。

#トークンを出力するディレクトリから実行。※loginの前に、念のためlogoutを実行しておくと良い
$ az logout 
$ az login --allow-no-subscriptions --use-device-code
To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code O43KUDWYY to authenticate.

出力されたリンクとコードを使用してEntraIDにログインする。dbuser001ユーザーでログインを完了する
image.png

ログインが成功すると、下記のような感じでコンソールに応答が戻って来るので、そのままトークン取得のコマンドを実行する

Tenant: zzzzz-xxxxxxxx-xxxx-xxxx-9e9daf45b567
Subscription: N/A(tenant level account) (xxxxxxx-xxxx-xxxx-xxxx-9e9daf45b567)

[Announcements]
With the new Azure CLI login experience, you can select the subscription you want to use more easily. Learn more about it and its configuration at https://go.microsoft.com/fwlink/?linkid=2271236

If you encounter any problem, please open an issue at https://aka.ms/azclibug

[Warning] The login output has been updated. Please be aware that it no longer displays the full list of available subscriptions by default.

#これでログイン状態なので、以下の手順でトークンを取得する
#トークンの取得
token=$(az account get-access-token --resource=https://xxxxxxx.onmicrosoft.com/xxxxxx-xxxx-4ad4-xxxx-8a5fa8008b8a  --query accessToken --output tsv)

#トークンをファイルに出力
echo "$token" >> token

#トークンの中身が空ではないことを確認する。トークンの中身を確認できる外部サイトなどもあるのでそれらも活用
cat token
※Azure CLIで初めて実行する場合、下記のようなエラーが出力される。メッセージ出力されている通り、これはAzure CLIのアプリケーションIDがEntraIDのアプリに登録されていないために発生する。
ERROR: AADSTS65001: The user or administrator has not consented to use the application with ID '04b07795-xxxx-xxxx-bbee-02f9e1bf7b46' named 'Microsoft Azure CLI'. Send an interactive authorization request for this user and resource. Trace ID: xxxxxx-xxxx-44d9-ab09-1adfef194900 Correlation ID: xxxxxxx-xxxx-xxxx-b22e-184a74438bb0 Timestamp: 2026-03-02 03:41:38Z
Run the command below to authenticate interactively; additional arguments may be added as needed:

なので、以下の手順にてアプリケーションIDを登録する
作成したアプリのAPIの公開 -> クライアントアプリケーションの追加をクリック。メッセージに出力されているアプリケーションIDをクライアントIDに入力、スコープをチェックして追加する。追加したら、上記手順でログインから実行する
image.png

データベースに接続する場合は、/@サービス名のみ

$ sqlplus /@azure

SQL*Plus: Release 23.26.1.0.0 - Production on Mon Mar 2 13:31:46 2026
Version 23.26.1.0.0

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

Last Successful login time: Mon Mar 02 2026 13:30:43 +00:00

Connected to:
Oracle AI Database 26ai EE High Perf Release 23.26.0.0.0 - for Oracle Cloud and Engineered Systems
Version 23.26.0.0.0

-- EntraIDのdbuser001ユーザーでOracle Databaseに接続すると、データベースのAZURE_GLOBALUSRにマッピングされる
SQL> COLUMN username FORMAT A20
SQL> COLUMN external_name FORMAT A40
SQL> SELECT username, external_name FROM user_users;

USERNAME             EXTERNAL_NAME
-------------------- ----------------------------------------
AZURE_GLOBALUSR      azure_role=db_users

-- CREATE SESSIONの権限を持っていることが分かる
SQL> select * from SESSION_PRIVS;

PRIVILEGE
----------------------------------------
SET CONTAINER
CREATE SESSION

-- VPD等で直接Entra IDのユーザーでアクセス制御をしたい場合は、AUTHENTICATED_IDENTITYを使用する
SQL> SELECT SYS_CONTEXT ('USERENV', 'AUTHENTICATED_IDENTITY') FROM DUAL;

SYS_CONTEXT('USERENV','AUTHENTICATED_IDENTITY')
--------------------------------------------------------------------------------
dbuser001@xxxxxxxxx.onmicrosoft.com

次に、dbmgrでEntraIDにログインし、再度トークンを取得した結果 ※同じコンソールから実行する場合は、AZ LogoutしてAZ loginする、古いトークンを削除しておくこと

-- EntraIDのdbmgrユーザーでOracle Databaseに接続すると、データベースのAZURE_DBADMINSにマッピングされる
SQL> SELECT username, external_name FROM user_users;

USERNAME             EXTERNAL_NAME
-------------------- ----------------------------------------
AZURE_DBADMINS       azure_role=db_admins

-- CREATE SESSIONとDBAの権限を持っていることが分かる
SQL> select * from SESSION_PRIVS;

PRIVILEGE
----------------------------------------
RESTRICTED SESSION
ALTER SESSION
CREATE SESSION
AUDIT SYSTEM
ALTER SYSTEM

260 rows selected.

次に、EntraIDのdbuser001をグループに参加させた場合の動作を確認する。resource_roleグループにdbuser001をメンバーとして追加する
image.png

もう一度、dbuser001でEntraIDにログインし、再度トークンを取得した結果

-- 権限が2つから17個になっている。
-- EntraIDのresource_roleグループにマッピングされたresourceロールが付与されている
SQL> select * from SESSION_PRIVS;
PRIVILEGE
----------------------------------------
SET CONTAINER
CREATE SESSION
CREATE SEQUENCE
CREATE VIEW
CREATE SYNONYM
CREATE CLUSTER
CREATE TABLE
CREATE SESSION
17 rows selected.

この方法は、ロールマッピングと呼ぶもので、Entra IDのグループにユーザーを追加・削除することによって、Oracle Databaseに接続した場合の権限を制御させることが可能です。無償のEntra IDでは、このグループの挙動が確認できないですが、上記の手順にてEntraIDでユーザーにロールをマッピングしていた箇所がありますが、その時ユーザーに付与するロールを変えてみると同じような挙動を見ることができます。

ロールマッピングが基本的な使い方になり、Entra IDのユーザーが数千以上あったとしてもDB側は最小限のDBユーザーと必要な分だけのロールで管理することが可能になります。

このロールマッピングというのは非常に重要で、今後予定されているOracle Datababaseの新しいアクセス制御の機能では、VPDの行・列レベルのアクセス制御がロールに付与ができるようになります。例えば、AI Agentでデータベースにアクセスする際に、Entara IDやIAMにOAuth2でユーザー認証して、ユーザーが所属しているグループに応じて、データベースに対しては行・列でアクセスが制限されるというシナリオをより簡単に実現できます。

また、ロールマッピングを使わず、直接Entra IDのユーザーとDBユーザーを1:1でマッピングさせる方法もあります。マッピングするEntra IDのユーザー数が少ない場合に有効です。最後にこの設定方法も紹介します。

Entra IDのユーザーとDBユーザーを1:1でマッピングさせる

EntraIDのユーザーを新たに用意して、以下のSQLを実行する。指定するAZURE_USERは、EntraIDのユーザープリンシパル名

CREATE USER directusr IDENTIFIED GLOBALLY AS 'AZURE_USER=xxxxx@xxxx.onmicrosoft.com';
grant connect to directusr ;

再度、Azure CLIでログイン、トークンを取得して接続。今度は、External_NameがEntraIDのユーザープリンシパルになっている

SQL> SELECT username, external_name FROM user_users;

USERNAME             EXTERNAL_NAME
-------------------- ----------------------------------------
DIRECTUSR            azure_user=xxxxx@xxxx.onmicrosoft.com

SQL>  select * from SESSION_PRIVS;

PRIVILEGE
----------------------------------------
SET CONTAINER
CREATE SESSION

設定は以上です。一度設定ができてしまえば難しくは感じないですが、初めて行う場合は戸惑うことが多いように思います。うまくできない場合は、出来ているところを段階的に確認しながら進めると良いです。

  • クライアント側でトークンが正しく取得できているか。トークンに含まれているEntraIDのユーザーやグループに間違いがないか中身を確認する
  • sqlnet.oraでトークンのパスが正しく指定されているか
  • トレースログを出力して調査する
#クライアント側のsqlnet.oraに以下を追加
EVENT_25701=15
DIAG_ADR_ENABLED=TRUE
ADR_BASE=/home/opc
  • そもそもTLSで接続できているか?
  • トークンがOracle Database側まで渡っている場合は、データベースのalert.logに何らかのエラーメッセージが出力されている場合が多い。Entra IDのエンドポイントにアクセスできない、マッピングするユーザーがいない等

また、正式にサポートされているEntra ID及びOCI IAM以外のIDaaSと認証連携したい場合は、Oracle Database <--> Entra ID/OCI IAM <--> IDaaSのようにSAML認証を組み合わせて対応が可能です。

Entra ID v2トークンを使用する場合

上記手順の変更点は以下の通り

アプリケーションIR URIはでデフォルトをそのまま使用
image.png

トークン構成 -> オプションの要求と追加、IDとupnをチェックして追加
image.png

マニュフェスト -> requestedAccessTokenVersionを2に変更して保存
image.png

トークンを取得するコマンドを--scope "api://xxxxxxxx-xxxx-xxxx-bf58-8a5fa8008b8a/session:scope:connect"に変更

token=$(az account get-access-token --scope "api://xxxxxxxx-xxxx-xxxx-bf58-8a5fa8008b8a/session:scope:connect"  --query accessToken --output tsv)
3
2
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
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?