1
1

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の外部認証 - OCI IAMとのトークン・ベースの認証連携 -

1
Last updated at Posted at 2024-02-01

本記事は、2026年4月21日に内容を見直し、再構成しました。
※この手順は、OCIの旧IAMのDBアクセストークンを使用した旧来のマッピング方式です。Deep Data Securityの場合は、こちらの設定を参考してして下さい。

IAMとのトークンベースの認証連携が可能なデータベースは、Autonomous DB, BaseDB, ExaDB-DといったOCI上のOracle Database Cloudのデータベースが対象です。
TLSでのOracle Databaseの接続が完了済みであれば、実際にIAMとトークン・ベースで認証連携させるためのデータベースの設定やIAMユーザーの作成等を行っていきます。

1. IDENTITY_PROVIDER_TYPEの設定

データベースのIDENTITY_PROVIDER_TYPEのパラメータをOCI_IAMに設定する

-- Alter System文でIdentity ProviderをIAMに設定
SQL> ALTER SYSTEM SET IDENTITY_PROVIDER_TYPE=OCI_IAM SCOPE=BOTH;

SQL> SELECT NAME, VALUE FROM V$PARAMETER WHERE NAME='identity_provider_type';
NAME                      VALUE
------------------------  -------------
identity_provider_type    OCI_IAM

ADBの場合は、以下を実行

BEGIN
   DBMS_CLOUD_ADMIN.ENABLE_EXTERNAL_AUTHENTICATION( 
      type => 'OCI_IAM' );
END;

2. IAMポリシーの作成

OCIにあるOracle Databaseサービスを使用するためのIAMポリシーを作成し、グループに割り当てる

  • グループを作成 -> グループ名: dbtoken_grp
  • データベースの権限をグループに付与したポリシーを作成 -> ポリシー名: dbtoken_pol
    allow group dbtoken_grp to use database-connections in tenancy
    allow group dbtoken_grp to use database-family in tenancy
    image.png

3. IAMユーザーの作成

テストで使用する2つのユーザーを作成する (dbiamtest_user1, dbiamtest_mgr1)

image.png

4. IAMグループの作成

以下4つのグループを追加で作成

  • db_users, db_admins, resource_role, pdb_dba_role

image.png

以下のように、作成したグループをユーザーに割り当てる

  • dbiamtest_user1 <-- dbtoken_grp, db_users, resource_role
  • dbiamtest_mgr1 <-- dbtoken_grp, db_admins, pdb_dba_role

5. IAMグループとのDBスキーマ・ロールのマッピング

Oracle DatabaseでIAMグループとマッピングするDBスキーマ・ロールを作成する

-- DB:dbusersスキーマとIAM:db_usersグループをマッピングしたユーザーを作成
CREATE USER dbusers IDENTIFIED GLOBALLY AS 'IAM_GROUP_NAME=db_users';
grant connect to dbusers;

-- DB:dbadminsスキーマとIAM:db_adminsグループをマッピングしたユーザーを作成
CREATE USER dbadmins IDENTIFIED GLOBALLY AS 'IAM_GROUP_NAME=db_admins';
grant connect to dbadmins;

-- DB:db_resource_roleロールとIAM:resource_roleグループをマッピングしたロールを作成、resorce権限を付与
CREATE ROLE db_resource_role IDENTIFIED GLOBALLY AS 'IAM_GROUP_NAME=resource_role';
grant resource to db_resource_role;

-- DB:db_pdb_dba_roleロールとIAM:pdb_dba_roleグループをマッピングしたロールを作成、pdb_dba権限を付与
CREATE ROLE db_pdb_dba_role IDENTIFIED GLOBALLY AS 'IAM_GROUP_NAME=pdb_dba_role';
grant pdb_dba to db_pdb_dba_role;

図解すると、下記のようにマッピングされている。dbiamtest_user1はdb_usersとresource_roleのグループに、dbiamtest_mgr1は、db_adminsとpdb_dba_roleのグループに参加している

IAM Group DB User DB Role DB権限
db_users dbusers - -
db_admins dbadmins - -
resource_role - db_resource_role resource
pdb_dba_role - db_pdb_dba_role pdb_dba

5. クライアントの設定と接続テスト

クライアントは、TOKEN_AUTHのパラメータを含めたtnsnames.oraを追記し、OCI CLIコマンドが実行できるように構成する。ここでは、自身のWindows PCにSQLclとOCI CLIをインストール、データベースにはClient Walletを使用するTLS接続として構成する。

