TimesTenレプリケーションおよびTimesTen Client/Serverでは、TimesTenインスタンス間の通信にTransport Layer Security (TLS)の使用をサポートしています。
この章では、Kubernetes環境でTLSを構成して使用する際のプロセスについて説明します。これにより、レプリケートされたTimesTenデータベース間の暗号化されたデータ転送が可能になります。また、Client/Server環境では、TimesTenクライアント・アプリケーションとTimesTenサーバー(TimesTenデータベース)間のデータ転送も暗号化できます。
内容は次のとおりです。
デフォルトでは、TimesTenレプリケーションは、TimesTenデータベース間で暗号化されていないデータを転送します。また、TimesTen Client/Server環境では、デフォルトで、データはアプリケーションとTimesTenデータベース間で暗号化されずに転送されます。
レプリケーションおよびClient/Serverの暗号化は、Transport Layer Security (TLS)を使用することで有効化できます。TimesTenには、TLS用の自己署名証明書を生成するためのttCreateCertsユーティリティがあります。TLS証明書とウォレットの詳細は、『Oracle TimesTen In-Memory Databaseセキュリティ・ガイド』のTimesTenでの証明書の使用に関する項を参照してください。
| ノート: ttCertsCreateユーティリティを使用するには、JavaがLinux開発ホストにインストールされている必要があります。このユーティリティは、JRE_HOME、JAVA_HOMEおよびPATHの設定に従ってJavaを検索します。 | 
ttCreateCertsユーティリティは、TimesTenインスタンスの/binディレクトリ内にあります。このユーティリティにより、3つのウォレットrootWallet、clientWalletおよびserverWalletが作成されます。
Linux開発ホストから、次のステップを実行して証明書を作成します。
インストール環境のbinディレクトリに移動し、ttInstanceCreateユーティリティを対話形式で実行してインスタンスを作成します。installation_dirディレクトリは、TimesTenディストリビューションの解凍時に作成されたものです。TimesTenディストリビューションの解凍手順の詳細は、「TimesTenおよびTimesTenオペレータのダウンロード」を参照してください。
ttCreateCertsユーティリティはTimesTenインスタンスから実行されるため、TimesTenインスタンスを作成する必要があります。ttInstanceCreateユーティリティの詳細は、Oracle TimesTen In-Memory DatabaseリファレンスのttInstanceCreateを参照してください。
インスタンス・ディレクトリ(この例では/scratch/ttuser/instance_dir)を作成し、パラメータの-nameと-locationを指定してttInstanceCreateユーティリティを実行します。この例では、インスタンスの名前としてinstance1を使用し、インスタンスの場所として/scratch/ttuser/instance_dirを使用します。
% mkdir /scratch/ttuser/instance_dir %installation_dir/tt18.1.4.11.0/bin/ttInstanceCreate -name instance1 -location /scratch/ttuser/instance_dir Creating instance in /scratch/ttuser/instance_dir/instance1 ... INFO: Mapping files from the installation to /scratch/ttuser/ instance_dir/instance1/install NOTE: The TimesTen daemon startup/shutdown scripts have not been installed. The startup script is located here : '/scratch/ttuser/instance_dir/instance1/startup/tt_instance1' Run the 'setuproot' script : /scratch/ttuser/instance_dir/instance1/bin/setuproot -install This will move the TimesTen startup script into its appropriate location. The 18.1 Release Notes are located here : 'installation_dir/tt18.1.4.11.0/README.html'
TIMESTEN_HOME環境変数を設定します。この変数は、ttCertsCreateユーティリティの実行前に設定する必要があります。インスタンスのbinディレクトリから、ttenv.cshまたはttenv.shスクリプトを実行します。
この例では、bash Bourneタイプのシェルを使用します。(出力のすべては示していません)。
% . /scratch/ttuser/instance_dir/instance1/bin/ttenv.sh LD_LIBRARY_PATH set to ... PATH set to ... CLASSPATH set to TIMESTEN_HOME set to /scratch/ttuser/instance_dir/instance1
インスタンスのbinディレクトリから、ttCreateCertsユーティリティを実行します。この例では、-verbose修飾子を使用することで詳細な出力を表示します。ttCreateCertsユーティリティの詳細は、『Oracle TimesTen In-Memory Databaseセキュリティ・ガイド』のTimesTen用の証明書の生成に関する項を参照してください。
デフォルトのウォレット・ディレクトリは、timesten_home/confです。このtimesten_homeは、TimesTenインスタンスのホーム・ディレクトリです。この例では、このデフォルトのウォレット・ディレクトリを使用します。
% /scratch/ttuser/instance_dir/instance1/bin/ttCreateCerts -verbose Requested Certificates: User Certificates: Subject: CN=server1,C=US Trusted Certificates: Subject: CN=ecRoot,C=US Requested Certificates: User Certificates: Subject: CN=client1,C=US Trusted Certificates: Subject: CN=ecRoot,C=US ttCreateCerts : certificates created in /scratch/ttuser/instance_dir/ instance1/conf
ウォレットの場所と証明書(太字で表示)を確認します。serverWalletディレクトリ内のcwallet.ssoは、replicationWalletメタデータ・ファイルとしてレプリケーション用およびClient/Server環境のサーバー用に指定するファイルです。clientWalletディレクトリのcwallet.ssoは、Client/Server環境のクライアント用に使用するファイルです。replicationWalletおよびclientWalletメタデータ・ファイルの詳細は、「サポートされているメタデータ・ファイル」を参照してください。これらのメタデータ・ファイルの使用方法の詳細は、「レプリケーション用のTLSの構成」および「Client/Server用のTLSの構成」も参照してください。
(該当するcwallet.ssoファイルについても、太字で表示しています)。
% ls $TIMESTEN_HOME/conf client1.cert root.cert server1.cert snmp.ini sys.ttconnect.ini clientWallet rootWallet serverWallet sys.odbc.ini timesten.conf % ls $TIMESTEN_HOME/conf/*Wallet* /scratch/ttuser/instance_dir/instance1/conf/clientWallet: cwallet.sso cwallet.sso.lck /scratch/ttuser/instance_dir/instance1/conf/rootWallet: cwallet.sso cwallet.sso.lck /scratch/ttuser/instance_dir/instance1/conf/serverWallet: cwallet.sso cwallet.sso.lck
レプリケーションとTimesTen Client/Serverの両方でTLSに使用できる証明書の作成が完了しました。この時点で、レプリケーションとClient/Serverのどちらかに、またはレプリケーションとClient/Serverの両方に、TLSを構成して使用する準備が整いました。
レプリケーション用のTLSを構成すると、レプリケートされたTimesTenデータベース間でセキュアなネットワーク通信を確保できます。詳細は、『Oracle TimesTen In-Memory Databaseセキュリティ・ガイド』のTimesTenレプリケーションのTransport Layer Securityに関する項を参照してください。
次の項では、レプリケーション用のTLSを構成して使用する方法について説明します。
レプリケーションのTLSサポートには、/ttconfig/replicationWalletメタデータ・ファイルが必要です。(/ttconfigディレクトリは、TimesTenデータベースのコンテナ内にあります)。このファイルには、TLS証明書の作成時に生成されたcwallet.ssoファイル(Oracleウォレット)が含まれている必要があります。このファイルは、/scratch/ttuser/instance_dir/instance1/conf/serverWalletディレクトリに配置したものです。該当する証明書の作成方法は、「レプリケーションおよびClient/Server用のTLS証明書の作成」を参照してください。このウォレットには、TimesTenデータベースのアクティブ・スタンバイ・ペア間でTLS暗号化を構成するためにTimesTenレプリケーションで使用される資格証明が含まれています。
/ttconfig/replicationWalletメタデータ・ファイルに加えて、その他のサポートされているメタデータ・ファイルも使用できます。サポートされるメタデータ・ファイルの詳細は、「サポートされるメタデータ・ファイル」を参照してください。
これらのメタデータ・ファイルは、Kubernetesの1つ以上の機能(たとえば、Kubernetes Secret、ConfigMapまたは初期化コンテナ)に含めることができます。これにより、メタデータ・ファイルがTimesTenコンテナの/ttconfigディレクトリに確実に移入されます。この/ttconfigディレクトリにメタデータ・ファイルを配置する方法についての要件はありません。詳細は、「/ttconfigディレクトリの移入」を参照してください。
次の各項の例では、replicationWalletメタデータ・ファイルをKubernetes Secretに含める方法を示します。また、db.ini、adminUserおよびschema.sqlメタデータ・ファイルを作成して、それらのメタデータ・ファイルをConfigMapに含めます。
この項では、repl-tls Kubernetes Secretを作成します。repl-tls Secretには、replicationWalletメタデータ・ファイルを格納します。
Linux開発ホストで、次のことを実行します。
任意のディレクトリから、空のサブディレクトリを作成します。この例では、serverWalletサブディレクトリを作成します。(今後、この例では、このディレクトリを表す場合にserverWalletディレクトリを使用します)。
% mkdir -p serverWallet
前の手順で作成したserverWalletディレクトリに、/scratch/ttuser/instance_dir/instance1/conf/serverWallet/cwallet.ssoファイルをコピーします。このファイルは、ttCreateCertsユーティリティを使用してTLS証明書を作成したときに生成されたものです。詳細は、「レプリケーションおよびClient/Server用のTLS証明書の作成」を参照してください。
% cp /scratch/ttuser/instance_dir/instance1/conf/serverWallet/cwallet.sso serverWallet/cwallet.sso
Kubernetes Secretの作成
この例では次のとおりです。
Secretの名前はrepl-tlsです。repl-tlsは適宜の名前に置き換えます(repl-tlsは太字で表示しています)。
TLSレプリケーション用に必要なメタデータ・ファイルの名前は、replicationWallet (太字で表示)です。
ウォレット・ディレクトリの場所は、serverWalletです(この例では、太字で表示しています)。別のディレクトリを使用する場合、serverWalletは使用するディレクトリの名前に置き換えます。
Oracleウォレットの名前は、cwallet.ssoです(太字で表示)。
kubectl createコマンドを使用してシークレットを作成します。
% kubectl create secret generic repl-tls --from-file=replicationWallet=serverWallet/cwallet.sso secret/repl-tls created
repl-tls Kubernetes Secretの作成とデプロイが完了しました。この後、replicationWallet/cwallet.ssoファイルは、TimesTenコンテナの/ttconfigディレクトリから使用できるようにします。また、ファイルはTimesTenコンテナの/tt/home/oracle/replicationWalletディレクトリから使用できるようにします。
この項では、repl-tls ConfigMapを作成します。このConfigMapには、db.ini、adminUserおよびschema.sqlメタデータ・ファイルが含まれます。
こうしたメタデータ・ファイルはTLSには不要ですが、TimesTenデータベースの追加属性として含まれています。構成ファイルとConfigMap機能の詳細は、「構成メタデータとKubernetes機能の理解」を参照してください。
Linux開発ホストで、次のことを実行します。
選択したディレクトリから、メタデータ・ファイル用に空のサブディレクトリを作成します。この例では、cm_replTLSサブディレクトリを作成します。(今後、この例では、このディレクトリを表す場合にcm_replTLSディレクトリを使用します)。
% mkdir -p cm_replTLS
ConfigMapディレクトリに移動します。
% cd cm_replTLS
このConfigMapディレクトリ(この例ではcm_replTLS)に、db.iniファイルを作成します。このdb.iniファイルで、PermSize接続属性とDatabaseCharacterSet接続属性を定義します。
vi db.ini
PermSize=200 DatabaseCharacterSet=AL32UTF8
このConfigMapディレクトリ(この例ではcm_replTLS)に、adminUserファイルを作成します。このadminUserファイルで、tigerパスワードを使用してscottユーザーを作成します。
vi adminUser
scott/tiger
このConfigMapディレクトリ(この例ではcm_replTLS)に、schema.sqlファイルを作成します。このschema.sqlファイルで、scottユーザーのs順序とemp表を定義します。オペレータはこれらのオブジェクト定義でデータベースを自動的に初期化します。
vi schema.sql
create sequence scott.s; create table scott.emp ( id number not null primary key, name char(32) );
ConfigMapを作成します。cm_replTLSディレクトリ内のファイルは、ConfigMapに含めておくことで、TimesTenコンテナで使用できるようにします。
この例では次のとおりです。
ConfigMapの名前はrepl-tlsです。repl-tlsは適宜の名前に置き換えます(この例では、repl-tlsは太字で表示しています)。
この例では、ConfigMapにコピーするファイルが存在しているディレクトリとしてcm_replTLSを使用しています。別のディレクトリを使用する場合、cm_replTLSは目的のディレクトリの名前に置き換えます(この例では、cm_replTLSは太字で表示しています)。
kubectl createコマンドを使用して、ConfigMapを作成します。
% kubectl create configmap repl-tls --from-file=cm_replTLS configmap/repl-tls created
kubectl describeコマンドを使用して、ConfigMap (この例ではrepl-tls)の内容を確認します。
% kubectl describe configmap repl-tls Name: repl-tls Namespace: mynamespace Labels: <none> Annotations: <none> Data ==== adminUser: ---- scott/tiger db.ini: ---- PermSize=200 DatabaseCharacterSet=AL32UTF8 schema.sql: ---- create sequence scott.s; create table scott.emp (id number not null primary key, name char (32)); Events: <none>
repl-tls ConfigMapの作成とデプロイが完了しました。
この項では、TimesTenClassicオブジェクトを作成します。TimesTenClassicオブジェクトの詳細は、TimesTenClassicオブジェクトの定義および作成およびTimesTenClassicオブジェクト・タイプを参照してください。
次のステップを実行します。
空のYAMLファイルを作成します。任意の名前を選択できますが、TimesTenClassicオブジェクトに使用した名前と同じ名前を使用することもできます。(この例では、repltls)。YAMLファイルには、TimesTenClassicオブジェクトの定義が格納されています。このYAMLファイルで指定する必要があるフィールド、およびオプションのフィールドの詳細は、TimesTenClassicSpecSpecを参照してください。
この例では、TLSレプリケーションにとって特に重要なフィールドは次のとおりです。
dbSecret: この例では、replicationWalletメタデータ・ファイルに対してrepl-tlsという1つのKubernetes Secretを使用します。
replicationCipherSuite: このフィールドは、レプリケーション用のTLSに必須です。この例では、値はSSL_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256です。詳細は、『Oracle TimesTen In-Memory Databaseセキュリティ・ガイド』のレプリケーション用のTLSの構成に関する項およびこのマニュアルの表11-3「TimesTenClassicSpecSpec」のreplicationCipherSuiteエントリを参照してください。
replicationSSLMandatory: このフィールドはオプションです。この例では、replicationSSLMandatoryを1に設定します。詳細は、『Oracle TimesTen In-Memory Databaseセキュリティ・ガイド』のレプリケーション用のTLSの構成に関する項およびこのマニュアルの表11-3「TimesTenClassicSpecSpec」のreplicationSSLMandatoryエントリを参照してください。
この例には次の項目も含まれます。
name: repltlsはTimesTenClassicオブジェクトの名前に置き換えます。
storageClassName: ociを、TimesTenを保持するためのPersistentVolumesの割当てに使用される記憶域クラスの名前に置き換えます。
storageSize: 250Gを、各ポッドがTimesTenを保持するために要求する必要がある記憶域の量に置き換えます。ノート: この例では、本番環境を想定していることから、storageSizeには250Gの値を使用しています。デモ用の場合は、50Gの値で対応できます。詳細は、表11-3「TimesTenClassicSpecSpec」のstorageSizeエントリとlogStorageSizeエントリを参照してください。
image: phx.ocir.io/youraccount/tt1814110:3は、イメージ・レジストリの場所(phx.ocir.io/youraccount)とTimesTenが含まれているイメージ(tt1814110:3)に置き換えます。
imagePullSecret: sekretを、KubernetesがTimesTenイメージをフェッチするために使用するイメージ・プル・シークレットに置き換えます。
dbConfigMap: この例では、db.ini、adminUserおよびschema.sqlメタデータ・ファイルに対して1つのConfigMap (名前はrepl-tls)を使用します。
% vi repltls.yaml apiVersion: timesten.oracle.com/v1 kind: TimesTenClassic metadata: name: repltls spec: ttspec: storageClassName: oci storageSize: 250G image: phx.ocir.io/youraccount/tt1814110:3 imagePullSecret: sekret imagePullPolicy: Always dbConfigMap: - repl-tls dbSecret: - repl-tls replicationCipherSuite: SSL_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 replicationSSLMandatory: 1
kubectl createコマンドを使用して、YAMLファイル(この例ではrepltls.yaml)の内容からTimesTenClassicオブジェクトを作成します。これにより、KubernetesクラスタにあるTimesTenデータベースのアクティブ・スタンバイ・ペアをデプロイするプロセスが開始されます。
% kubectl create -f repltls.yaml timestenclassic.timesten.oracle.com/repltls created
KubernetesクラスタにTimesTenClassicオブジェクトを正常に作成しました。TimesTenデータベースをデプロイするプロセスが開始されますが、まだ完了していません。
kubectl getコマンドとkubectl describeコマンドを使用して、プロビジョニング時にアクティブ・スタンバイ・ペアの進捗状況を監視します。
kubectl getコマンドを使用して、STATEフィールドを確認します。値がInitializingであることを確認します。アクティブ・スタンバイ・ペアのプロビジョニングが開始しましたが、まだ完了していません。
% kubectl get ttc repltls NAME STATE ACTIVE AGE repltls Initializing None 50s
kubectl getコマンドを再度使用して、STATEフィールドの値が変更されているかどうかを確認します。この例では、この値はNormalで、データベースのアクティブ・スタンバイ・ペアがプロビジョニングされ、プロセスが完了したことを示しています。
% kubectl get ttc repltls NAME STATE ACTIVE AGE repltls Normal repltls-0 3m45s
kubectl describeコマンドを使用して、アクティブ・スタンバイ・ペアのプロビジョニングを詳細に表示します。
repltls TimesTenClassicオブジェクト定義では、次の項目が正しく設定されていることに注目してください。
repl-tls Secretは、dbSecretフィールドで正しく参照されています(太字で表示)。
repl-tls Configmapは、dbConfigMapフィールドで正しく参照されています(太字で表示)。
replicationCipherSuiteフィールドは、SSL_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256に正しく設定されています(太字で表示)。
replicationSSLMandatoryフィールドは、1に正しく設定されています(太字で表示)。
ノート: この例は出力の一部を示しています。
% kubectl describe ttc repltls
Name:         repltls
Namespace:    mynamespace
Labels:       <none>
Annotations:  <none>
API Version:  timesten.oracle.com/v1
Kind:         TimesTenClassic
Metadata:
  Creation Timestamp:  2020-10-16T18:51:43Z
  Generation:          1
  Resource Version:    75029797
  Self Link: 
/apis/timesten.oracle.com/v1/namespaces/mynamespace/timestenclassics/repltls
  UID:                 a2915ef3-0fe0-11eb-8b9a-aaa0151611fe
Spec:
  Ttspec:
    Db Config Map:
      repl-tls
    Db Secret:
      repl-tls
    Image:                      phx.ocir.io/youraccount/tt1814110:3
    Image Pull Policy:          Always
    Image Pull Secret:          sekret
    Replication Cipher Suite:   SSL_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
    Replication SSL Mandatory:  1
    Storage Class Name:         oci
    Storage Size:               250G
...
Events:
  Type  Reason       Age    From       Message
  ----  ------       ----   ----       -------
  -     Create       4m17s  ttclassic  Secret 
 tta2915ef3-0fe0-11eb-8b9a-aaa0151611fe created
  -     Create       4m17s  ttclassic  Service repltls created
  -     Create       4m17s  ttclassic  StatefulSet repltls created
  -     StateChange  3m10s  ttclassic  Pod repltls-1 Agent Up
  -     StateChange  3m10s  ttclassic  Pod repltls-1 Release 18.1.4.11.0
  -     StateChange  3m10s  ttclassic  Pod repltls-1 Daemon Up
  -     StateChange  2m3s   ttclassic  Pod repltls-0 Agent Up
  -     StateChange  2m3s   ttclassic  Pod repltls-0 Release 18.1.4.11.0
  -     StateChange  2m1s   ttclassic  Pod repltls-0 Daemon Up
  -     StateChange  68s    ttclassic  Pod repltls-0 Database Loaded
  -     StateChange  68s    ttclassic  Pod repltls-0 Database Updatable
  -     StateChange  68s    ttclassic  Pod repltls-0 CacheAgent Not Running
  -     StateChange  68s    ttclassic  Pod repltls-0 RepAgent Not Running
  -     StateChange  67s    ttclassic  Pod repltls-0 RepState IDLE
  -     StateChange  67s    ttclassic  Pod repltls-0 RepScheme None
  -     StateChange  66s    ttclassic  Pod repltls-0 RepAgent Running
  -     StateChange  66s    ttclassic  Pod repltls-0 RepScheme Exists
  -     StateChange  66s    ttclassic  Pod repltls-0 RepState ACTIVE
  -     StateChange  47s    ttclassic  Pod repltls-1 Database Loaded
  -     StateChange  47s    ttclassic  Pod repltls-1 Database Not Updatable
  -     StateChange  47s    ttclassic  Pod repltls-1 CacheAgent Not Running
  -     StateChange  47s    ttclassic  Pod repltls-1 RepAgent Not Running
  -     StateChange  47s    ttclassic  Pod repltls-1 RepScheme Exists
  -     StateChange  47s    ttclassic  Pod repltls-1 RepState IDLE
  -     StateChange  41s    ttclassic  Pod repltls-1 RepAgent Running
  -     StateChange  36s    ttclassic  Pod repltls-1 RepState STANDBY
  -     StateChange  36s    ttclassic  TimesTenClassic was Initializing, 
now Normal
TimesTenデータベースのアクティブ・スタンバイ・ペアが(Normalで示されているように)正常にデプロイされました。レプリケーションにTLSが使用されていることを確認する準備が整いました。
レプリケーションにTLSが使用されていることを確認するには、次のステップを実行します。
アクティブ・ポッド(この例ではrepltls-0)とスタンバイ・ポッド(この例ではrepltls-1)を確認します。
% kubectl get pods NAME READY STATUS RESTARTS AGE repltls-0 2/2 Running 0 6m35s repltls-1 2/2 Running 0 6m34s timestenclassic-operator-f84766548-tch7s 1/1 Running 0 28d
オプション: kubectl exec -itコマンドを使用して、アクティブ・ポッド(この例ではrepltls-0)のシェルを呼び出します。
% kubectl exec -it repltls-0 -c tt -- /usr/bin/su - oracle
オプション: アクティブ・ポッドのシェルから、cwallet.ssoファイルが/tt/home/oracle/replicationWalletディレクトリにあることを確認します。
% ls /tt/home/oracle/replicationWallet cwallet.sso
オプション: アクティブ・ポッドのシェルから、TLSレプリケーション固有の値がtimesten.conf構成ファイルで正しく指定されていることを確認します。(このファイルは、/tt/home/oracle/instances/instance1/confディレクトリにあります)。
特に、次の点に注目してください。
replication_walletは、/tt/home/oracle/replicationWalletに正しく設定されています(太字で表示)。
replication_cipher_suiteは、SSL_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256に正しく設定されています(太字で表示)。
replication_ssl_mandatoryは、1に正しく設定されています(太字で表示)。
こうしたtimesten.confの属性の詳細は、『Oracle TimesTen In-Memory Databaseセキュリティ・ガイド』のレプリケーション用のTLSの構成に関する項を参照してください。
% cat /tt/home/oracle/instances/instance1/conf/timesten.conf admin_uid=333 admin_user=oracle daemon_port=6624 group_name=oracle hostname=repltls-0 instance_guid=48AC5964-56A1-4C66-AB89-5646A2431EA3 instance_name=instance1 replication_cipher_suite=SSL_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 replication_ssl_mandatory=1 replication_wallet=/tt/home/oracle/replicationWallet server_port=6625 show_date=1 timesten_release=18.1.4 tns_admin=/ttconfig verbose=1
アクティブ・ポッドのシェルから、-showstatus -detailオプションを指定してttRepAdminユーティリティを実行し、レプリケーション・エージェントの送信側と受信側がTLSを使用していることを確認します(太字のSSLで示されています)。このユーティリティの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttRepAdminに関する項を参照してください。
ノート: この例は、出力の一部を示しています。
% ttRepAdmin -showstatus -detail repltls Replication Agent Status as of: 2020-10-16 19:01:55 DSN : repltls ... TRANSMITTER thread(s) (TRANSMITTER(M):139870727366400): For : REPLTLS (track 0) (SSL) Start/Restart count : 1 Current state : STATE_META_PEER_INFO RECEIVER thread(s) (RECEIVER:139870719887104): For : REPLTLS (track 0) (SSL) Start/Restart count : 1 Current state : STATE_RCVR_READ_NETWORK_LOOP ...
レプリケーション用のTLSが使用されていることの検証が完了しました。
Client/Server用のTLSを構成すると、TimesTenのクライアントとサーバーの間でセキュアなネットワーク通信を確保できます。詳細は、『Oracle TimesTen In-Memory Databaseセキュリティ・ガイド』のTimesTen Client/Server用のTransport Layer Securityに関する項を参照してください。
Client/Server用のTLSを使用する場合は、サーバー側とクライアント側の両方に構成要件があります。次の各項では、それらの要件について説明します。
次の各セクションでは、サーバーの構成要件について説明します。各項では、Kubernetesクラスタ内のサーバー用のTLSを構成する方法の例も示します。
Client/ServerのTLSサポートには、/ttconfig/csWalletメタデータ・ファイルが必要です。(/ttconfigディレクトリは、TimesTenデータベースのコンテナ内にあります)。このファイルには、TLS証明書の作成時に生成されたcwallet.ssoファイル(Oracleウォレット)が含まれている必要があります。このファイルは、サーバーに必要なOracleウォレットです。このファイルは、/scratch/ttuser/instance_dir/instance1/conf/serverWalletディレクトリに配置したものです。該当する証明書の作成方法は、「レプリケーションおよびClient/Server用のTLS証明書の作成」を参照してください。このウォレットには、TimesTenデータベースとClient/Serverアプリケーションの間のTLS暗号化を構成するために使用される資格証明を格納します。
さらに、サーバー側の接続属性も設定する必要があります。こうした属性は、db.iniメタデータ・ファイルで定義できます。TimesTenコンテナの/ttconfigディレクトリにdb.iniファイルを配置した後で、オペレータはdb.iniファイルの内容をTimesTenコンテナに配置されたtimesten_home/conf/sys.odbc.iniファイルにコピーします。(timesten_homeは、TimesTenインスタンス・ディレクトリです。このインスタンス・ディレクトリは、TimesTenコンテナ内の/tt/home/oracle/instances/instance1です)。
必須のサーバー側属性は、Wallet、CipherSuitesおよびEncryptionです。これらの属性の詳細は、「サーバー側属性用のConfigMapの作成」を参照してください。『Oracle TimesTen In-Memory Databaseセキュリティ・ガイド』のサーバーの構成に関する項も参照してください。
csWalletとdb.iniメタデータ・ファイルに加えて、その他のサポートされているメタデータ・ファイルを使用することもできます。サポートされるメタデータ・ファイルの詳細は、「サポートされるメタデータ・ファイル」を参照してください。
これらのメタデータ・ファイルは、Kubernetesの1つ以上の機能(たとえば、Kubernetes Secret、ConfigMapまたは初期化コンテナ)に含めることができます。これにより、メタデータ・ファイルがTimesTenコンテナの/ttconfigディレクトリに確実に移入されます。この/ttconfigディレクトリにメタデータ・ファイルを配置する方法についての要件はありません。詳細は、「/ttconfigディレクトリの移入」を参照してください。
次の例では、Kubernetes SecretにcsWalletメタデータ・ファイルを含めます。また、db.ini、adminUserおよびschema.sqlメタデータ・ファイルを作成して、それらのメタデータ・ファイルをConfigMapに含めます。
この項では、cs-tls Kubernetes Secretを作成します。cs-tls Secretには、csWalletメタデータ・ファイルを格納します。
Linux開発ホストで、次のことを実行します。
任意のディレクトリから、空のサブディレクトリを作成します。この例では、serverWalletサブディレクトリを作成します。(今後、この例では、このディレクトリを表す場合にserverWalletディレクトリを使用します)。
% mkdir -p serverWallet
前の手順で作成したserverWalletディレクトリに、cwallet.ssoファイルをコピーします。cwallet.ssoファイルは、ttCreateCertsユーティリティを使用してTLS証明書を作成したときに生成されたものです。また、このファイルは、/scratch/ttuser/instance_dir/instance1/conf/serverWalletディレクトリに配置しました。詳細は、「レプリケーションおよびClient/Server用のTLS証明書の作成」を参照してください。
% cp /scratch/ttuser/instance_dir/instance1/conf/serverWallet/cwallet.sso serverWallet/cwallet.sso
Kubernetes Secretの作成
この例では次のとおりです。
Secretの名前はcs-tlsです。cs-tlsは適宜の名前に置き換えます(cs-tlsは太字で表示しています)。
Client/Server用のTLSに必要なメタデータ・ファイルの名前は、csWallet (太字で表示)です。
ウォレット・ディレクトリの場所は、serverWalletです(この例では、太字で表示しています)。別のディレクトリを使用する場合、serverWalletは使用するディレクトリの名前に置き換えます。
Oracleウォレットの名前: cwallet.sso (太字で表示)。
kubectl createコマンドを使用してシークレットを作成します。
% kubectl create secret generic cs-tls --from-file=csWallet=serverWallet/cwallet.sso secret/cs-tls created
cs-tls Kubernetes Secretの作成とデプロイが完了しました。この後、csWallet/cwallet.ssoファイルは、TimesTenコンテナの/ttconfigディレクトリから使用できるようにします。また、ファイルはTimesTenコンテナの/tt/home/oracle/csWalletディレクトリから使用できるようにします。
この項では、cs-tls ConfigMapを作成します。このConfigMapには、db.ini、adminUserおよびschema.sqlメタデータ・ファイルが含まれます。
Linux開発ホストで、次のことを実行します。
選択したディレクトリから、メタデータ・ファイル用に空のサブディレクトリを作成します。この例では、cm_csTLSサブディレクトリを作成します。(今後、この例では、このディレクトリを表す場合にcm_csTLSディレクトリを使用します)。
% mkdir -p cm_csTLS
ConfigMapディレクトリに移動します。
% cd cm_csTLS
このConfigMapディレクトリ(この例ではcm_csTLS)にdb.iniファイルを作成します。このdb.iniファイルでは、Client/Server用のTLSのサーバー側属性を定義します。そうしたサーバー側属性は、TimesTenコンテナのtimesten_home/confディレクトリにあるsys.odbc.iniファイルに含めることになります。(timesten_homeは、TimesTenインスタンス・ディレクトリです。このインスタンス・ディレクトリは、TimesTenコンテナ内のtt/home/oracle/instances/instance1です)。
Client/Server用のTLSに必要なサーバー側属性は次のとおりです。
wallet:サーバー・ウォレットを格納するTimesTenコンテナ内のディレクトリです。/tt/home/oracle/csWalletを指定します。
ciphersuites: 暗号スイートの設定です。有効な値は、SSL_ECDHE_ECDSA_WITH_AES_128_GCM_256またはSSL_ECDHE_ECDSA_WITH_AES_256_GCM_384です。または、その両方をカンマで区切って優先する順に並べます。デフォルト設定はありません。TLSを使用する場合は、サーバーとクライアントの設定に1つ以上の共通スイートが含まれている必要があります。この例では、SSL_ECDHE_ECDSA_WITH_AES_128_GCM_256を指定します。暗号スイートの設定の詳細は、『Oracle TimesTen In-Memory Databaseセキュリティ・ガイド』のサーバーの構成に関する項を参照してください。
encryption: サーバーの暗号化設定です。この例では、requiredの設定を指定します。有効な暗号化設定の詳細は、『Oracle TimesTen In-Memory Databaseセキュリティ・ガイド』のサーバーの構成に関する項を参照してください。
この例では、PermSizeとDatabaseCharacterSetの接続属性も指定します。
vi db.ini
PermSize=200 DatabaseCharacterSet=AL32UTF8 wallet=/tt/home/oracle/csWallet ciphersuites=SSL_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 encryption=required
このConfigMapディレクトリ(この例ではcm_csTLS)にadminUserファイルを作成します。このadminUserファイルで、tigerパスワードを使用してscottユーザーを作成します。
vi adminUser
scott/tiger
このConfigMapディレクトリ(この例ではcm_csTLS)にschema.sqlファイルを作成します。このschema.sqlファイルで、scottユーザーのs順序とemp表を定義します。オペレータはこれらのオブジェクト定義でデータベースを自動的に初期化します。
vi schema.sql
create sequence scott.s; create table scott.emp ( id number not null primary key, name char(32) );
ConfigMapを作成します。cm_csTLSディレクトリ内のファイルは、ConfigMapに含めておくことで、TimesTenコンテナで使用できるようにします。
この例では次のとおりです。
ConfigMapの名前はcs-tlsです。cs-tlsは適宜の名前に置き換えます(この例では、cs-tlsは太字で表示しています)。
この例では、ConfigMapにコピーするファイルが存在しているディレクトリとしてcm_csTLSを使用しています。別のディレクトリを使用する場合、cm_csTLSは目的のディレクトリの名前に置き換えます(この例では、cm_csTLSは太字で表示しています)。
kubectl createコマンドを使用して、ConfigMapを作成します。
% kubectl create configmap cs-tls --from-file=cm_csTLS configmap/cs-tls created
kubectl describeコマンドを使用して、ConfigMap (この例ではcs-tls)の内容を確認します。
% kubectl describe configmap cs-tls Name: cs-tls Namespace: mynamespace Labels: <none> Annotations: <none> Data ==== db.ini: ---- PermSize=200 DatabaseCharacterSet=AL32UTF8 wallet=/tt/home/oracle/csWallet ciphersuites=SSL_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 encryption=required schema.sql: ---- create sequence scott.s; create table scott.emp (id number not null primary key, name char (32)); adminUser: ---- scott/tiger Events: <none>
cs-tls ConfigMapの作成とデプロイが完了しました。
この項では、TimesTenClassicオブジェクトを作成します。TimesTenClassicオブジェクトの詳細は、TimesTenClassicオブジェクトの定義および作成およびTimesTenClassicオブジェクト・タイプを参照してください。
次のステップを実行します。
空のYAMLファイルを作成します。任意の名前を選択できますが、TimesTenClassicオブジェクトに使用した名前と同じ名前を使用することもできます。(この例では、cstls)。YAMLファイルには、TimesTenClassicオブジェクトの定義が格納されています。このYAMLファイルで指定する必要があるフィールド、およびオプションのフィールドの詳細は、TimesTenClassicSpecSpecを参照してください。
この例では、TLS Client/Serverにとって特に重要なフィールドは次のとおりです。
dbSecret: この例では、csWalletメタデータ・ファイルに対してcs-tlsという1つのKubernetes Secretを使用します。
dbConfigMap: この例では、cs-tlsという1つのConfigMapを使用します。db.iniファイルは、cs-tls ConfigMapに含まれます。前に説明したように、db.iniファイルには、Client/Server用のTLSのサーバー側属性が含まれています。
この例には次の項目も含まれます。
name: cstlsはTimesTenClassicオブジェクトの名前に置き換えます。
storageClassName: ociを、TimesTenを保持するためのPersistentVolumesの割当てに使用される記憶域クラスの名前に置き換えます。
storageSize: 250Gを、各ポッドがTimesTenを保持するために要求する必要がある記憶域の量に置き換えます。ノート: この例では、本番環境を想定していることから、storageSizeには250Gの値を使用しています。デモ用の場合は、50Gの値で対応できます。詳細は、表11-3「TimesTenClassicSpecSpec」のstorageSizeエントリとlogStorageSizeエントリを参照してください。
image: phx.ocir.io/youraccount/tt1814110:3は、イメージ・レジストリの場所(phx.ocir.io/youraccount)とTimesTenが含まれているイメージ(tt1814110:3)に置き換えます。
imagePullSecret: sekretを、KubernetesがTimesTenイメージをフェッチするために使用するイメージ・プル・シークレットに置き換えます。
% vi cstls.yaml apiVersion: timesten.oracle.com/v1 kind: TimesTenClassic metadata: name: cstls spec: ttspec: storageClassName: oci storageSize: 250G image: phx.ocir.io/youraccount/tt1814110:3 imagePullSecret: sekret imagePullPolicy: Always dbConfigMap: - cs-tls dbSecret: - cs-tls
kubectl createコマンドを使用して、YAMLファイル(この例ではcstls.yaml)の内容からTimesTenClassicオブジェクトを作成します。これにより、KubernetesクラスタにあるTimesTenデータベースのアクティブ・スタンバイ・ペアをデプロイするプロセスが開始されます。
% kubectl create -f cstls.yaml timestenclassic.timesten.oracle.com/cstls created
KubernetesクラスタにTimesTenClassicオブジェクトを正常に作成しました。TimesTenデータベースをデプロイするプロセスが開始されますが、まだ完了していません。
kubectl getコマンドとkubectl describeコマンドを使用して、プロビジョニング時にアクティブ・スタンバイ・ペアの進捗状況を監視します。
kubectl getコマンドを使用して、STATEフィールドを確認します。値がInitializingであることを確認します。アクティブ・スタンバイ・ペアのプロビジョニングが開始しましたが、まだ完了していません。
% kubectl get ttc cstls NAME STATE ACTIVE AGE cstls Initializing None 15s
kubectl getコマンドを再度使用して、STATEフィールドの値が変更されているかどうかを確認します。この例では、この値はNormalで、データベースのアクティブ・スタンバイ・ペアがプロビジョニングされ、プロセスが完了したことを示しています。
% kubectl get ttc cstls NAME STATE ACTIVE AGE cstls Normal cstls-0 3m30s
kubectl describeコマンドを使用して、アクティブ・スタンバイ・ペアのプロビジョニングを詳細に表示します。
cstls TimesTenClassicオブジェクト定義では、次の項目が正しく設定されていることに注目してください。
cs-tls Secretは、dbSecretフィールドで正しく参照されています(太字で表示)。
cs-tls Configmapは、dbConfigMapフィールドで正しく参照されています(太字で表示)。
ノート: この例には出力の一部を示しています。
% kubectl describe ttc cstls
Name:         cstls
Namespace:    mynamespace
Labels:       <none>
Annotations:  <none>
API Version:  timesten.oracle.com/v1
Kind:         TimesTenClassic
Metadata:
  Creation Timestamp:  2020-10-17T19:08:03Z
  Generation:          1
  Resource Version:    75491472
  Self Link: 
/apis/timesten.oracle.com/v1/namespaces/mynamespace/timestenclassics/cstls
  UID:                 150128b3-10ac-11eb-b019-d681454a288b
Spec:
  Ttspec:
    Db Config Map:
      cs-tls
    Db Secret:
      cs-tls
    Image:               phx.ocir.io/youraccount/tt1814110:3
    Image Pull Policy:   Always
    Image Pull Secret:   sekret
    Storage Class Name:  oci
    Storage Size:        250G
...
Events:
  Type  Reason       Age    From       Message
  ----  ------       ----   ----       -------
  -     Create       4m21s  ttclassic  Service cstls created
  -     Create       4m21s  ttclassic  StatefulSet cstls created
  -     Create       4m21s  ttclassic  Secret 
tt150128b3-10ac-11eb-b019-d681454a288b created
  -     StateChange  3m5s   ttclassic  Pod cstls-1 Daemon Up
  -     StateChange  3m5s   ttclassic  Pod cstls-0 Agent Up
  -     StateChange  3m5s   ttclassic  Pod cstls-0 Release 18.1.4.11.0
  -     StateChange  3m5s   ttclassic  Pod cstls-1 Agent Up
  -     StateChange  3m5s   ttclassic  Pod cstls-1 Release 18.1.4.11.0
  -     StateChange  3m5s   ttclassic  Pod cstls-0 Daemon Up
  -     StateChange  116s   ttclassic  Pod cstls-0 Database Loaded
  -     StateChange  116s   ttclassic  Pod cstls-0 Database Updatable
  -     StateChange  116s   ttclassic  Pod cstls-0 CacheAgent Not Running
  -     StateChange  116s   ttclassic  Pod cstls-0 RepAgent Not Running
  -     StateChange  116s   ttclassic  Pod cstls-0 RepState IDLE
  -     StateChange  116s   ttclassic  Pod cstls-0 RepScheme None
  -     StateChange  115s   ttclassic  Pod cstls-0 RepAgent Running
  -     StateChange  115s   ttclassic  Pod cstls-0 RepScheme Exists
  -     StateChange  115s   ttclassic  Pod cstls-0 RepState ACTIVE
  -     StateChange  96s    ttclassic  Pod cstls-1 Database Loaded
  -     StateChange  96s    ttclassic  Pod cstls-1 Database Not Updatable
  -     StateChange  96s    ttclassic  Pod cstls-1 CacheAgent Not Running
  -     StateChange  96s    ttclassic  Pod cstls-1 RepAgent Not Running
  -     StateChange  96s    ttclassic  Pod cstls-1 RepScheme Exists
  -     StateChange  96s    ttclassic  Pod cstls-1 RepState IDLE
  -     StateChange  90s    ttclassic  Pod cstls-1 RepAgent Running
  -     StateChange  84s    ttclassic  Pod cstls-1 RepState STANDBY
  -     StateChange  84s    ttclassic  TimesTenClassic was Initializing, now 
Normal
TimesTenデータベースのアクティブ・スタンバイ・ペアが(Normalで示されているように)正常にデプロイされました。
次の各セクションでは、TLSのクライアント要件について説明します。
ttCreateCertsユーティリティを使用してTLS証明書を作成したときに、/scratch/ttuser/instance_dir/instance1/conf/ clientWalletディレクトリ内にcwallet.ssoウォレット・ファイルが生成されました。このファイルは、TimesTenクライアントのインスタンスを実行しているアプリケーション・コンテナにコピーする必要があります。TLS証明書の作成方法は、「レプリケーションおよびClient/Server用のTLS証明書の作成」を参照してください。
この例では、kubectl cpコマンドを使用して、Linux開発ホストからTimesTenクライアントのインスタンスを実行しているアプリケーション・コンテナに/scratch/ttuser/instance_dir/instance1/conf/clientWallet/cwallet.ssoファイルをコピーします。
kubectl exec -itコマンドを使用して、TimesTenクライアントのインスタンスが含まれているアプリケーション・コンテナ(この例ではcstls-0)のシェルを起動します。
% kubectl exec -it cstls-0 -c tt -- /usr/bin/su - oracle
起動したシェルを使用して任意のディレクトリから、空のサブディレクトリを作成します。この例では、clientWalletサブディレクトリを作成します。
% mkdir -p clientWallet
Linux開発ホストからkubectl cpコマンドを使用して、Linux開発ホストの/scratch/ttuser/instance_dir/instance1/conf/clientWalletディレクトリにあるcwallet.ssoファイルを前の手順で作成したclientWalletディレクトリにコピーします。(このディレクトリは、TimesTenクライアント・インスタンスを実行しているアプリケーション・コンテナ内にあります)。cwallet.ssoファイルは、ttCreateCertsユーティリティを使用してTLS証明書を作成したときに生成されたものです。詳細は、「レプリケーションおよびClient/Server用のTLS証明書の作成」を参照してください。
% kubectl cp /scratch/ttuser/instance_dir/instance1/conf/clientWallet/ cwallet.sso cstls-0:clientWallet/cwallet.sso -c tt
シェルから、cwallet.ssoファイルがclientWalletディレクトリに配置されていることを確認します。
% ls clientWallet cwallet.sso
TimesTenクライアントのインスタンスを実行しているアプリケーション・コンテナにcwallet.ssoクライアント・ウォレット・ファイルが正常にコピーされました。
Client/Server用のTLSのクライアント側属性を設定する必要があります。属性は、timesten_home/conf/sys.odbc.iniのクライアントDSN定義で設定することも、適切なClient/Server接続文字列で設定することもできます。詳細は、「Client/Serverドライバの使用」を参照してください。
Client/Server用のTLSに必要なクライアント側属性は次のとおりです。
wallet: cwallet.ssoクライアント・ウォレット・ファイルを格納するディレクトリです。このディレクトリは、TimesTenクライアントのインスタンスを実行しているアプリケーション・コンテナ内にあります。デフォルトのディレクトリはありません。この例では、このディレクトリを示すためにclientWalletディレクトリを作成しました。(詳細は、「クライアント・ウォレットのコピー」を参照)。この例の場合、clientWalletディレクトリへのフルパスは/tt/home/oracle/clientWalletです。そのため、この例では、このディレクトリを示すために/tt/home/oracle/clientWalletを使用しています。
ciphersuites: 暗号スイートの設定です。有効な値は、SSL_ECDHE_ECDSA_WITH_AES_128_GCM_256またはSSL_ECDHE_ECDSA_WITH_AES_256_GCM_384です。または、その両方をカンマで区切って優先する順に並べます。デフォルト設定はありません。TLSを使用する場合は、サーバーとクライアントの設定に1つ以上の共通スイートが含まれている必要があります。この例では、SSL_ECDHE_ECDSA_WITH_AES_128_GCM_256を指定します。暗号スイートの設定の詳細は、『Oracle TimesTen In-Memory Databaseセキュリティ・ガイド』のサーバーの構成に関する項を参照してください。
encryption: クライアントの暗号化設定です。この例では、requiredの設定を指定します。有効な暗号化設定の詳細は、『Oracle TimesTen In-Memory Databaseセキュリティ・ガイド』のサーバーの構成に関する項を参照してください。
この例では、接続文字列を使用して、cstslデータベースにscottユーザーとして接続します。scottユーザーはオペレータが作成したもので、すでにcstslデータベースに存在しています。次に、クライアントでttIsqlCSからsqlgetconnectattrコマンドを使用して、TLSがサーバーとクライアントで正しく構成されていて、TLSが使用されていることを確認します。
データベースに接続します。
% ttIsqlcs -connstr "TTC_SERVER1=cstls-0.cstls.mynamespace.svc.cluster.local; TTC_SERVER2=cstls-1.cstls.mynamespace.svc.cluster.local; TTC_SERVER_DSN=cstls;UID=scott;PWD=tiger; WALLET=tt/home/oracle/clientWallet; CIPHERSUITES=SSL_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256; ENCRYPTION=required"; Copyright (c) 1996, 2020, Oracle and/or its affiliates. All rights reserved. Type ? or "help" for help, type "exit" to quit ttIsql. connect "TTC_SERVER1=cstls-0.cstls.mynamespace.svc.cluster.local; TTC_SERVER2=cstls-1.cstls.mynamespace.svc.cluster.local; TTC_SERVER_DSN=cstls;UID=scott;PWD=********; WALLET=tt/home/oracle/clientWallet; CipherSuites=SSL_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256; ENCRYPTION=REQUIRED;"; Connection successful: DSN=;TTC_SERVER=cstls-0.cstls.mynamespace.svc.cluster.local; TTC_SERVER_DSN=cstls;UID=scott; DATASTORE=/tt/home/oracle/datastore/cstls;DATABASECHARACTERSET=AL32UTF8; CONNECTIONCHARACTERSET=US7ASCII;AUTOCREATE=0;PERMSIZE=200; DDLREPLICATIONLEVEL=3;FORCEDISCONNECTENABLED=1;(SERVER)ENCRYPTION=Required; (SERVER)WALLET=file:/tt/home/oracle/csWallet;(client)Encryption=Required; (client)Wallet=/tt/home/oracle/clientWallet; (client)CipherSuites=SSL_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256; (Default setting AutoCommit=1)
ttIsqlCSのsqlgetconnectattrコマンドを使用して、TLSが使用されていることを確認します。戻り値の1は、TLSが使用されていることを示します。
Command> sqlgetconnectattr tt_tls_session; TT_TLS_SESSION = 1 (SQL_TRUE)
データベースに正常に接続したことと、Client/Server用のTLSが使用されていることの確認が完了しました。