※ 本記事は、Adrian Padilla Duarteによる”Passwordless JDBC with OCI IAM Tokens: WebLogic Server and Autonomous Database 26ai“を翻訳したものです。

2026年9月14日


はじめに

この記事では、OCI IAMデータベース・トークンを使用してOracle Autonomous Databaseに接続するようにWebLogic Server JDBCデータ・ソースを構成する方法を示します。データ・ソースにはデータベース・ユーザー名またはパスワードがありません。OCI IAMは短期間のデータベース・トークンを発行し、Oracle JDBC ThinドライバはそれをWebLogicオペレーティング・システム・アカウントから読み取り、データベースはIAMグループをグローバル・データベース・ユーザーにマップします。

この構成は、WebLogic Server 14.1.2.0.0、Oracle JDBC Thin 23.26.0.0.0、WebLogicクラスタ、Oracle AI Database 26aiで実行されるAutonomous Database、クラスタ・ターゲット汎用データ・ソース、および行の書込みと読取りを行う小規模なWebアプリケーションで検証されました。互換性のあるOracle JDBC Thinドライバを使用する場合、同じパターンはスタンドアロン管理対象サーバーおよびサポートされている他のWebLogic Serverリリースにも適用されます。

IAMデータベース・トークンにはTCPS接続が必要で、1時間後に期限切れになります。ホストは、期限切れになる前にリフレッシュする必要があります。「Oracle AI DatabaseのIAMユーザーの認証および認可」を参照してください。

このシリーズでは

これは、「OCI IAMトークンを使用したパスワードレスJDBC」シリーズのパート1です:

  • WebLogic ServerとAutonomous Database 26ai (この記事)
  • OCI上のWebLogic ServerおよびOracle AI Database (予定)
  • WebLogic JDBCデータ・ソース用のOCI IAMトークン認証の運用 (予定)

最初の2つの記事は、データベース固有の設定を示しています。3つ目は、トークンの更新、プーリング動作、監視、トラブルシューティングなど、本番環境の共有に関する問題に重点を置いています。

この記事で構成する内容

  1. IAMユーザーはIAMグループに配置されます。
  2. Autonomous Databaseは、そのグループをグローバル・データベース・ユーザーにマップします。
  3. 各WebLogicホストのoracle OSアカウントには、そのIAMユーザー用のOCI CLIおよびAPIキーが構成されています。
  4. OCI CLIは、データベース・トークンとペアの秘密キーを ~/.oci/db-token 以下に書き込みます。
  5. ウォレットTNS別名にはTOKEN_AUTH=OCI_TOKENが含まれています。
  6. WebLogicデータ・ソースは、その別名とウォレット・ディレクトリを使用します。データベース・パスワードは含まれていません。
  7. ホスト側のcronジョブが30分ごとにトークンを更新します。

山カッコ内の値を、ご使用の環境の値に置き換えます。

前提条件

必要なもの:

  • この記事のファイルベースのTOKEN_AUTH=OCI_TOKENフローには、Oracle JDBC Thin 19.16以降が必要です。WebLogic Server 12.2.1.4、14.1.1、14.1.2、および15.1.1には、そのWebLogic Serverリリースに適用可能な最新のOracle JDBC for Fusion Middleware JDBC 23.26.x/19.x Bundle Patchを適用すると、サポート対象のOracle JDBC Thinバージョンが含まれます。ご使用の環境にインストールされている正確なドライバ・バージョンを確認し、19.16より古い場合は、対応する最新のBundle Patchを適用してください。WebLogic Serverリリースのパッチを特定するには、「(KA1182) Critical Patch Update (CPU) Patch Advisor for Oracle Fusion Middleware」を参照してください。このパッチは、WebLogic ServerにバンドルされているJDBCドライバをアップグレードされたドライバ・バージョンに更新します。
  • IAM外部認証が有効化されたAutonomous Database。
  • データ・ソースを使用するアプリケーションを実行できるすべてのホスト上に展開されたAutonomous Databaseウォレット。
  • API公開キーがアップロードされており、データベース・スキーマにマップされたIAMグループのメンバーであるOCI IAMユーザー。
  • すべてのWebLogic管理対象サーバー・ホストにOCI CLIをインストールし、root管理のcronファイルを作成する権限。

この記事では、WebLogicがoracle OSユーザーとして実行されていることを前提としています。トークン・プロセスをrootとして実行しないでください。JDBCドライバは、WebLogicを実行する同じOSアカウントを介してトークン・ファイルにアクセスする必要があります。

