※2025/7 Base Database内の構成が変わっているようなので、23aiベースで手順を見直し最新化しました。
Oracle Databaseのトークン・ベースの認証連携に必要なTLSで接続するためのデータベースとクライアントの設定方法について紹介します。今回使用するのは、クライアントウオレットを使用しないTLS接続で、クライアント側にサーバー証明書だけあればで接続できる方式です。
若干手順が面倒ですが、手順通りに進めれば間違いなく設定できるはずなので、OCIからBase DatabaseとDBに接続するためのVMをそれぞれ新たに作成することをお勧めします。
前提条件:
- Base Databaseのバージョンは、19 or 23aiの最新を選択
- Base Databaseのストレージは、論理ボリュームマネージャを選択
- Base Databaseはプライベート・サブネットに作成し、セキュリティ・リストのイングレスポート:1521-1522、エグレスポートの443、サービスゲートウェイから "Oracle Services NetworkのすべてのIADサービス" が通信できるにように設定する
- DBに接続するクライアントは、パブリック/プライベート・サブネットのどちらでも良いか、Base Databaseへの接続はホスト名で接続できる必要がある。特にトークン認証では必須
Base Database側の設定
- 作成したBase Database(23ai)で設定する
#oracleユーザーで接続
#1. TLSのための暗号鍵とサーバー証明書を作成する。
$ mkdir /home/oracle/wallet
$ cd /home/oracle/wallet
$ orapki wallet create -wallet . -pwd xxxxx -auto_login
$ orapki wallet add -wallet . -pwd xxxxx -dn "CN=`hostname`" -keysize 2048 -self_signed -validity 3650
$ orapki wallet export -wallet . -pwd xxxxx -dn "CN=`hostname`" -cert dbcert.crt
$ cat dbcert.crt
#2.PDBにTLS接続するようにtnsnamesに追記する
$ vi $ORACLE_HOME/network/admin/tnsnames.ora
接続文字列 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCPS)(HOST = ホスト名)(PORT = 1522))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = PDBのサービス名)
)
)
#<設定例>
#ora23ai_PDB1 =
# (DESCRIPTION =
# (ADDRESS = (PROTOCOL = TCPS)(HOST = db23ai4iam)(PORT = 1522))
# (CONNECT_DATA =
# (SERVER = DEDICATED)
# (SERVICE_NAME = ora23ai_pdb1.privatesubnetin.vcn0408035740.oraclevcn.com)
# )
# )
#3.sqlnet.oraでネットワーク暗号化に関するパラメータをコメントアウトし、TLSに関する3つのパラメータを追加。NAMES.DIRECTORY_PATHとENCRYPTION_WALLET_LOCATIONは残す。※ TLSは認証と暗号化を両方提供するため、ネットワークのネイティブ暗号とは併用できません。
$ vi $ORACLE_HOME/network/admin/sqlnet.ora
#ココは残す
NAMES.DIRECTORY_PATH=(TNSNAMES,ONAMES,HOSTNAME)
ENCRYPTION_WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=/opt/oracle/dcs/commonstore/wallets/ora23ai_3nw_iad/tde)))
#コメントアウト
#SQLNET.ENCRYPTION_SERVER=REQUIRED
#SQLNET.CRYPTO_CHECKSUM_SERVER=REQUIRED
#SQLNET.ENCRYPTION_TYPES_SERVER=(AES256,AES192,AES128)
#SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER=(SHA256,SHA384,SHA512,SHA1)
#SQLNET.ENCRYPTION_CLIENT=REQUIRED
#SQLNET.CRYPTO_CHECKSUM_CLIENT=REQUIRED
#SQLNET.ENCRYPTION_TYPES_CLIENT=(AES256,AES192,AES128)
#SQLNET.CRYPTO_CHECKSUM_TYPES_CLIENT=(SHA256,SHA384,SHA512,SHA1)
#SQLNET.EXPIRE_TIME=10
#WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=/opt/oracle/dcs/commonstore/tcps_wallet)))
#SSL_CLIENT_AUTHENTICATION=FALSE
#以下3行追加
SSL_CLIENT_AUTHENTICATION=FALSE
SSL_VERSION=1.2
WALLET_LOCATION=(SOURCE=(METHOD=File)(METHOD_DATA=(DIRECTORY=/home/oracle/wallet)))
#4.opcユーザーにスイッチしてwalletファイルへのアクセス権をgridユーザーに付与
$ sudo setfacl -m u:oracle:rwx /home/oracle/
$ sudo setfacl -m u:oracle:rwx /home/oracle/wallet
$ sudo setfacl -m u:oracle:r /home/oracle/wallet/cwallet.sso
$ sudo setfacl -m u:oracle:r /home/oracle/wallet/dbcert.crt
$ sudo setfacl -m u:oracle:r /home/oracle/wallet/ewallet.p12
#5.oracleユーザーで接続
#listener.oraファイルの既存の設定をすべてコメントアウトして、新規に追記
$ vi $ORACLE_HOME/network/admin/listener.ora
# listener.oraファイルの既存の既存の設定をコメントアウト
#LISTENER=(DESCRIPTION_LIST=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=db23ai4iam.privatesubnetin.vcn0408035740.oraclevcn.com)(PORT=1521))(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521))(ADDRESS=(PROTOCOL=TCPS)(HOST=db23ai4iam.privatesubnetin.vcn0408035740.oraclevcn.com)(PORT=2484))))
#WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=/opt/oracle/dcs/commonstore/tcps_wallet)))
#SSL_CLIENT_AUTHENTICATION=FALSE
#以下を追加
SSL_CLIENT_AUTHENTICATION=FALSE
SSL_VERSION=1.2
WALLET_LOCATION=(SOURCE=(METHOD=File)(METHOD_DATA=(DIRECTORY=/home/oracle/wallet)))
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCPS)(HOST = ホスト名)(PORT = 1522))
(ADDRESS = (PROTOCOL = IPC)(KEY = LISTENER))
(ADDRESS = (PROTOCOL = TcP)(HOST = ホスト名)(PORT = 1521))
)
)
#<設定例>
#SSL_CLIENT_AUTHENTICATION=FALSE
#SSL_VERSION=1.2
#WALLET_LOCATION=(SOURCE=(METHOD=File)(METHOD_DATA=(DIRECTORY=/home/oracle/wallet)))
#
#LISTENER =
# (DESCRIPTION_LIST =
# (DESCRIPTION =
# (ADDRESS = (PROTOCOL = TCPS)(HOST = db23ai4iam)(PORT = 1522))
# (ADDRESS = (PROTOCOL = IPC)(KEY = LISTENER))
# (ADDRESS = (PROTOCOL = TcP)(HOST = db23ai4iam)(PORT = 1521))
# )
# )
#6.リスナー再起動、walletファイルのアクセスエラーが出ていなければOK
$ lsnrctl stop
$ lsnrctl start
#7.リスナーがTCPS 1522でリスニングできていることを確認
$ lsnrctl status
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 23.0.0.0.0 - for Oracle Cloud and Engineered Systems
Start Date 22-JUL-2025 03:09:11
Uptime 0 days 0 hr. 1 min. 14 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/oracle/product/23.0.0/dbhome_1/network/admin/listener.ora
Listener Log File /u01/app/oracle/diag/tnslsnr/db23ai4iam/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=db23ai4iam.privatesubnetin.vcn0408035740.oraclevcn.com)(PORT=1522)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=db23ai4iam.privatesubnetin.vcn0408035740.oraclevcn.com)(PORT=1521)))
Services Summary...
Service "32f00060b1f11ff6e0633a875e64e7c7.privatesubnetin.vcn0408035740.oraclevcn.com" has 1 instance(s).
Instance "ora23ai", status READY, has 1 handler(s) for this service...
Service "330d3a56f99f26b6e0635c08f40af437.privatesubnetin.vcn0408035740.oraclevcn.com" has 1 instance(s).
Instance "ora23ai", status READY, has 1 handler(s) for this service...
Service "ora23aiXDB.privatesubnetin.vcn0408035740.oraclevcn.com" has 1 instance(s).
Instance "ora23ai", status READY, has 1 handler(s) for this service...
Service "ora23ai_3nw_iad.privatesubnetin.vcn0408035740.oraclevcn.com" has 1 instance(s).
Instance "ora23ai", status READY, has 1 handler(s) for this service...
Service "ora23ai_pdb1.privatesubnetin.vcn0408035740.oraclevcn.com" has 1 instance(s).
Instance "ora23ai", status READY, has 1 handler(s) for this service...
The command completed successfully
#8.opensslのコマンドで結果がサーバー証明書の結果が返ってくればOK。※CNは、トークン認証時のtnsnames.oraで指定するのホスト名と完全一致する必要あるのでメモしておく。
$ openssl s_client -connect ホスト名:1522
#<実行例>
#$ openssl s_client -connect db23ai4iam.privatesubnetin.vcn0408035740.oraclevcn.com:1522
CONNECTED(00000003)
depth=0 CN = db23ai4iam
verify error:num=18:self signed certificate
verify return:1
depth=0 CN = db23ai4iam
verify return:1
---
Certificate chain
0 s:CN = db23ai4iam
i:CN = db23ai4iam
---
Server certificate
-----BEGIN CERTIFICATE-----
MIICrjCCAZYCEQCGc2eoU35bbZysckq/FNYZMA0GCSqGSIb3DQEBCwUAMBUxEzAR
BgNVBAMTCmRiMjNhaTRpYW0wHhcNMjUwNzE3MDY0OTM3WhcNMzUwNzE1MDY0OTM3
WjAVMRMwEQYDVQQDEwpkYjIzYWk0aWFtMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
MIIBCgKCAQEAjIjXhmqu6lKwXl5WbrlW23MpZz3DSKew14S8zgjVJJIcfTuJr/hK
VmZqpaiqAQ35rmc5VuH5MsAAMRU5uXQup0cJUFEE9DjjqqUBkF7R5NWzL6RKhq8O
Oracle Client側の設定
- Oracle Linux 8の1coreの最小のVMを作成。今回はパブリック・サブネットに作成
#opcで接続
#1.サーバー証明書をBaseDBから取り出しクライアント自身にインポートする
$ openssl s_client -connect ホスト名:1522 2>/dev/null </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > dbcert.crt
#例 ※ホスト名はFQDN
#$ openssl s_client -connect db23ai4iam.privatesubnetin.vcn0408035740.oraclevcn.com:1522 2>/dev/null </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > dbcert.crt
$ sudo cp dbcert.crt /etc/pki/ca-trust/source/anchors/
$ sudo update-ca-trust
#2.23aiの最新のInstance Clientをインストールする ※依存パッケージが不足していれば個別追加
$ wget https://download.oracle.com/otn_software/linux/instantclient/2380000/oracle-instantclient-basic-23.8.0.25.04-1.el8.x86_64.rpm
$ wget https://download.oracle.com/otn_software/linux/instantclient/2380000/oracle-instantclient-sqlplus-23.8.0.25.04-1.el8.x86_64.rpm
$ sudo rpm -ivh oracle-instantclient-basic-23.8.0.25.04-1.el8.x86_64.rpm
$ sudo rpm -ivh oracle-instantclient-sqlplus-23.8.0.25.04-1.el9.x86_64.rpm
#3.DB接続するためのOracle Net Serviceの設定
$ mkdir /home/opc/instant23ai
#sqlnet.oraに以下2行を追記
$ vi /home/opc/instant23ai/sqlnet.ora
SSL_CLIENT_AUTHENTICATION=FALSE
SSL_VERSION=1.2
#Database側で追加したTNSNAMESの箇所をそのままコピーする
vi /home/opc/instant23ai/tnsnames.ora
ora23ai_PDB1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCPS)(HOST = db23ai4iam)(PORT = 1522))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ora23ai_pdb1.privatesubnetin.vcn0408035740.oraclevcn.com)
)
)
#TNS_ADMINを環境変数に設定
$ export TNS_ADMIN=/home/opc/instant23ai
#hostsファイルで名前解決できるようにする
$ sudo vi /etc/hosts
ipアドレス FQDN ホスト名
#<設定例>
10.0.10.96 db23ai4iam.privatesubnetin.vcn0408035740.oraclevcn.com db23ai4iam
#6.SQL*PLUSで接続できればOK
$ sqlplus system/***@ora23ai_PDB1
Connected to:
Oracle Database 23ai Enterprise Edition Release 23.0.0.0.0 - for Oracle Cloud and Engineered Systems
Version 23.8.0.25.04
SQL>
トラブルシューティング
設定がうまくいかない場合は、トレースログを出力することで原因を調査できる
#クライアント側のsqlnet.oraに以下を追加
EVENT_25701=15
DIAG_ADR_ENABLED=TRUE
ADR_BASE=/home/opc
今回は、クラウドのBase Database 23aiを用いましたが、19c以降のデータベースであればオンプレミス、クラウドに関わらず基本的にTLSの設定は同じです。Azure ADと認証連携する場合もOracle DatabaseはTLS設定が可能になっている必要があります。
これでTLSのデータベースが準備できたので、次は実際にOCI IAMとのトークン・ベースの認証連携の設定をしていきます。