Client/Server用のTLSの構成

Client/Server用のTLSを構成すると、TimesTenのクライアントとサーバーの間でセキュアなネットワーク通信を確保できます。詳細は、『Oracle TimesTen In-Memory Databaseセキュリティ・ガイド』TimesTen Client/Server用のTransport Layer Securityを参照してください。

Client/Server用のTLSを使用する場合は、サーバー側とクライアント側の両方に構成要件があります。次の各項では、それらの要件について説明します。

サーバーの構成要件

次の各セクションでは、サーバーの構成要件について説明します。各項では、Kubernetesクラスタ内のサーバー用のTLSを構成する方法の例も示します。

メタデータ・ファイルとKubernetes機能の概要

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/timesten/instances/instance1です。)

必須のサーバー側属性は、WalletCipherSuitesおよびEncryptionです。これらの属性の詳細は、「サーバー側属性用のConfigMapの作成」を参照してください。『Oracle TimesTen In-Memory Databaseセキュリティ・ガイド』TLSのサーバー属性も参照してください。

csWalletdb.iniメタデータ・ファイルに加えて、その他のサポートされているメタデータ・ファイルを使用することもできます。サポートされているメタデータ・ファイルの詳細は、「構成メタデータの詳細について」を参照してください。

これらのメタデータ・ファイルは、Kubernetesの1つ以上の機能(たとえば、Kubernetes Secret、ConfigMapまたは初期化コンテナ)に含めることができます。これにより、メタデータ・ファイルがTimesTenコンテナの/ttconfigディレクトリに確実に移入されます。この/ttconfigディレクトリにメタデータ・ファイルを配置する方法についての要件はありません。「/ttconfigディレクトリの移入」を参照してください。

次の例では、Kubernetes SecretにcsWalletメタデータ・ファイルを含めます。また、db.iniadminUserおよびschema.sqlメタデータ・ファイルを作成して、それらのメタデータ・ファイルをConfigMapに含めます。

csWalletメタデータ・ファイル用のKubernetes Secretの作成

この項では、cs-tls Kubernetes Secretを作成します。cs-tls Secretには、csWalletメタデータ・ファイルを格納します。

Linux開発ホストで、次のことを実行します。

  1. 任意のディレクトリから、空のサブディレクトリを作成します。この例では、serverWalletサブディレクトリを作成します。(今後、この例では、このディレクトリを表す場合にserverWalletディレクトリを使用します)。
    % mkdir -p serverWallet
    
  2. 前の手順で作成した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
    
  3. Kubernetes Secretの作成

    この例では次のとおりです。

    • Secretの名前はcs-tlsです。cs-tlsは適宜の名前に置き換えます(cs-tlsboldで表示しています)。

    • Client/Server用のTLSに必要なメタデータ・ファイルの名前は、csWallet (boldで表示)です。

    • ウォレット・ディレクトリの場所は、serverWalletです(この例では、boldで表示しています)。別のディレクトリを使用する場合、serverWalletは使用するディレクトリの名前に置き換えます。

    • Oracleウォレットの名前: cwallet.sso (boldで表示)。

    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/timesten/csWalletディレクトリから使用できるようにします。

サーバー側属性用のConfigMapの作成

この項では、cs-tls ConfigMapを作成します。このConfigMapには、db.iniadminUserおよび schema.sqlメタデータ・ファイルが含まれます。

