レプリケーション用のTLSの構成

レプリケーション用のTLSを構成すると、レプリケートされたTimesTenデータベース間でセキュアなネットワーク通信を確保できます。詳細は、『Oracle TimesTen In-Memory Databaseセキュリティ・ガイド』TimesTenレプリケーションのTransport Layer Securityを参照してください。

次の項では、レプリケーション用のTLSを構成して使用する方法について説明します。

メタデータ・ファイルとKubernetes機能の作成

レプリケーションの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.iniadminUserおよびschema.sqlメタデータ・ファイルを作成して、それらのメタデータ・ファイルをConfigMapに含めます。

Kubernetes Secretの作成

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

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

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

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

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

    • TLSレプリケーション用に必要なメタデータ・ファイルの名前は、replicationWallet (boldで表示)です。

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

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

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

ConfigMapの作成

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

こうしたメタデータ・ファイルはTLSには不要ですが、TimesTenデータベースの追加属性として含まれています。メタデータ・ファイルおよびConfigMap機能の詳細は、「構成メタデータとKubernetes機能の概要」を参照してください。

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

  1. 選択したディレクトリから、メタデータ・ファイル用に空のサブディレクトリを作成します。この例では、cm_replTLSサブディレクトリを作成します。(今後、この例では、このディレクトリを表す場合にcm_replTLSディレクトリを使用します)。
    % mkdir -p cm_replTLS
    
  2. ConfigMapディレクトリに移動します。
    % cd cm_replTLS
  3. このConfigMapディレクトリ(この例ではcm_replTLS)に、db.iniファイルを作成します。このdb.iniファイルで、PermSize接続属性とDatabaseCharacterSet接続属性を定義します。
    vi db.ini
    
    PermSize=200
    DatabaseCharacterSet=AL32UTF8
  4. このConfigMapディレクトリ(この例ではcm_replTLS)に、adminUserファイルを作成します。このadminUserファイルで、samplepwパスワードを使用してsampleuserユーザーを作成します。
    vi adminUser
    
    sampleuser/samplepw
  5. このConfigMapディレクトリ(この例ではcm_replTLS)に、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_replTLSディレクトリ内のファイルは、ConfigMapに含めておくことで、TimesTenコンテナで使用できるようにします。

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

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

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

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

    % kubectl create configmap repl-tls --from-file=cm_replTLS
    configmap/repl-tls created
    
  7. kubectl describeコマンドを使用して、ConfigMap (この例ではrepl-tls)の内容を確認します。
    % kubectl describe configmap repl-tls
    Name:         repl-tls
    Namespace:    mynamespace
    Labels:       <none>
    Annotations:  <none>
     
    Data
    ====
    adminUser:
    ----
    sampleuser/samplepw
     
    db.ini:
    ----
    PermSize=200
    DatabaseCharacterSet=AL32UTF8
     
    schema.sql:
    ----
    create sequence sampleuser.s;
    create table sampleuser.emp (id number not null primary key, name char (32));
     
    Events:  <none>
    

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

TimesTenClassicオブジェクトの作成

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

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

  1. 空の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セキュリティ・ガイド』タスク3: レプリケーション用のTLSの構成、およびこのマニュアルの表19-3replicationCipherSuiteエントリを参照してください。

    • replicationSSLMandatory: このフィールドはオプションです。この例では、replicationSSLMandatoryを1に設定します。詳細は、『Oracle TimesTen In-Memory Databaseセキュリティ・ガイド』タスク3: レプリケーション用のTLSの構成、およびこのマニュアルの表19-3replicationSSLMandatoryエントリを参照してください。

    この例には次の項目も含まれます。

    • name: repltlsは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イメージをフェッチするために使用するイメージ・プル・シークレットに置き換えます。

    • dbConfigMap: この例では、db.iniadminUserおよびschema.sqlメタデータ・ファイルに対して1つのConfigMap (名前はrepl-tls)を使用します。

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

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

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

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

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

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

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

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

    • replicationCipherSuiteフィールドは、SSL_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256に正しく設定されています(boldで表示)。

    • replicationSSLMandatoryフィールドは、1に正しく設定されています(boldで表示)。

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

    % kubectl describe ttc repltls
    Name:         repltls
    Namespace:    mynamespace
    Labels:       <none>
    Annotations:  <none>
    API Version:  timesten.oracle.com/v2
    Kind:         TimesTenClassic
    Metadata:
      Creation Timestamp:  2024-04-30T18:51:43Z
      Generation:          1
      Resource Version:    75029797
      Self Link: 
    /apis/timesten.oracle.com/v2/namespaces/mynamespace/timestenclassics/repltls
      UID:                 a2915ef3-0fe0-11eb-8b9a-aaa0151611fe
    Spec:
      Ttspec:
        Db Config Map:
          repl-tls
        Db Secret:
          repl-tls
        Image:                      container-registry.oracle.com/timesten/timesten:22.1.1.27.0
        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-bv
        Storage Size:               250Gi
    ...
    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 22.1.1.27.0
      -     StateChange  3m10s  ttclassic  Pod repltls-1 Daemon Up
      -     StateChange  2m3s   ttclassic  Pod repltls-0 Agent Up
      -     StateChange  2m3s   ttclassic  Pod repltls-0 Release 22.1.1.27.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が使用されていることの確認

レプリケーションにTLSが使用されていることを確認するには、次のステップを実行します。

  1. アクティブ・ポッド(この例では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
    timesten-operator-f84766548-tch7s          1/1     Running   0          28d
    
  2. オプション: kubectl exec -itコマンドを使用して、アクティブ・ポッド(この例ではrepltls-0)のシェルを呼び出します。
    % kubectl exec -it repltls-0 -c tt -- /bin/bash
  3. オプション: アクティブ・ポッドのシェルから、cwallet.ssoファイルが/tt/home/timesten/replicationWalletディレクトリにあることを確認します。
    % ls /tt/home/timesten/replicationWallet
    cwallet.sso
     
  4. オプション: アクティブ・ポッドのシェルから、TLSレプリケーション固有の値がtimesten.conf構成ファイルで正しく指定されていることを確認します。(このファイルは、/tt/home/timesten/instances/instance1/confディレクトリにあります。)

    特に、次の点に注目してください。

    • replication_walletは、/tt/home/timesten/replicationWalletに正しく設定されています(boldで表示)。

    • replication_cipher_suiteは、SSL_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256に正しく設定されています(boldで表示)。

    • replication_ssl_mandatoryは、1に正しく設定されています(boldで表示)。

    こうしたtimesten.confの属性の詳細は、『Oracle TimesTen In-Memory Databaseセキュリティ・ガイド』タスク3: レプリケーション用のTLSの構成を参照してください。

    % cat /tt/home/timesten/instances/instance1/conf/timesten.conf
    admin_uid=3429
    admin_user=timesten
    daemon_port=6624
    group_name=timesten
    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/timesten/replicationWallet
    server_port=6625
    show_date=1
    timesten_release=22.1.1
    tns_admin=/ttconfig
    verbose=1
    
  5. アクティブ・ポッドのシェルから、-showstatus -detailオプションを指定してttRepAdminユーティリティを実行し、レプリケーション・エージェントの送信側と受信側がTLSを使用していることを確認します(boldのSSLで示されています)。このユーティリティの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』ttRepAdminを参照してください。

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

    % ttRepAdmin -showstatus -detail repltls
     
    Replication Agent Status as of: 2024-04-30 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が使用されていることの検証が完了しました。