1. IAMとデータベース・マッピングの構成

適切なデータベース管理者として、Autonomous DatabaseのOCI IAM外部認証を有効にします:

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

結果を確認:

SHOW PARAMETER identity_provider_type

値はOCI_IAMである必要があります。

IAMグループをグローバル・データベース・ユーザーにマップします。共有マッピングは、すべてのグループ・メンバーが同じアプリケーション・スキーマにマップされるため、アプリケーション・サービス・アカウントに対して実用的です:

CREATE USER <hello_app_schema>
  IDENTIFIED GLOBALLY AS 'IAM_GROUP_NAME=<iam_group_name>';

GRANT CREATE SESSION TO <hello_app_schema>;

アプリケーションに必要なオブジェクト権限のみを付与します。独自の表を作成する小さな例を次に示します:

GRANT CREATE TABLE TO <hello_app_schema>;
ALTER USER <hello_app_schema> QUOTA UNLIMITED ON DATA;

CREATE TABLE hello_messages (
  id         NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
  message    VARCHAR2(1000) NOT NULL,
  created_at TIMESTAMP WITH TIME ZONE DEFAULT SYSTIMESTAMP NOT NULL,
  created_by VARCHAR2(512)
    DEFAULT SYS_CONTEXT('USERENV', 'AUTHENTICATED_IDENTITY') NOT NULL
);

グループによるデータベース・トークンのリクエストおよび使用を許可するIAMポリシーを作成します:

Allow group <iam_group_name> to use database-connections in tenancy

デプロイメント・モデルに適合する場合は、ポリシーをコンパートメントまたは単一のAutonomous Databaseに制限できます。IAMドキュメントでは、database-connectionsとautonomous-database-familyの両方のポリシー・オプションについて説明します。

2. 各WebLogicホストでのOCI CLIのインストールおよび構成

oracleアカウントでOCI CLIをインストールします。ここでは次の場所が使用されます:

/home/oracle/bin/oci
/home/oracle/lib/oci-cli
/home/oracle/.oci/config
/home/oracle/.oci/<api_key_private_file>

専用OCI CLIプロファイルを構成します。プライベートAPIキーと構成ファイルは、oracleのみが読み取り可能である必要があります:

[<oci_profile>]
user=<iam_user_ocid>
fingerprint=<api_key_fingerprint>
key_file=/home/oracle/.oci/<api_key_private_file>
tenancy=<tenancy_ocid>
region=<region>

WebLogic OSユーザーとしてトークンを生成します:

sudo -u oracle /home/oracle/bin/oci iam db-token get --profile <oci_profile>

OCI CLIでは、次のファイルがデフォルトで書き込まれます:

/home/oracle/.oci/db-token/token
/home/oracle/.oci/db-token/oci_db_key.pem

このディレクトリを保護します。トークンとペア・キーにより、マップされたIAMプリンシパルのデータベース・アクセスが許可されるため、WebLogicを実行するオペレーティング・システム・アカウントのみが読取り可能である必要があります。OCI CLIを構成した後、所有権および制限のある権限を設定します:

sudo chown -R oracle:oracle /home/oracle/.oci
sudo chmod 700 /home/oracle/.oci
sudo chmod 700 /home/oracle/.oci/db-token
sudo chmod 600 /home/oracle/.oci/config
sudo chmod 600 /home/oracle/.oci/<api_key_private_file>
sudo chmod 600 /home/oracle/.oci/db-token/token
sudo chmod 600 /home/oracle/.oci/db-token/oci_db_key.pem

このディレクトリを共有ストレージ、デプロイメント・アーカイブ、バックアップ、サポート・バンドル、構成リポジトリ、または診断出力に配置しないでください。リフレッシュ・ログもoracleのみが読み取り可能である必要があります:

sudo chmod 600 /home/oracle/.oci/db-token/refresh.log

3. ウォレットTNS別名の構成

すべての管理対象サーバー・ホストでAutonomous Databaseウォレットをダウンロードして展開します。この例では、ウォレット・ディレクトリは次のようになります:

/u01/app/oracle/adb-wallet/<adb_name>

ウォレットのtnsnames.oraの標準のlowサービス別名から開始し、SECURITYセクションにTOKEN_AUTH=OCI_TOKENを追加します。ウォレットで指定されたホスト名とサービス名を保持します:

<adb_iam_low> =
  (description=
    (retry_count=20)(retry_delay=3)
    (address=(protocol=tcps)(port=1522)(host=<adb_host>))
    (connect_data=(service_name=<adb_low_service>))
    (security=(ssl_server_dn_match=yes)(TOKEN_AUTH=OCI_TOKEN)))

OCI CLIおよびJDBCドライバが同じoracleアカウントでデフォルトの ~/.oci/db-token ディレクトリを使用する場合、TOKEN_LOCATIONは必要ありません。トークンを別の場所に意図的に格納する場合にのみ設定します。接続記述子のトークン設定は、ファイル・レベルのデフォルトより優先されます。

4. トークンの自動リフレッシュ

データベース・トークンは1時間後に期限切れになります。このスクリプトを /home/oracle/bin/refresh-adb-db-token として作成します:

#!/usr/bin/env bash
set -euo pipefail

export PATH=/home/oracle/bin:/usr/bin:/bin
exec /home/oracle/bin/oci iam db-token get --profile <oci_profile>

強化されたイメージでは、oracleはcrontabを使用できない場合があります。代わりに、root管理の/etc/cron.d/adb-db-token-refreshという名前のファイルを使用します:

*/30 * * * * oracle /usr/bin/flock -n /home/oracle/.oci/db-token/.refresh.lock /home/oracle/bin/refresh-adb-db-token >> /home/oracle/.oci/db-token/refresh.log 2>&1

これは1時間に2回実行され、1時間のトークン存続期間内で適切に実行されます。flockはリフレッシュの重複を防ぎます。同じユーザー・コンテキストでジョブを確認します:

sudo -u oracle /bin/bash -lc \
  '/usr/bin/flock -n /home/oracle/.oci/db-token/.refresh.lock \
  /home/oracle/bin/refresh-adb-db-token \
  >> /home/oracle/.oci/db-token/refresh.log 2>&1'

5. クラスタ・ターゲットWebLogicデータ・ソースの作成

データ・ソースでは、データベース・ユーザーまたはパスワードは設定されません。Thin URLはトークン対応の別名を解決し、oracle.net.tns_adminはウォレットを識別します。

このオンラインWLSTの例では、汎用データ・ソースを作成してクラスタにターゲット指定します。WebLogic管理者資格証明を、スクリプトではなく環境変数に格納します:

from java.lang import String
from jarray import array
from weblogic.management.configuration import TargetMBean
import os

admin_url = 't3s://<admin_host>:<admin_port>'
cluster_name = '<cluster_name>'
data_source_name = 'HelloAppDataSource'
wallet_dir = '/u01/app/oracle/adb-wallet/<adb_name>'

connect(os.environ['WLS_USER'], os.environ['WLS_PWD'], admin_url)
edit()
startEdit()

if getMBean('/JDBCSystemResources/' + data_source_name) is None:
    jdbc = cmo.createJDBCSystemResource(data_source_name)
    resource = jdbc.getJDBCResource()
    resource.setName(data_source_name)

    driver = resource.getJDBCDriverParams()
    driver.setDriverName('oracle.jdbc.OracleDriver')
    driver.setUrl('jdbc:oracle:thin:@<adb_iam_low>')
    driver.getProperties().createProperty('oracle.net.tns_admin').setValue(wallet_dir)

    resource.getJDBCDataSourceParams().setJNDINames(
        array(['jdbc/HelloAppDataSource'], String))
    jdbc.setTargets(array([getMBean('/Clusters/' + cluster_name)], TargetMBean))

save()
activate(block='true')
disconnect()
exit()

ドメインWLSTインストールを使用して実行します:

export WLS_USER=<weblogic_administrator>
export WLS_PWD=<weblogic_administrator_password>
<middleware_home>/oracle_common/common/bin/wlst.sh configure_datasource.py

ATP Database use with WebLogic Server」記事でも、TNS別名とoracle.net.tns_adminパターンを使用しています。ここで重要な違いは、このデータ・ソースではデータベース・パスワードが提供されないことです。TOKEN_AUTH=OCI_TOKENは、JDBCドライバにトークン・ファイルの場所を示します。

6. Webアプリケーションからのデータ・ソースの使用

Java EE WEBアプリケーションの場合、WEB-INF/web.xmlでリソース参照を宣言します:

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" version="4.0">
  <resource-ref>
    <res-ref-name>jdbc/HelloAppDataSource</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
  </resource-ref>
</web-app>