Linux開発ホストで、次のことを実行します。

  1. 選択したディレクトリから、メタデータ・ファイル用に空のサブディレクトリを作成します。この例では、cm_csTLSサブディレクトリを作成します。(今後、この例では、このディレクトリを表す場合にcm_csTLSディレクトリを使用します)。
    % mkdir -p cm_csTLS
  2. ConfigMapディレクトリに移動します。
    % cd cm_csTLS
  3. このConfigMapディレクトリ(この例ではcm_csTLS)にdb.iniファイルを作成します。このdb.iniファイルでは、Client/Server用のTLSのサーバー側属性を定義します。これらのサーバー側属性は、TimesTenコンテナのtimesten_home/confディレクトリにあるsys.odbc.iniファイルに含まれます。(timesten_homeは、TimesTenインスタンス・ディレクトリであることに注意してください。このインスタンス・ディレクトリは、TimesTenコンテナ内のtt/home/timesten/instances/instance1です。)

    Client/Server用のTLSに必要なサーバー側属性は次のとおりです。

    • wallet:サーバー・ウォレットを格納するTimesTenコンテナ内のディレクトリです。/tt/home/timesten/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セキュリティ・ガイド』TLSのサーバー属性を参照してください。

    • encryption: サーバーの暗号化設定です。この例では、requiredの設定を指定します。有効な暗号化の設定の詳細は、『Oracle TimesTen In-Memory Databaseセキュリティ・ガイド』TLSのサーバー属性を参照してください。

    この例では、PermSizeDatabaseCharacterSetの接続属性も指定します。
    vi db.ini
    
    PermSize=200
    DatabaseCharacterSet=AL32UTF8
    wallet=/tt/home/timesten/csWallet
    ciphersuites=SSL_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
    encryption=required
  4. このConfigMapディレクトリ(この例ではcm_csTLS)にadminUserファイルを作成します。このadminUserファイルで、samplepwパスワードを使用してsampleuserユーザーを作成します。
    vi adminUser
    
    sampleuser/samplepw
  5. このConfigMapディレクトリ(この例ではcm_csTLS)にschema.sqlファイルを作成します。このschema.sqlファイルで、sampleuserユーザーのs順序とemp表を定義します。オペレータはこれらのオブジェクト定義でデータベースを自動的に初期化します。
    vi schema.sql
    
    create sequence sampleuser.s;
    create table sampleuser.emp (
      id number not null primary key,
      name char(32)
    );
  6. ConfigMapを作成します。cm_csTLSディレクトリ内のファイルは、ConfigMapに含めておくことで、TimesTenコンテナで使用できるようにします。

    この例では次のとおりです。

    • ConfigMapの名前はcs-tlsです。cs-tlsは適宜の名前に置き換えます(この例では、cs-tlsboldで表示しています)。

    • この例では、ConfigMapにコピーするファイルが存在しているディレクトリとしてcm_csTLSを使用しています。別のディレクトリを使用する場合、cm_csTLSは目的のディレクトリの名前に置き換えます(この例では、cm_csTLSboldで表示しています)。

    kubectl createコマンドを使用して、ConfigMapを作成します。

    % kubectl create configmap cs-tls --from-file=cm_csTLS
    configmap/cs-tls created
  7. 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/timesten/csWallet
    ciphersuites=SSL_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
    encryption=required
     
     
    schema.sql:
    ----
    create sequence sampleuser.s;
    create table sampleuser.emp (id number not null primary key, name char (32));
     
    adminUser:
    ----
    sampleuser/samplepw
     
    Events:  <none>

cs-tls ConfigMapの作成とデプロイが完了しました。

TimesTenClassicオブジェクトの作成

この項では、TimesTenClassicオブジェクトを作成します。TimesTenClassicオブジェクト・タイプの詳細は、「TimesTenClassicオブジェクト・タイプについて」を参照してください。

次のステップを実行します。

  1. 空の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-bvを、TimesTenを保持するためのPersistentVolumesの割当てに使用される記憶域クラスの名前に置き換えます。

    • storageSize: 250Giを、各ポッドがTimesTenを保持するために要求する必要がある記憶域の量に置き換えます。ノート: この例では、本番環境を想定していることから、storageSizeには250Giの値を使用しています。デモ用の場合は、50Giの値で対応できます。詳細は、表19-3storageSizeエントリとlogStorageSizeエントリを参照してください。

    • image: container-registry.oracle.com/timesten/timesten:22.1.1.27.0を、自分のイメージの場所と名前に置き換えます。

    • imagePullSecret: sekretを、KubernetesがTimesTenイメージをフェッチするために使用するイメージ・プル・シークレットに置き換えます。

    % vi cstls.yaml
    
    apiVersion: timesten.oracle.com/v2
    kind: TimesTenClassic
    metadata:
      name: cstls
    spec:
      ttspec:
        storageClassName: oci-bv
        storageSize: 250Gi
        image: container-registry.oracle.com/timesten/timesten:22.1.1.27.0
        imagePullSecret: sekret
        dbConfigMap:
        - cs-tls
        dbSecret:
        - cs-tls
    
  2. kubectl createコマンドを使用して、YAMLファイル(この例ではcstls.yaml)の内容からTimesTenClassicオブジェクトを作成します。これにより、KubernetesクラスタにあるTimesTenデータベースのアクティブ・スタンバイ・ペアをデプロイするプロセスが開始されます。
    % kubectl create -f cstls.yaml
    timestenclassic.timesten.oracle.com/cstls created

KubernetesクラスタにTimesTenClassicオブジェクトを正常に作成しました。TimesTenデータベースをデプロイするプロセスが開始されますが、まだ完了していません。

TimesTenClassicオブジェクトのデプロイメントの監視

