Oracle Base DatabaseでTLS通信を有効化する

本記事では、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のディレクトリを確認します。

```ruby:SQL*Plus
$sqlplus / as sysdba
SQL> show parameter wallet_root;
/opt/oracle/dcs/commonstore/wallets/DB23c_rwc_nrt
```

以下SQLでPDBのGUID名を確認します。
```ruby:SQLPlus
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`で確認してください。
```ruby:/opt/oracle/dcs/commonstore/wallets/DB23c_rwc_nrt/<PDBのGUID名>/tls
$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で通信ができるように設定します。

```ruby:tnsnames.ora
#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行を追記します。
```ruby:sqlnet.ora
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ファイルに追記した３行をlistener.oraファイルにも追記します。
また、LISTENERの定義情報を以下のように修正します
```ruby:listener.ora
$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を再起動します。
```ruby:SQL*Plus
SQL> shutdown immediate
SQL> startup
```
# 7. iptablesの設定
Base Databaseはiptablesの機能を使用してパケットフィルタリングされています。
デフォルトでポート1521は許可されていますが、ポート1522は許可されていないので、iptablesの設定を変更してクライアントからポート1522を使用してBase Databaseにアクセスができるようにします。
```
$sudo su - 
$vi /etc/sysconfig/iptables
#以下１行を追記
-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）それぞれバージョン１９をダウンロードします。

https://www.oracle.com/jp/database/technologies/instant-client/linux-x86-64-downloads.html

ダウンロードした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ファイルを作成します。

```ruby:sqlnet.ora
$sudo vi /usr/lib/oracle/19.19/client64/lib/network/admin/sqlnet.ora
#以下2行を記入します。
SSL_CLIENT_AUTHENTICATION = FALSE
SSL_VERSION = 1.2
```

```ruby:tnsnames.ora
#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. 証明書のインポート（クライアント）
クライアント側で以下コマンドを実行し、手順１で作成した証明書をクライアントにインポートします。
```ruby:
$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の接続が許可されているかなどを見直してみてください。