WEB-INF/weblogic.xmlでグローバルWebLogic JNDI名にマップします:

<?xml version="1.0" encoding="UTF-8"?>
<weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app">
  <resource-description>
    <res-ref-name>jdbc/HelloAppDataSource</res-ref-name>
    <jndi-name>jdbc/HelloAppDataSource</jndi-name>
  </resource-description>
</weblogic-web-app>

アプリケーションでは、通常のJNDIルックアップを使用します:

DataSource dataSource = (DataSource) new InitialContext()
    .lookup("java:comp/env/jdbc/HelloAppDataSource");

try (Connection connection = dataSource.getConnection()) {
    // Use the connection normally.
}

アプリケーションを1つの管理対象サーバーではなくクラスタにデプロイします。

データソース構成はJakarta EEアプリケーションでは同じですが、WebLogic Serverリリースおよびアプリケーション・フレームワークに適したJakarta APIおよびデプロイメント記述子を使用します。IAMトークン構成は、アプリケーション・コードの外部に保持されます。

7. エンドツーエンド接続の検証

ホストが新しいトークンを作成できることを確認します:

sudo -u oracle /home/oracle/bin/oci iam db-token get --profile <oci_profile>

ロード・バランサを使用してアプリケーションをテストします:

curl -k -X POST \
  --data-urlencode 'message=Hello from IAM token authentication' \
  https://<load_balancer_ip>/hello-db/hello-db

curl -k https://<load_balancer_ip>/hello-db/hello-db

トークン認証済データベース・セッションからアイデンティティを確認します:

SELECT
  USER,
  SYS_CONTEXT('USERENV', 'AUTHENTICATED_IDENTITY') AS authenticated_identity,
  SYS_CONTEXT('USERENV', 'AUTHENTICATION_METHOD') AS authentication_method
FROM dual;

この記事のグループ・マッピングの場合、USERはグローバル・データベース・ユーザー、AUTHENTICATED_IDENTITYはIAMユーザー、AUTHENTICATION_METHODはTOKEN_GLOBALです。

トラブルシューティング

ORA-01017: 資格証明が無効か、認可されていません

次のことを確認してください:

  • identity_provider_typeはOCI_IAMです。
  • IAMユーザーは、マップされたグループに属しています。
  • グローバル・データベース・ユーザーのIAM_GROUP_NAME値は正しいです。
  • TNS記述子にはTOKEN_AUTH=OCI_TOKENが含まれています。
  • トークンおよびoci_db_key.pemは ~/.oci/db-token 配下に存在し、WebLogicオペレーティング・システム・アカウントが所有しています。

OCI CLIはNotAuthorizedOrNotFoundを返します

IAMプリンシパルには、データベース接続の使用を許可するポリシーが必要です。ポリシー・スコープを確認し、パブリックAPIキーがIAMユーザーにアップロードされていることを確認します。

アプリケーションが約1時間後に失敗します

トークンの有効期限が切れているか、リフレッシュ・ジョブが実行されませんでした。失効後に行われた新しい物理JDBC接続がORA-25708で失敗します。WebLogicプールからすでに借用されている既存の接続は、プールが物理接続を作成または置換する必要が生じるまで使用可能なままであるため、リフレッシュ動作を検証するには新規接続テストを使用してください。チェックしてください:

sudo -u oracle tail -n 50 /home/oracle/.oci/db-token/refresh.log
sudo systemctl status crond
sudo cat /etc/cron.d/adb-db-token-refresh

スタンドアロンJDBCテストでSSOまたはウォレット・キーストア・エラーが報告されます

WebLogic外部でテストする場合は、JDBCドライバおよびウォレット/PKIライブラリ (oraclepki.jar、osdt_core.jar、osdt_cert.jarなど)をテスト・クラス・パスに含めます。正式なアプリケーション・テストとしてWebLogicデータ・ソースを検証します。

まとめ

WebLogic Serverは、互換性のあるOracle JDBC Thinドライバを使用する場合、データベース・パスワードをデータ・ソース定義に格納せずにAutonomous Databaseデータ・ソースを使用できます。重要な要素は、IAMグループとグローバル・ユーザーのマッピング、トークン対応のTNS別名、WebLogic OSアカウントで実行されるOCI CLI、およびアプリケーションを処理できるすべてのホスト上での信頼性の高いトークン更新ジョブです。アプリケーションは引き続き標準データ・ソースを使用します。IAMトークンの詳細はアプリケーション・コードの外部に保持されます。