kubectl getコマンドとkubectl describeコマンドを使用して、プロビジョニング時にアクティブ・スタンバイ・ペアの進捗状況を監視します。

  1. kubectl getコマンドを使用して、STATEフィールドを確認します。値がInitializingであることを確認します。アクティブ・スタンバイ・ペアのプロビジョニングが開始しましたが、まだ完了していません。
    % kubectl get ttc cstls
    NAME    STATE          ACTIVE   AGE
    cstls   Initializing   None     15s
    
  2. kubectl getコマンドを再度使用して、STATEフィールドの値が変更されているかどうかを確認します。この例では、この値はNormalで、データベースのアクティブ・スタンバイ・ペアがプロビジョニングされ、プロセスが完了したことを示しています。
    % kubectl get ttc cstls
    NAME    STATE    ACTIVE    AGE
    cstls   Normal   cstls-0   3m30s
    
  3. kubectl describeコマンドを使用して、アクティブ・スタンバイ・ペアのプロビジョニングを詳細に表示します。

    cstls TimesTenClassicオブジェクト定義では、次の項目が正しく設定されていることに注目してください。

    • cs-tls Secretは、dbSecretフィールドで正しく参照されています(boldで表示)。

    • cs-tls Configmapは、dbConfigMapフィールドで正しく参照されています(boldで表示)。

    ノート: この例には出力の一部を示しています。

    % kubectl describe ttc cstls
    Name:         cstls
    Namespace:    mynamespace
    Labels:       <none>
    Annotations:  <none>
    API Version:  timesten.oracle.com/v2
    Kind:         TimesTenClassic
    Metadata:
      Creation Timestamp:  2024-10-17T19:08:03Z
      Generation:          1
      Resource Version:    75491472
      Self Link: 
    /apis/timesten.oracle.com/v2/namespaces/mynamespace/timestenclassics/cstls
      UID:                 150128b3-10ac-11eb-b019-d681454a288b
    Spec:
      Ttspec:
        Db Config Map:
          cs-tls
        Db Secret:
          cs-tls
        Image:               container-registry.oracle.com/timesten/timesten:22.1.1.27.0
        Image Pull Policy:   Always
        Image Pull Secret:   sekret
        Storage Class Name:  oci
        Storage Size:        250Gi
    ...
    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 22.1.1.27.0
      -     StateChange  3m5s   ttclassic  Pod cstls-1 Agent Up
      -     StateChange  3m5s   ttclassic  Pod cstls-1 Release 22.1.1.27.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ファイルをコピーします。

  1. kubectl exec -itコマンドを使用して、TimesTenクライアントのインスタンスが含まれているアプリケーション・コンテナ(この例ではcstls-0)のシェルを起動します。
    % kubectl exec -it cstls-0 -c tt -- /bin/bash
  2. 起動したシェルを使用して任意のディレクトリから、空のサブディレクトリを作成します。この例では、clientWalletサブディレクトリを作成します。
    % mkdir -p clientWallet
    
  3. 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
    
  4. シェルから、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/timesten/clientWalletです。そのため、この例では、このディレクトリを示すために/tt/home/timesten/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セキュリティ・ガイドClient/Server用のTLSの構成を参照してください。

  • encryption: クライアントの暗号化設定です。この例では、requiredの設定を指定します。有効な暗号化設定の詳細は、Oracle TimesTen In-Memory Databaseセキュリティ・ガイドClient/Server用のTLSの構成を参照してください。

この例では、接続文字列を使用して、cstslデータベースにsampleuserユーザーとして接続します。sampleuserユーザーはオペレータが作成したもので、すでにcstslデータベースに存在しています。次に、クライアントでttIsqlCSからsqlgetconnectattrコマンドを使用して、TLSがサーバーとクライアントで正しく構成されていて、TLSが使用されていることを確認します。

  1. データベースに接続
    % 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=sampleuser;PWD=samplepw;
    WALLET=tt/home/timesten/clientWallet;
    CIPHERSUITES=SSL_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256;
    ENCRYPTION=required";
     
    Copyright (c) 1996, 2024, 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=sampleuser;PWD=********;
    WALLET=tt/home/timesten/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=sampleuser;
    DATASTORE=/tt/home/timesten/datastore/cstls;DATABASECHARACTERSET=AL32UTF8;
    CONNECTIONCHARACTERSET=AL32UTF8;AUTOCREATE=0;PERMSIZE=200;
    DDLREPLICATIONLEVEL=3;FORCEDISCONNECTENABLED=1;(SERVER)ENCRYPTION=Required;
    (SERVER)WALLET=file:/tt/home/timesten/csWallet;(client)Encryption=Required;
    (client)Wallet=/tt/home/timesten/clientWallet;
    (client)CipherSuites=SSL_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256;
    (Default setting AutoCommit=1)
    
  2. ttIsqlCSsqlgetconnectattrコマンドを使用して、TLSが使用されていることを確認します。戻り値の1は、TLSが使用されていることを示します。
    Command> sqlgetconnectattr tt_tls_session;
    TT_TLS_SESSION = 1 (SQL_TRUE)
    

データベースに正常に接続したことと、Client/Server用のTLSが使用されていることの確認が完了しました。