本記事では、Oracle Cloudで提供しているクラウドのOracle Database「Base Database」でTLS通信を有効化する手順を紹介します。
今回はPDBでTLS通信を有効化した後、LinuxのコンピュートインスタンスにDatabase Clientをインストールし、クライアントからTLS通信でPDBにSQL*Plusでアクセスできることを確認します。
前提条件
- Base Databaseインスタンスを作成していること
- Linuxのコンピュートインスタンスを作成していること
- Base Databaseインスタンスがあるサブネットのセキュリティ・ルールもしくはNetwork Security Groupにてポート1522が開放されていること
1. Walletの作成
Base DatabaseインスタンスにDBA権限でアクセスし、以下SQLでWallet Rootのディレクトリを確認します。
$sqlplus / as sysdba
SQL> show parameter wallet_root;
/opt/oracle/dcs/commonstore/wallets/DB23c_rwc_nrt
以下SQLでPDBのGUID名を確認します。
SQL> select PDB_NAME, GUID from DBA_PDBS;
DB23C_PDB1
02616F7B5BE15F03E063E700000A4BF9
Wallet Rootのディレクトリに、PDBのWalletを格納するディレクトリを作成します。
$mkdir /opt/oracle/dcs/commonstore/wallets/DB23c_rwc_nrt/<PDBのGUID名>/tls
例)
$mkdir /opt/oracle/dcs/commonstore/wallets/DB23c_rwc_nrt/02616F7B5BE15F03E063E700000A4BF9/tls
作成したディレクトリ内でWalletを作成します。
※PDBのサービス名は別途lsnrctl status
で確認してください。
$pwd
/opt/oracle/dcs/commonstore/wallets/DB23c_rwc_nrt/02616F7B5BE15F03E063E700000A4BF9/tls
$orapki wallet create -wallet . -pwd <パスワード> -auto_login
$orapki wallet add -wallet . -pwd <パスワード> -dn "CN=<DBのホスト名>" -keysize 2048 -self_signed -validity 3650
例)
$orapki wallet add -wallet . -pwd <パスワード> -dn "CN=db23c_pdb1.sub09140234280.vcntest.oraclevcn.com" -keysize 2048 -self_signed -validity 3650
$orapki wallet export -wallet . -pwd <パスワード> -dn "CN=db23c_pdb1.sub09140234280.vcntest.oraclevcn.com" -cert dbsec.crt
2. tnsnames.oraファイルの修正
Base Databaseのtnsnames.oraファイルを修正し、DatabaseにTLSのポート1522で通信ができるように設定します。
#PORTの値を1522に変更
$vi $ORACLE_HOME/network/admin/tnsnames.ora
LISTENER_DB23C =
(ADDRESS = (PROTOCOL = TCPS)(HOST = db23c)(PORT = 1522))
#PORTの値を1522に変更
DB23C_RWC_NRT =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCPS)(HOST = db23c)(PORT = 1522))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = DB23c_rwc_nrt.sub09140234280.vcntest.oraclevcn.com)
)
)
#PDBの接続情報を追加
DB23C_PDB1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCPS)(HOST = 10.0.0.231)(PORT = 1522))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = db23c_pdb1.sub09140234280.vcntest.oraclevcn.com)
)
)
3. sqlnet.oraファイルの修正
続いてsqlnet.oraファイルを修正し、以下3行を追記します。
SSL_CLIENT_AUTHENTICATION=FALSE
SSL_VERSION=1.2
WALLET_LOCATION=(SOURCE=(METHOD=File)(METHOD_DATA=(DIRECTORY=/opt/oracle/dcs/commonstore/wallets/DB23c_rwc_nrt/02616F7B5BE15F03E063E700000A4BF9/tls)))
4. listener.oraファイルの修正
gridユーザーに切り替えて、sqlnet.oraファイルに追記した3行をlistener.oraファイルにも追記します。
また、LISTENERの定義情報を以下のように修正します
$sudo su - grid
$vi /u01/app/23.0.0/grid/network/admin
#以下3行を追記
SSL_CLIENT_AUTHENTICATION=FALSE
SSL_VERSION=1.2
WALLET_LOCATION=(SOURCE=(METHOD=File)(METHOD_DATA=(DIRECTORY=/opt/oracle/dcs/commonstore/wallets/DB23c_rwc_nrt/02616F7B5BE15F03E063E700000A4BF9/tls)))
# LISTNERの定義情報を以下のように修正
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCPS)(HOST = <Base DatabaseのプライベートIP>)(PORT = 1522))
(ADDRESS = (PROTOCOL = IPC)(KEY = LISTENER))
(ADDRESS = (PROTOCOL = TcP)(HOST = <Base DatabaseのプライベートIP>)(PORT = 1521))
)
)
5.リスナーの再起動
gridユーザーでリスナーを再起動します。
$lsnrctl stop
$lsnrctl start
6. Databaseの再起動
続いてDatabaseを再起動します。
SQL> shutdown immediate
SQL> startup
7. iptablesの設定
Base Databaseはiptablesの機能を使用してパケットフィルタリングされています。
デフォルトでポート1521は許可されていますが、ポート1522は許可されていないので、iptablesの設定を変更してクライアントからポート1522を使用してBase Databaseにアクセスができるようにします。
$sudo su -
$vi /etc/sysconfig/iptables
#以下1行を追記
-A INPUT -p tcp -m state --state NEW -m tcp --dport 1522 -j ACCEPT
$service iptables restart
$service iptables status
# ステータスがactiveになっていることを確認
Redirecting to /bin/systemctl status iptables.service
● iptables.service - IPv4 firewall with iptables
Loaded: loaded (/usr/lib/systemd/system/iptables.service; enabled; vendor preset: disabled)
Active: active(exited) since Sat 2023-08-26 22:39:57 UTC; 1 day 8h ago
Process: 1476 ExecStart=/usr/libexec/iptables/iptables.init start (code=exited, status=0/SUCCESS)
Main PID: 1476 (code=exited, status=0/SUCCESS)
Tasks: 0 (limit: 189387)
Memory: 0B
CGroup: /system.slice/iptables.service
8. クライアントの設定
以下OracleのサイトからLinux用のOracle Instant ClientのBasicパッケージ(RPM)とSQL*Plusパッケージ(RPM)それぞれバージョン19をダウンロードします。
ダウンロードしたRPMファイルをscpコマンドやWinSCPなどを用いて、Linuxのコンピュートにコピーし、インストールします。
$sudo yum install oracle-instantclient19.19-basic-19.19.0.0.0-1.x86_64.rpm
$sudo yum install oracle-instantclient19.19-sqlplus-19.19.0.0.0-1.x86_64.rpm
#TNS_ADMINの環境変数を設定します。
$export TNS_ADMIN=/usr/lib/oracle/19.19/client64/lib/network/admin
TNS_ADMINのディレクトリ配下にsqlnet.oraファイルとtnsnames.oraファイルを作成します。
$sudo vi /usr/lib/oracle/19.19/client64/lib/network/admin/sqlnet.ora
#以下2行を記入します。
SSL_CLIENT_AUTHENTICATION = FALSE
SSL_VERSION = 1.2
#Base Databaseへの接続情報を定義します。今回はBase Database側のtnsnames.oraファイルを同じ接続情報を記入します。
DB23C_RWC_NRT =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCPS)(HOST = 10.0.0.231)(PORT = 1522))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = DB23c_rwc_nrt.sub09140234280.vcntest.oraclevcn.com)
)
)
DB23C_PDB1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCPS)(HOST = 10.0.0.231)(PORT = 1522))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = db23c_pdb1.sub09140234280.vcntest.oraclevcn.com)
)
)
9. 証明書のインポート(クライアント)
クライアント側で以下コマンドを実行し、手順1で作成した証明書をクライアントにインポートします。
$openssl s_client -connect <Databaseのサービス名>:1522 2>/dev/null </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > tls.crt
例)
$openssl s_client -connect DB23c_rwc_nrt.sub09140234280.vcntest.oraclevcn.com:1522 2>/dev/null </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > tls.crt
$sudo cp tls.crt /etc/pki/ca-trust/source/anchors/
$sudo update-ca-trust
以上の手順でクライアント側の設定は完了です。
クライアントからSQL*PlusでPDBに接続できれば、設定は正しくできています。
$sqlplus <PBDのユーザー名>/<パスワード>@PDBの接続詞
SQL*Plus: Release 19.0.0.0.0 - Production on Wed Aug 23 04:12:46 2023
Version 19.19.0.0.0
Copyright (c) 1982, 2022, Oracle. All rights reserved.
Last Successful login time: Wed Aug 23 2023 02:07:27 +00:00
Connected to:
Oracle Database 23c EE High Perf Release 23.0.0.0.0 - Beta
Version 23.2.0.0.0
SQL>
以上でBase DatabaseにおけるTLSの構成の設定は完了です。
万が一PDBにクライアントから接続できなかった場合、VCNのセキュリティ・リストやNetwork Security Groupでポート1522の接続が許可されているかなどを見直してみてください。