LoginSignup
1
1

Oracle DatabaseのTLS暗号化を設定する

Last updated at Posted at 2024-02-01

Oracle Databaseのトークン・ベースの認証連携に必要なTLSで接続するためのデータベースとクライアントの設定方法について紹介します。
手順通りに進めれば間違いなく設定できるはずなので、OCIからBase Database 19cとDBに接続するためのVMをそれぞれ新たに作成することをお勧めします。

Base Database側の設定

  • 作成したBase Databaseで設定 (※2024年1月時点でのversionは19.21)
#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のサービス名)
    )
  )

#例
TESTDB_PDB1 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCPS)(HOST = testbase19c)(PORT = 1522))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = testdb_pdb1.sub01120452410.vcnaqua.oraclevcn.com)
    )
  )
#3.sqlnet.oraでネットワーク暗号化に関する以下の3つのパラメータをコメントアウトし、TLSに関する3つのパラメータを追加
#※ TLSは認証と暗号化を両方提供するため、ネットワークのネイティブ暗号とは併用できません。
$ vi $ORACLE_HOME/network/admin/sqlnet.ora  
#SQLNET.ENCRYPTION_SERVER=REQUIRED
#SQLNET.CRYPTO_CHECKSUM_SERVER=REQUIRED
#SQLNET.ENCRYPTION_CLIENT=REQUIRED
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:grid:rwx /home/oracle/
$ sudo setfacl -m u:grid:rwx /home/oracle/wallet
$ sudo setfacl -m u:grid:r /home/oracle/wallet/cwallet.sso
$ sudo setfacl -m u:grid:r /home/oracle/wallet/dbcert.crt
$ sudo setfacl -m u:grid:r /home/oracle/wallet/ewallet.p12

#5.gridユーザーで接続
#listener.oraファイルのLISTENERをコメントアウトして、以下を追記
$ vi /u01/app/19.0.0.0/grid/network/admin/listener.ora

#LISTENER=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER))))  
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))
    )
  )

#6.リスナー再起動、walletファイルのアクセスエラーが出ていなければOK
$ listener stop
$ listener start

#7.oracleユーザーにスイッチしてDB再起動
#リスナーがTCPS 1522でリスニングできていることを確認
$ lsnrctl status
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 19.0.0.0.0 - Production
Start Date                27-JAN-2024 14:01:09
Uptime                    0 days 0 hr. 4 min. 20 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u01/app/19.0.0.0/grid/network/admin/listener.ora
Listener Log File         /u01/app/grid/diag/tnslsnr/testbase19c/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=testbase19c.sub01120452410.vcnaqua.oraclevcn.com)(PORT=1522)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=testbase19c.sub01120452410.vcnaqua.oraclevcn.com)(PORT=1521)))

#8.iptablesでポート1522の通信を許可する
$ sudo vi /etc/sysconfig/iptables
#以下を追加
-A INPUT -p tcp -m state --state NEW -m tcp --dport 1522 -j ACCEPT  
#iptables再起動
$ sudo service iptables restart

#iptablesでポート1522のオープンを確認
$ sudo iptables -L | grep 1522
ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:1522

#9.opensslのコマンドで結果がサーバー証明書の結果が返ってくればOK
$ openssl s_client -connect ホスト名:1522

例)
$ openssl s_client -connect testbase19c.sub01120452410.vcnaqua.oraclevcn.com:1522
clevcn.com:1522
CONNECTED(00000003)
depth=0 CN = testbase19c
verify error:num=18:self signed certificate
verify return:1
depth=0 CN = testbase19c
verify return:1
---
Certificate chain
 0 s:CN = testbase19c
   i:CN = testbase19c
---
Server certificate
-----BEGIN CERTIFICATE-----
MIICrzCCAZcCEHDae05JQilcPoH/tVFwUCUwDQYJKoZIhvcNAQELBQAwFjEUMBIG
A1UEAxMLdGVzdGJhc2UxOWMwHhcNMjQwMTI3MTMzODAxWhcNMzQwMTI0MTMzODAx
WjAWMRQwEgYDVQQDEwt0ZXN0YmFzZTE5YzCCASIwDQYJKoZIhvcNAQEBBQADggEP

Oracle Client側の設定

  • Oracle Linux 8の1coreの最小のVMを作成
  • VMからBaseDBにアクセスできるようにOCIのセキュリティ・リストのイングレスルールにポート:1522を許可しておく
#opcで接続
#1.サーバー証明書をBaseDBから取り出しクライアント自身にインポートする
$ openssl s_client -connect ホスト名: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.19cの最新のInstance Clientをインストールする
$ wget https://download.oracle.com/otn_software/linux/instantclient/1920000/oracle-instantclient19.20-sqlplus-19.20.0.0.0-1.x86_64.rpm
$ wget https://download.oracle.com/otn_software/linux/instantclient/1920000/oracle-instantclient19.20-basic-19.20.0.0.0-1.x86_64.rpm
$ sudo yum install -y libnsl
$ sudo rpm -ivh oracle-instantclient19.20-basic-19.20.0.0.0-1.x86_64.rpm 
$ sudo rpm -ivh oracle-instantclient19.20-sqlplus-19.20.0.0.0-1.x86_64.rpm

#3.DB接続するためのOracle Net Serviceの設定
$ mkdir /home/opc/instant19c

#sqlnet.oraに以下2行を追記
$ vi /home/opc/instant19c/sqlnet.ora
SSL_CLIENT_AUTHENTICATION=FALSE
SSL_VERSION=1.2

#Database側で追加したTLSでPDBに接続する箇所をそのままコピーする
vi /home/opc/instant19c/tnsnames.ora
TESTDB_PDB1 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCPS)(HOST = testbase19c)(PORT = 1522))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = testdb_pdb1.sub01120452410.vcnaqua.oraclevcn.com)
    )
  )

#TNS_ADMINを環境変数に設定
$ export TNS_ADMIN=/home/opc/instant19c

#6.SQL*PLUSで接続できればOK
$ sqlplus system/***@TESTDB_PDB1

Connected to:
Oracle Database 19c EE High Perf Release 19.0.0.0.0 - Production
Version 19.21.0.0.0
SQL> 

今回は、クラウドのBase Databaseを用いましたが、19c以降のデータベースであればオンプレミス、クラウドに関わらず基本的に設定は同じです。Azure ADと認証連携する場合もオンプレミスのOracle DatabaseはTLSが設定されている必要があります。

これでTLSのデータベースが準備できたので、次は実際にOCI IAMとのトークン・ベースの認証連携の設定をしていきます。

1
1
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
1
1