Deep Data Securityに必要なOracle Databaseのトークンベース認証ですが、できるだけ簡単に試してみたいという方向けに、Autonomous AI DatabaseとOCI IAMの構成を簡単に作成するスクリプトがあります。Deep Data SecurityのProduct Managerが作成したもので、IAM側のOAuthアプリケーションの設定など間違いやすいポイントがスクリプトで自動作成されるようになっているので、誰でも躓くことなく動作環境を作成することができます。
また、これはOracle LiveLabsに今後提供予定なもので、内容は予告なく変更される可能性がありますのでご注意下さい。(※2026年5月時点では動作確認済み)
実行環境では、以下のツールを利用できる必要があります。
- Bash
- OCI CLI
- SQL Plus 23.26.2
また、スクリプトではAlways FreeのADBインスタンスとアイデンティティ・ドメインに機密アプリケーション、ユーザーとグループを作成するので、OCI CLIのユーザーにはそのための実行権限が必要です。
実行手順
##スクリプトを取得
$ wget https://objectstorage.us-ashburn-1.oraclecloud.com/p/I8jdPFHveSlA1k1VemPIEHJuXIQtX8mq8BKi9rJbiCJ8YcxcY1pSwlSchZomVDPq/n/oradbclouducm/b/dbsec_public/o/adb-oci-iam.zip
#環境変数 OCI_DOMAIN_URLに使用するアイデンティティドメインのドメインURLを追加
export OCI_DOMAIN_URL=https://idcs-xxxxxxx.identity.oraclecloud.com:443
##00セットアップを実行
$ ./00_setup_adb.sh
#ADBのFreeの空きがなくエラーになる場合は、スクリプト内のADBの作成部分のコマンドを下記のように有償に変更
oci db autonomous-database create \
--compartment-id "$ROOT_COMP_ID" \
--db-name "$DB_NAME" \
--display-name "$DB_DISPLAY_NAME" \
--db-version "$DB_VERSION" \
--is-free-tier false \
--admin-password "$ADMIN_PWD" \
--compute-model ECPU \
--compute-count 2 \
--data-storage-size-in-tbs 1 \
--wait-for-state AVAILABLE \
>/dev/null
#完了後に必要な環境変数は.adb-oci-iam.envにすべて作成されるので読み込む
$ source ./.adb-oci-iam.env
##01から03までを順番に実行
$ ./01_enable_oci_iam.sh
$ ./02_create_hr_schema.sh
$ ./03_create_data_roles_and_grants.sh
#---------------これで準備は完了---------------#
#IAMにemmaとmarvinのユーザーが作成されているのでログインできるようにしておく
#emmaとmarvinそれぞれでSQLを実行した場合のテストを行う
#まず04を実行してデータベースに必要なアクセストークンをIAMにログインして取得する
$ ./04_get_iam_oauth_token.sh
#実行環境以外のブラウザでログインする場合は、--headlessをつけてコールバックURLを自身で貼り付ける
$ ./04_get_iam_oauth_token.sh --headless
##実行端末以外のブラウザでログインする場合
Step 2: Starting OCI IAM OAuth2 authorization-code login...
This opens or prints an OCI IAM login URL for the user you sign in as, then writes
the returned OAuth2 access token where SQL*Plus can read it.
Running in headless mode.
Manual callback mode for redirect URI http://localhost:8888/callback
#↓ ブラウザをプライベートウィンドウで開き、以下のURLを貼り付けてmarvinでIAMにログイン
Open this URL in the NoVNC browser:
https://idcs-xxxxx.identity.oraclecloud.com:443/oauth2/v1/authorize?client_id=xxxxxx&response_type=code&redirect_uri=http%3A%2F%2Flocalhost%3A8888%2Fcallback&scope=deepsec11b36dfOracleDB1b36dfdeepsec11b36df_DB_ACCESS_SCOPE_1b36df&state=TJpMXVA4kus6WY7Aw5gODdYXt4zqIu4i&code_challenge=-kIpbCiQN0hgkbUZNE9pbdD3aPi8afvmATeDsl55q9A&code_challenge_method=S256
#↓ 認可コードの取得待ちになるので、IAMにログイン後のコールバックのURLをすべて貼り付ける
Copy the final redirected URL from the browser address bar, or copy only the code= value.
The localhost page may not load in headless mode. That is expected; the address bar is the important part.
Paste redirected URL or authorization code: http://localhost:8888/callback?code=AgAgZDk2OWUwZGM1NTc2NDE4NGE3MGE4NThjNWM0MjA3MGYIABC-hOBdb568LrcbNiYpRQhzAAAAQCxZA3uYT4j0QZ95YdwZcLRCOvejvms-jVmwfDuO0kh0Lpsv_v0-MR5ge7DGx2U1pLsB526s5sG77_Ku534lPjw=&state=TJpMXVA4kus6WY7Aw5gODdYXt4zqIu4i
Parsed authorization code (164 characters).
#↓ アクセストークンの取得がうまくいけば、以下のようにディレクトリに格納される
OAuth2 access token written for SQL*Plus.
TOKEN_LOCATION = /home/opc/.oci/adb-oci-iam
token file = /home/opc/.oci/adb-oci-iam/token
expires_in = 3600
============================================================================
Task 4 Completed: OCI IAM OAuth2 Token Ready
============================================================================
Ready: run ./05_verify_as_marvin.sh or ./06_verify_as_emma.sh
#marvinで実行
$ ./05_verify_as_marvin.sh
EMPLOYEE_ID FIRST_NAME LAST_NAME USER_NAME SSN SALARY PHONE_NUMBER MANAGER_ID
----------- ------------ ------------ -------------------------------- --------------- ---------- --------------- ----------
2 Marvin Morgan marvin 222-22-2222 175000 555-100-0002 1
3 Emma Baker emma 120000 555-100-0003 2
4 Charlie Davis charlie 95000 555-100-0004 2
5 Dana Lee dana 130000 555-100-0005 2
#04を再度実行して、emmaでログイン。トークンを取得して以下を実行
$ ./06_verify_as_emma.sh
EMPLOYEE_ID FIRST_NAME LAST_NAME USER_NAME SSN SALARY PHONE_NUMBER MANAGER_ID
----------- ------------ ------------ -------------------------------- --------------- ---------- --------------- ----------
3 Emma Baker emma 333-33-3333 120000 555-100-0003 2
Deep Data Securityによってそれぞれのユーザーのアクセスが制御されていることを見ることができると思います。ただ、スクリプトを流すだけだと実際に何をやっているのか分からないと思うので、少し内容を解説します。
まず、作成されたADBとIAMに関連する情報は、環境変数のファイル adb-oci-iam.envで確認できる
export OCI_COMPARTMENT='root'
export ROOT_COMP_ID='ocid1.tenancy.oc1..xxxxx'
export DB_NAME='deepsec11b36df'
export DB_DISPLAY_NAME='deepsec11b36df'
export DB_VERSION='26ai'
export ADB_OCID='ocid1.autonomousdatabase.oc1.ap-tokyo-1.xxxxx'
export ADB_SERVICE='deepsec11b36df_low'
export ADMIN_PWD='xxxxxxxxxx'
export WALLET_PWD='Oracle123+'
export WALLET_DIR='/home/opc/adb_wallet/deepsec11b36df'
export TNS_ADMIN='/home/opc/adb_wallet/deepsec11b36df'
export OCI_TOKEN_DIR='/home/opc/.oci/adb-oci-iam'
export TENANCY_OCID='ocid1.tenancy.oc1..xxxxx'
export OCI_DOMAIN_URL='https://idcs-xxxxx.identity.oraclecloud.com:443'
export OCI_DB_APP_ID='59a830895cdb4bd98135ad2509334b44'
export OCI_DB_CLIENT_ID='d43568c499db4c68a7d083227588413b'
export OCI_DB_CLIENT_SECRET='9e1f5e79-2e65-480c-ad63-481a43c31360'
export OCI_CLIENT_APP_ID='8d3acc132deb4d2488e3fe7fac421fc4'
export OCI_CLIENT_ID='60918a189a7549e285cb5e8110ed7cdc'
export OCI_AUDIENCE='deepsec11b36dfOracleDB1b36df'
export OCI_SCOPE='deepsec11b36dfOracleDB1b36dfdeepsec11b36df_DB_ACCESS_SCOPE_1b36df'
export OCI_REDIRECT_URI='http://localhost:8888/callback'
export OCI_REDIRECT_URIS='http://localhost:8888/callback,http://localhost:8889/callback,http://localhost:8890/callback,http://127.0.0.1:8888/callback,http://127.0.0.1:8889/callback,http://127.0.0.1:8890/callback'
export ADB_OCI_IAM_LAB_INSTANCE_ID='deepadbtest-26bf50-1b36df'
export OCI_DB_APP_NAME='deepsec11b36df ADB OCI IAM DB Resource - deepadbtest-26bf50-1b36df'
export OCI_CLIENT_APP_NAME='deepsec11b36df ADB OCI IAM Public Client - deepadbtest-26bf50-1b36df'
export OCI_IAM_EMPLOYEE_GROUP='EMPLOYEES'
export OCI_IAM_MANAGER_GROUP='MANAGERS'
export EMPLOYEES_OCID='931d6e929ef34b89872f579d925b6ff4'
export MANAGERS_OCID='ba573d26371b4059893dad171a5e1dfc'
export OCI_USERNAME_DOMAIN=''
export MARVIN_USERNAME='marvin'
export EMMA_USERNAME='emma'
export MARVIN_ID='5424877d6e2240689a3ceeed5de2adc8'
export EMMA_ID='1e374fe83cf54531af48cc8611c89bd4'
export CREATE_DEMO_USERS='1'
OCI IAMの設定
OCI IAM の統合アプリケーションにユーザー認証およびアクセストークン取得を行うOAuthクライアントアプリケーションと、ADBを保護対象リソースとして定義するOAuthリソースサーバー(Resource Application)の2つの機密アプリケーションを作成する。

