# Dynamic Engine環境サービスのカスタムKeystoreを使ったセキュリティ

Dynamic Engine環境のカスタムKeystoreを使い、署名済みであるデータ統合ジョブのアーティファクトを検証します。

Talend StudioでのKetystoreの生成と管理については、[ジョブアーティファクト署名用のカスタムJava KeyStoreを設定](https://help.qlik.com/talend/ja-JP/studio-user-guide/8.0/configuring-custom-java-keystore-for-artifact-signature)をご覧ください。

情報メモ重要: Dynamic Engine環境サービス用のカスタムスKeystoreは、エンジンのデプロイ中、またはアップグレード中のみ設定することが許可されています。

## 始める前に

* dynamic-engine-crdカスタムリソース定義は、oci://ghcr.io/talend/helm/dynamic-engine-crd Helmチャートを使用してインストールされている必要があります。インストールされていない場合は、次のコマンドを実行してインストールしてください。
  1. 使用するチャートのバージョンを見つけます。

     * 次のHelmコマンドを実行します:
       ```
       helm show chart oci://ghcr.io/talend/helm/dynamic-engine-crd --version <engine_version>
       ```
     * Talend Management Consoleから直接バージョンを見るか、自分のDynamic Engineバージョンに含まれているチャートバージョンの[Dynamic Engine変更ログ](https://help.qlik.com/talend/en-US/dynamic-engine-changelog/Cloud)をチェックしてください。
     * [Dynamic Engineバージョンエンドポイント](https://talend.qlik.dev/apis/dynamic-engine/2021-03/#operation_return-all-supported-dynamic-engine-versions)へのAPIコールを使用します。

  2. 次のコマンドを実行し、目的のバージョンのHelmチャートをインストールします。

     ```
     helm install dynamic-engine-crd oci://ghcr.io/talend/helm/dynamic-engine-crd --version <helm_chart_version>
     ```

     &lt;helm\_chart\_version&gt;を、お使いのDynamic Engineバージョンでサポートされているチャートのバージョンに置換します。

     バージョンを指定しないと、利用可能な最新のdynamic-engine-crdチャートバージョンがインストールされます。
* Dynamic Engineがデプロイされている必要があります。デプロイされていない場合は、このコマンドを実行してデプロイしてください。
  ```
  helm install dynamic-engine -f <engine-id>-helm-values/<engine-id>-values.yaml oci://ghcr.io/talend/helm/dynamic-engine 
  ```

  現在のカスタマイズはDynamic Engine環境側でのみ必要であるため、これがデフォルトのデプロイメントです。このため、Dynamic Engineインスタンスにはカスタマイズは設定されません。

## このタスクについて

デフォルトでは、Dynamic Engine環境はアーティファクト署名の検証でデフォルトのKeystoreを使用します。独自のKeystoreで署名されたデータ統合ジョブのアーティファクトを検証する場合は、環境のデプロイメントやアップグレード時に、カスタムKeystoreとそのパスワードを指定する必要があります。

カスタムKeystoreストアに含める必要があるのは、ルート認証局(CA)のパブリック証明書だけです。プライベートキーや中間の証明書は必要ありません。

## 手順

1. Kubernetesマシンで、ダウンロードしておいたHelmデプロイメントのzipファイルを解凍します。
2. KEYSTORE\_PATH環境変数とKEYSTORE\_PASS環境変数を使って、Keystoreファイルの場所とアクセスパスワードを設定します。
   ### 例

   Linuxシステムでの例:
   ```
   export KEYSTORE_PATH=<location-to-your-keystore-file>
   export KEYSTORE_PASS=<your_keystore_password>
   ```

   &lt;location-to-your-keystore-file&gt;と&lt;your\_keystore\_password&gt;を、実際の値に置換します。
3. Base64エンコードされたKeystoreとそのパスワードを使って、Dynamic Engine環境用のカスタムの値ファイルを作成します。
   ```
   cat <<EOF > $DYNAMIC_ENGINE_ENVIRONMENT_ID-custom-keystore-values.yaml
   configuration:
     signature:
       keystore:
         # base64 string of the keystore to load, null by default (rely on the default signature bundle)
         data: |
           $(base64 -i $KEYSTORE_PATH)
         password: ${KEYSTORE_PASS}
   EOF                         
   ```

   $DYNAMIC\_ENGINE\_ENVIRONMENT\_IDを、自分の環境IDに置き換えます。
4. カスタムのKeystore設定を使って、Dynamic Engine環境をデプロイします。
   ```
   helm install dynamic-engine-environment-$DYNAMIC_ENGINE_ENVIRONMENT_ID -f $DYNAMIC_ENGINE_ENVIRONMENT_ID-values.yaml  \
    -f $DYNAMIC_ENGINE_ENVIRONMENT_ID-custom-keystore-values.yaml \
    oci://ghcr.io/talend/helm/dynamic-engine-environment \
    --version $DYNAMIC_ENGINE_VERSION
   ```

   情報メモヒント: 変更が必要であれば、$DYNAMIC\_ENGINE\_ENVIRONMENT\_ID-custom-keystore-values.yamlファイルのコンテンツをアップデートし、helm upgradeを実行することでその変更を適用できます。
   ```
   helm upgrade dynamic-engine-environment-$DYNAMIC_ENGINE_ENVIRONMENT_ID -f $DYNAMIC_ENGINE_ENVIRONMENT_ID-values.yaml  \
    -f $DYNAMIC_ENGINE_ENVIRONMENT_ID-custom-keystore-values.yaml \
    oci://ghcr.io/talend/helm/dynamic-engine-environment \
    --version $DYNAMIC_ENGINE_VERSION
   ```

## タスクの結果

正しく完了すると、Dynamic Engine環境サービスがカスタムKeystoreと共にクラスターにインストールされ、Dynamic Engineに接続します。

Talend Management Consoleではこの環境のステータスが[Ready] (準備完了)になり、タスクまたはプランを実行する準備ができていることが確定されます。

データ統合タスクが実行されると、アーティファクトの署名がまずカスタムKeystoreに対して検証され、次にデフォルトのKeystoreに対して検証されます。そのいずれも署名を認証できない場合、実行は開始されず、タスクはTalend Management Consoleで失敗したもとのして表示されます。

署名の問題でタスクの実行が失敗する場合は、環境でカスタムKeystoreを検証する単純なポッドテンプレートを作成します:

1. このテストポッド用に値ファイルを作成します。この例では、check-custom-keystore.yamlというファイルです。

   ```
   cat <<EOF > check-custom-keystore.yaml
   apiVersion: v1
   kind: Pod
   metadata:
     labels:
       app.kubernetes.io/managed-by: kubectl
     name: check-custom-keystore
     
   spec:
     securityContext:
       runAsNonRoot: true
       runAsUser: 61000
       seccompProfile:
         type: RuntimeDefault
     containers:
     - name: runner
       image: ghcr.io/talend/jre21-base-minimal:4.0.32
       command:
         - cat
       tty: true
       securityContext:
         allowPrivilegeEscalation: false
         capabilities:
           drop:
             - ALL
       resources:
         requests:
           cpu: '0.3'
           memory: 256Mi
         limits:
           cpu: '0.5'
           memory: 256Mi
       volumeMounts:
       - mountPath: /tmp/signature/keystores/default
         name: signature-check-secret-volume
         readOnly: true
       - mountPath: /tmp/signature/keystores/custom
         name: custom-signature-check-secret-volume
         readOnly: true
     volumes:
       - name: signature-check-secret-volume
         secret:
           defaultMode: 420
           secretName: signature-check-secret
       - name: custom-signature-check-secret-volume
         secret:
           defaultMode: 420
           secretName: custom-signature-check-secret
   EOF
   ```

2. テストポッドのテンプレートを適用します:

   ```
   kubectl apply -n qlik-processing-env-$DYNAMIC_ENGINE_ENVIRONMENT_ID -f check-custom-keystore.yaml                      
   ```

3. keytoolを使って、Keystoreのコンテンツをリストします:

   ```
   kubectl exec -it check-custom-keystore -n qlik-processing-env-$DYNAMIC_ENGINE_ENVIRONMENT_ID \
   -- /usr/lib/jvm/jdk-21.0.5+11-jre/bin/keytool -list -v -keystore /tmp/signature/keystores/custom/custom-code-verify.jks \
   -storepass \$(cat /tmp/signature/keystores/custom/custom-code-verify-jks-password)                                            
   ```

   このコマンドによって、カスタムKeystoreが環境にマウントされ、読み取り可能であることが確認されます。

4. 完了したら、テストポッドを削除します:

   ```
    kubectl delete -n qlik-processing-env-$DYNAMIC_ENGINE_ENVIRONMENT_ID -f check-custom-keystore.yaml
   ```