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の外部認証 - Oracle DatabaseのTLS接続 -

Last updated at Posted at 2024-02-01

※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とのトークン・ベースの認証連携の設定をしていきます。

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?