--tnsnames.oraに以下を追記
token= 
  (DESCRIPTION=
    (ADDRESS=(PROTOCOL=TCPS)(HOST=ホスト名)(PORT=ポート))
    (SECURITY=
      (SSL_SERVER_DN_MATCH=TRUE)
      (WALLET_LOCATION= Client Walletのディレクトリ)
      (TOKEN_AUTH=OCI_TOKEN)
    )
    (CONNECT_DATA=
      (SERVER=DEDICATED)
      (SERVICE_NAME=サービス名)
    )
  )

まずOCIにログインしてDBトークンを取得する。OCI CLIのoci session authenticateを実行

oci session authenticate

Warning: To increase security of your API key located at C:\Users\knishimu\.oci\sessions\DEFAULT\oci_api_key.pem, append an extra line with 'OCI_API_KEY' at the end. For more information, refer to https://docs.oracle.com/iaas/Content/API/Concepts/apisigningkey.htm. To suppress the warning, set the env variable SUPPRESS_LABEL_WARNING=True
Enter a region by index or name(e.g.
1: af-casablanca-1, 2: af-johannesburg-1, 3: ap-batam-1, 4: ap-chiyoda-1, 5: ap-chuncheon-1,
6: ap-chuncheon-2, 7: ap-dcc-canberra-1, 8: ap-dcc-gazipur-1, 9: ap-delhi-1, 10: ap-hyderabad-1,
11: ap-ibaraki-1, 12: ap-kulai-2, 13: ap-melbourne-1, 14: ap-mumbai-1, 15: ap-osaka-1,
16: ap-seoul-1, 17: ap-seoul-2, 18: ap-singapore-1, 19: ap-singapore-2, 20: ap-suwon-1,
21: ap-sydney-1, 22: ap-tokyo-1, 23: ca-montreal-1, 24: ca-toronto-1, 25: eu-amsterdam-1,

    You can also open the following URL in a web browser window to continue:
https://login.ap-tokyo-1.oraclecloud.com/v1/oauth2/authorize?action=login&client_id=iaas_console&response_type=token+id_token&nonce=2f092109-c31d-490f-8aaa-94c96f0f5e1f&scope=openid&public_key=eyJrdHkiOiAiUlNBIiwgIm4iOiAiMVgwOG9XWHd4M1VqOW9TRFBlV3gyRTREbm1rLWxQYy1wdTh6QUI3QzBNTFBkTENjYVhjVDVHUEdGeFZKeXZVZkw1bGtKOWVOakNweHhxZ1hQbDluRnhrN0FfU25DWV9uSGo0U0VyQzhmVlF5SWZqbmR0R2VxSnFHdHBsbFNMcDBORlJndVgyenEtNXNXVTl2NW1XMUVPMUpud25EbTVoRGlOVlJOR2RwLTBfSWtwU2dhdERSSTUwNEJDU1c1THRJX190YkQyeUJ4V3BicDJiUC1qTU1acnpaTmJZVGV4eWtpampPcTNMdHR6Mmt0VC10T2o4Mnd5cGNDN1FSaTVFN2xDSDhRaFJWWU5vZXVHWnRndGRKSnVXdGRoTU5ibmhZNEkwaU8ybGNFeXdWWTJ3WFVGVktrdjJ2RVRQelY0RDNxTm9feEFKU3prNG1fMlh6cVVyVFpRIiwgImUiOiAiQVFBQiIsICJraWQiOiAiSWdub3JlZCJ9&redirect_uri=http%3A%2F%2Flocalhost%3A8181

OCIのログイン画面が起動するので、dbiamtest_user1でログイン
image.png

ログインが成功すると以下の画面が表示される
image.png

プロンプトが戻って来るので、以下の手順でDBトークンを取得する

#ログインが成功すると、保存するプロファイル名を指定
Completed browser authentication process!
Enter the name of the profile you would like to create: iam4db 
Config written to: C:\Users\xxxxx\.oci\config

    Try out your newly created session credentials with the following example command:

    oci iam region list --config-file C:\Users\xxxxx\.oci\config --profile iam4db --auth security_token

#DBトークンを取得する ※作成したプロファイル名を指定
oci iam db-token get --config-file C:\Users\xxxxx\.oci\config --profile iam4db --auth security_token

Private key written at C:\Users\xxxxx\.oci\db-token\oci_db_key.pem
db-token written at: C:\Users\xxxxx\.oci\db-token\token <--トークンの格納先
db-token is valid until 2026-04-21 15:05:45

トークンを使用してデータベースに接続

--DB接続は、/@接続文字列のみ
sql /@token
SQLcl:  4 21 13:15:29 2026のリリース26.1 Production

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

接続先:
Oracle AI Database 26ai Enterprise Edition Release 23.26.1.0.0 - Production
Version 23.26.1.0.0

SQL>
SQL> show user
USER"DBUSERS"  <--DBスキーマ DBUSERSにマッピングされた

--権限はresourceロールの権限が付与されている
SQL> select * from SESSION_PRIVS;
PRIVILEGE
----------------------------------------
CREATE SESSION
CREATE TABLE
CREATE CLUSTER
CREATE SEQUENCE
CREATE PROCEDURE
CREATE TRIGGER
CREATE TYPE
CREATE OPERATOR
CREATE INDEXTYPE
SET CONTAINER

10 rows selected.

dbiamtest_user1は、db_users, resource_roleグループに所属しているので、DBではDBUSERSユーザーにマッピングされ、resourceロールの権限が付与されていることが分かる。

次に、dbiamtest_mgr1でログインして確認する

-- 上記の手順同様にOCIのログイン、DBトークンの取得---

sql /@token
SQL> show user
USER is "DBADMINS" <--#DBスキーマ DBADMINSにマッピングされた

--権限はpdb_dbaロールの権限が付与されている
SQL> select * from SESSION_PRIVS;
PRIVILEGE
----------------------------------------
CREATE SESSION
CREATE PLUGGABLE DATABASE
SET CONTAINER

ログインしたIAMユーザーが異なるので、マッピングされたDBスキーマと保持している権限が異なることが分かる。IAMユーザーのグループへの割り当て・解除によって、DBロールが変化することも試してみる。

このTOKEN_AUTH=OCI_TOKENは、基本となるトークンベースの接続方式です。トークンを取得するフローとトークンを渡すフローはそれぞれ独立して操作しています。今回は、SQLclを使用しましたが、SQL DeveloperやVSCode, MCPサーバーの接続でも同様に使用することが可能です。DBトークンを事前に取得するというのがポイントです。
トークンは、sqlnet.oraで明示的に場所を指定しなければ、デフォルトのロケーションが使用されます。

また、この一連の処理をインタラクティブにひとつのフローとして実行したい場合は、OCI_INTERACTIVEを使用することができます。

OCI_INTERACTIVEはSQLclには追加のSDKが必要です。Oracle DatabaseにSQLclでログインし、以下を実行する

sdk install jdbc-oci

tnsnames.oraは、TOKEN_AUTH=OCI_INTERACTIVEに変更

--tnsnames.oraに以下を追記
token= 
  (DESCRIPTION=
    (ADDRESS=(PROTOCOL=TCPS)(HOST=ホスト名)(PORT=ポート))
    (SECURITY=
      (SSL_SERVER_DN_MATCH=TRUE)
      (WALLET_LOCATION= Client Walletのディレクトリ)
      (TOKEN_AUTH=OCI_INTERACTIVE)
    )
    (CONNECT_DATA=
      (SERVER=DEDICATED)
      (SERVICE_NAME=サービス名)
    )
  )

--oci session authenticateは実行せずに、直接DBログインを実行する
sql /@token

Windows + SQLclの場合のみ、sql /@token実行後に、OCIのログイン画面が表示され、OCIログイン後にはそのままシームレスにデータベースまでログインできるかと思います。それ以外だと、 ORA-18726: Failed to get a value from an OracleResourceProviderになるのですが解決方法が調査中です。
ちなみに、Entra IDの場合のパラメータ AZURE_INTERACTIVEは、期待通りにどのパターンでも動作します。

6.トラブルシューティング

手順通りに実施しても一発で接続成功することは難しいかもしれないので、どの部分の問題なのか段階的に調査するのが良い

  • クライアント側のSQL Traceのログからアクセストークンは正しく取得できているか?
  • Databaseのアラートログにエラーは出力されていないか?
  • IAMのグループやユーザーは適切に設定されているか?
  • DatabaseとIAMのマッピングユーザーは適切か?
  • OS側、OCI側のFirewallで必要なポートをブロックしていないか?
  • サポートされているバージョンのDatabase Clientを使用しているか?

ありがちなエラーメッセージと対応方法

#トークンが古い -> 再度取得して接続する
ORA-25708: The expiration time of the token has passed.
Help: https://docs.oracle.com/error-help/db/ora-25708/


#トークンが指定された場所にない。トークンの場所は、~/.oci/db_token/token
ORA-25707: The token is invalid.
Help: https://docs.oracle.com/error-help/db/ora-25707/

#トークンで接続するTnsnames.oraのホスト名がサーバー証明書のCNと一致していない可能性。ホスト名のみやFQDNで試してみる
ORA-29002: SSL transport detected invalid or obsolete server certificate.
Help: https://docs.oracle.com/error-help/db/ora-29002/

トークンに含まれるユーザー等の情報は、下記サイトのデコーダーで確認できます
https://web-toolbox.dev/tools/jwt-decoder

1
1
1

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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?