OAuthクライアントの設定。リソースサーバーのスコープを指定し、認可コードをコールバックする設定が入っている。

OAuthリソースサーバーの設定。OAuthクライアントからのトークン要求時に使用するスコープを定義する。また、クライアントIDおよびクライアント・シークレットは、ADBのOCI IAM認証用Credentialとして使用される。

OCI IAMの場合、アクセス・トークンにユーザーのグループ所属を入れるにはcustom claim ruleを作成する必要がある
curl -X POST https://<domain_url>/admin/v1/CustomClaims \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/scim+json" \
-d '{
"schemas": [
"urn:ietf:params:scim:schemas:oracle:idcs:CustomClaim"
],
"name": "group",
"value": "$user.groups.*.display",
"expression": true,
"mode": "always",
"tokenType": "AT",
"allScopes": true
}
ADB側の設定
-- ADBは、IAMの機密アプリケーションの情報を使用して、IAMとのトークン認証連携するための
-- パラメータの設定を行う
DBMS_CLOUD_ADMIN.ENABLE_EXTERNAL_AUTHENTICATION(
type => 'OCI_IAM',
params => JSON_OBJECT(
'app_id' VALUE '${OCI_DB_APP_ID}',
'domain_url' VALUE '${OCI_DOMAIN_URL}'
),
force => TRUE
);
--リソースサーバーのクライアントIDおよびクライアント・シークレット
DBMS_CLOUD.CREATE_CREDENTIAL(
credential_name => 'OCI_IAM_DOMAIN_DB_CRED$',
username => '${OCI_DB_CLIENT_ID}',
password => '${OCI_DB_CLIENT_SECRET}'
);
--データ・ロールをIAMグループとマッピングして作成
CREATE OR REPLACE DATA ROLE hrapp_employees
MAPPED TO 'IAM_OAUTH_GROUP=EMPLOYEES';
CREATE OR REPLACE DATA ROLE hrapp_managers
MAPPED TO 'IAM_OAUTH_GROUP=MANAGERS';
--データ権限作成し、データ・ロールに付与
CREATE OR REPLACE DATA GRANT hr.HRAPP_EMPLOYEES_ACCESS
AS SELECT (employee_id, first_name, last_name, user_name, department_id, manager_id, ssn, salary, phone_number), UPDATE(phone_number)
ON hr.employees
WHERE upper(user_name) = upper(ora_end_user_context.username)
TO HRAPP_EMPLOYEES;
CREATE OR REPLACE DATA GRANT hr.HRAPP_MANAGER_ACCESS
AS SELECT (ALL COLUMNS EXCEPT ssn), UPDATE (salary, department_id)
ON hr.employees
WHERE manager_id = ORA_END_USER_CONTEXT.HR.EMP_CTX.ID
TO HRAPP_MANAGERS;
ADBの接続用のWallet内のsqlnet.oraにトークン認証を行う設定が追加される。
SSL_SERVER_DN_MATCH=yes
TOKEN_LOCATION=/home/opc/.oci/adb-oci-iam
TOKEN_AUTH=OAUTH
以上です。作成されたIAMの機密アプリケーションは、Autonomous AI Database以外のOracle Databaseにもそのまま流用できるので、その場合は、パラメータの変更箇所を以下のSQLにして実行します。
ALTER SYSTEM SET identity_provider_type=OCI_IAM SCOPE=BOTH;
ALTER SYSTEM SET IDENTITY_PROVIDER_OAUTH_CONFIG='{
"app_id":"${OCI_DB_CLIENT_ID}",
"domain_url":"${OCI_DOMAIN_URL}"
}' SCOPE=BOTH;
このスクリプトで構成されるIAMの設定自体は、前回紹介したデータベースへのダイレクトアクセスという方式です。一度正しく動作する環境を持っておけば、手動で作成する際にも困らなくなると思うので一度試してみることをお勧めします。
<参考> 外部IdPとの認証連携
Entra IDやOCI IAM以外のIdPを使用したい場合は、以下のスライドのようにフェデレーションすることで既存の認証基盤を使用することが可能です。
今の構成を拡張して、OCI IAMとOktaのSAML フェデレーション連携の設定をした場合。ログインはOktaを選択する

Oktaに認証がリダイレクトされるので、Oktaでログイン。

Oktaで認証成功後はOCI IAMに制御が戻り、OAuthのAuthorization Code Flowと同様に、OCI IAMから認可コードがコールバックされる。以降のフローは上記と同じ



