次の方法で共有


Azure Red Hat OpenShift (ARO) クラスターに Confidential Containers をデプロイする (プレビュー)

この記事では、ARO クラスターの Confidential Containers をデプロイするために必要な手順について説明します。 このプロセスには、2 つの主要な部分と複数の手順が含まれます:

最初に、次の手順を含む OpenShift サンドボックス コンテナーをデプロイします:

  1. OpenShift サンドボックス コンテナー オペレーターをインストールします。

  2. ピア ポッド シークレットを作成します。

  3. ピア ポッド構成マップを作成します。

  4. Azure シークレットを作成します。

OpenShift サンドボックス コンテナーをデプロイした後、Confidential Containers をデプロイします。 これを行うには、次の手順を実行します。

  1. トラスティ オペレーターをインストールします。

  2. トラスティのルートを作成します。

  3. Confidential Containers 機能ゲートを有効にします。

  4. ピア ポッド構成マップを更新します。

  5. KataConfig カスタム リソースを作成します。

  6. トラスティ認証シークレットを作成します。

  7. トラスティ構成マップを作成します。

  8. トラスティを構成します。

  9. KbsConfig カスタム リソースを作成します。

  10. 構成証明プロセスを確認します。

開始する前に

デプロイ プロセスを開始する前に、次の前提条件が満たされていることを確認します:

重要

アプリケーション内のポッドごとに、対応する機密仮想マシン (CVM) との 1 対 1 のマッピングがあります。 つまり、すべての新しいポッドには個別の CVM が必要であり、ポッド間の分離が確保されます。

パート 1: OpenShift サンドボックス コンテナーをデプロイする

OpenShift サンドボックス コンテナー オペレーターをインストールする

OpenShift サンドボックス コンテナー オペレーターは、CLI または OpenShift Web コンソールを使用してインストールできます。

  1. osc-namespace.yaml マニフェスト ファイルを作成します:

    apiVersion: v1
    kind: Namespace
    metadata:
        name: openshift-sandboxed-containers-operator
    
  2. 次のコマンドを実行して名前空間を作成します:

    $ oc apply -f osc-namespace.yaml

  3. osc-operatorgroup.yaml マニフェスト ファイルを作成します:

    apiVersion: operators.coreos.com/v1
    kind: OperatorGroup
    metadata:
      name: sandboxed-containers-operator-group
      namespace: openshift-sandboxed-containers-operator
    spec:
      targetNamespaces:
      - openshift-sandboxed-containers-operator
    
  4. 次のコマンドを実行して、演算子グループを作成します:

    $ oc apply -f osc-operatorgroup.yaml

  5. osc-subscription.yaml マニフェスト ファイルを作成します:

    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      name: sandboxed-containers-operator
      namespace: openshift-sandboxed-containers-operator
    spec:
      channel: stable
      installPlanApproval: Automatic
      name: sandboxed-containers-operator
      source: redhat-operators
      sourceNamespace: openshift-marketplace
      startingCSV: sandboxed-containers-operator.v1.7.0
    
  6. 次のコマンドを実行して、サブスクリプションを作成します:

    $ oc apply -f osc-subscription.yaml

  7. 次のコマンドを実行して、オペレーターが正しくインストールされていることを確認します:

    $ oc get csv -n openshift-sandboxed-containers-operator

    このコマンドは、完了までに数分かかる場合があります。

  8. 次のコマンドを実行して、プロセスを監視します:

    $ watch oc get csv -n openshift-sandboxed-containers-operator

    出力例

    NAME                             DISPLAY                                  VERSION    REPLACES     PHASE
    openshift-sandboxed-containers   openshift-sandboxed-containers-operator  1.7.0      1.6.0        Succeeded
    
  1. Web コンソールで、オペレーター → OperatorHub に移動します。

  2. [キーワードでフィルター処理する] フィールドに、「OpenShift サンドボックス コンテナー」と入力します。

  3. [OpenShift サンドボックス コンテナー オペレーター ] タイルを選択し、[インストール] を選択します。

  4. [インストール オペレーター] ページで、使用可能な 更新チャネル オプションの一覧から [安定] を選択します。

  5. インストール済みの名前空間に対して、オペレーターが推奨する名前空間が選択されていることを確認します。 これにより、必須の openshift-sandboxed-containers-operator 名前空間にオペレーターがインストールされます。 この名前空間がまだ存在しない場合は、自動的に作成されます。

    openshift-sandboxed-containers-operator 以外の名前空間に OpenShift サンドボックス コンテナー オペレーターをインストールしようとすると、インストールが失敗します。

  6. 承認戦略では自動が選択されていることを確認します。 自動 が既定値であり、新しい z ストリーム リリースが利用可能になったときに OpenShift サンドボックス コンテナーの自動更新を有効にします。

  7. [インストール] を選択します。

  8. オペレーター →インストール済みオペレーター に移動して、オペレーターがインストールされていることを確認します。

ピア ポッド シークレットを作成する

OpenShift サンドボックス コンテナーのピア ポッド シークレットを作成する必要があります。 シークレットには、ポッド仮想マシン (VM) イメージとピア ポッド インスタンスを作成するための資格情報が格納されます。

既定では、OpenShift サンドボックス コンテナー オペレーターは、クラスターの作成に使用される資格情報に基づいてシークレットを作成します。 ただし、別の資格情報を使用するシークレットを手動で作成できます。

  1. 次のコマンドを実行して、Azure サブスクリプション ID を取得します:

    $ AZURE_SUBSCRIPTION_ID=$(az account list --query "[?isDefault].id" \
      -o tsv) && echo "AZURE_SUBSCRIPTION_ID: \"$AZURE_SUBSCRIPTION_ID\""
    
  2. 次のコマンドを実行して、ロールベースのアクセス制御 (RBAC) コンテンツを生成します:

    $ az ad sp create-for-rbac --role Contributor --scopes /subscriptions/$AZURE_SUBSCRIPTION_ID \
          --query "{ client_id: appId, client_secret: password, tenant_id: tenant }"
    

    出力例

    {
          "client_id": `AZURE_CLIENT_ID`,
          "client_secret": `AZURE_CLIENT_SECRET`,
          "tenant_id": `AZURE_TENANT_ID`
        }
    
  3. シークレット オブジェクトで使用する RBAC 出力を記録します。

  4. 次の例に従って peer-pods-secret.yaml マニフェスト ファイルを作成します:

    apiVersion: v1
    kind: Secret
    metadata:
      name: peer-pods-secret
      namespace: openshift-sandboxed-containers-operator
    type: Opaque
    stringData:
      AZURE_CLIENT_ID: "<azure_client_id>"
      AZURE_CLIENT_SECRET: "<azure_client_secret>"
      AZURE_TENANT_ID: "<azure_tenant_id>"
      AZURE_SUBSCRIPTION_ID: "<azure_subscription_id>"
    
    • AZURE_CLIENT_ID value を指定します。
    • AZURE_CLIENT_SECRET value を指定します。
    • AZURE_TENANT_ID value を指定します。
    • AZURE_SUBSCRIPTION_ID value を指定します。
  5. 次のコマンドを実行してシークレットを作成します:

    $ oc apply -f peer-pods-secret.yaml

ピア ポッド構成マップを作成する

  1. Azure から次の値を取得します:

    1. Azure リソース グループを取得して記録します:

      $ AZURE_RESOURCE_GROUP=$(oc get infrastructure/cluster -o jsonpath='{.status.platformStatus.azure.resourceGroupName}') && echo "AZURE_RESOURCE_GROUP: \"$AZURE_RESOURCE_GROUP\""

    2. Azure VNet 名を取得して記録します:

      $ AZURE_VNET_NAME=$(az network vnet list --resource-group ${AZURE_RESOURCE_GROUP} --query "[].{Name:name}" --output tsv)
      

      この値は、Azure サブネット ID を取得するために使用されます。

    3. Azure サブネット ID を取得して記録します:

      $ AZURE_SUBNET_ID=$(az network vnet subnet list --resource-group ${AZURE_RESOURCE_GROUP} --vnet-name $AZURE_VNET_NAME --query "[].{Id:id} | [? contains(Id, 'worker')]" --output tsv) && echo "AZURE_SUBNET_ID: \"$AZURE_SUBNET_ID\""
      
    4. Azure ネットワーク セキュリティ グループ (NSG) ID を取得して記録します:

      $ AZURE_NSG_ID=$(az network nsg list --resource-group ${AZURE_RESOURCE_GROUP} --query "[].{Id:id}" --output tsv) && echo "AZURE_NSG_ID: \"$AZURE_NSG_ID\""
      
    5. Azure リージョンを取得して記録します:

      $ AZURE_REGION=$(az group show --resource-group ${AZURE_RESOURCE_GROUP} --query "{Location:location}" --output tsv) && echo "AZURE_REGION: \"$AZURE_REGION\""

  2. 次の例に従って peer-pods-cm.yaml マニフェスト ファイルを作成します:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: peer-pods-cm
      namespace: openshift-sandboxed-containers-operator
    data:
      CLOUD_PROVIDER: "azure"
      VXLAN_PORT: "9000"
      AZURE_INSTANCE_SIZE: "Standard_B2als_v2"
      AZURE_INSTANCE_SIZES: "Standard_B2als_v2,Standard_D2as_v5,Standard_D4as_v5,Standard_D2ads_v5"
      AZURE_SUBNET_ID: "<azure_subnet_id>"
      AZURE_NSG_ID: "<azure_nsg_id>"
      PROXY_TIMEOUT: "5m"
      AZURE_IMAGE_ID: "<azure_image_id>"
      AZURE_REGION: "<azure_region>"
      AZURE_RESOURCE_GROUP: "<azure_resource_group>"
      DISABLECVM: "true"
    
    • ワークロードでインスタンス サイズが定義されていない場合は、AZURE_INSTANCE_SIZE が既定値です。
    • AZURE_INSTANCE_SIZES は、ポッドの作成時に指定できるすべてのインスタンス サイズが一覧表示されます。 これにより、必要なメモリが少なく、CPU の数が少なく、大規模なワークロードではインスタンス サイズが大きいワークロードに対して、より小さなインスタンス サイズを定義できます。
    • 取得した AZURE_SUBNET_ID 値を指定します。
    • 取得した AZURE_NSG_ID 値を指定します。
    • AZURE_IMAGE_ID はオプションです。 既定では、この値は、クラスターの資格情報に基づく Azure イメージ ID を使用して KataConfig カスタム リソースを実行するときに設定されます。 独自の Azure イメージを作成する場合は、正しいイメージ ID を指定します。
    • 取得した AZURE_REGION 値を指定します。
    • 取得した AZURE_RESOURCE_GROUP 値を指定します。
  3. 次のコマンドを実行して、構成マップを作成します: $ oc apply -f peer-pods-cm.yaml

Azure シークレットを作成する

Azure が仮想マシンの作成に使用する SSH キー シークレットを作成する必要があります。

  1. 次のコマンドを実行して、SSH キー ペアを生成します:

    $ ssh-keygen -f ./id_rsa -N ""

  2. 次のコマンドを実行して、シークレット オブジェクトを作成します:

    $ oc create secret generic ssh-key-secret \
          -n openshift-sandboxed-containers-operator \
          --from-file=id_rsa.pub=./id_rsa.pub
    
  3. 作成した SSH キーを削除します:

    $ shred --remove id_rsa.pub id_rsa

パート 2: 機密コンテナーをデプロイする

トラスティ オペレーターをインストールする

  1. trustee-namespace.yaml マニフェスト ファイルを作成します:

    apiVersion: v1
    kind: Namespace
    metadata:
    name: trustee-operator-system
    
  2. 次のコマンドを実行して、トラスティ演算子システム名前空間を作成します:

    $ oc apply -f trustee-namespace.yaml

  3. rustee-operatorgroup.yaml マニフェスト ファイルを作成します:

    apiVersion: operators.coreos.com/v1
    kind: OperatorGroup
    metadata:
      name: trustee-operator-group
      namespace: trustee-operator-system
    spec:
      targetNamespaces:
      - trustee-operator-system
    
  4. 次のコマンドを実行して、オペレーター グループを作成します:

    $ oc apply -f trustee-operatorgroup.yaml

  5. trustee-subscription.yaml マニフェスト ファイルを作成します:

    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      name: trustee-operator
      namespace: trustee-operator-system
    spec:
      channel: stable
      installPlanApproval: Automatic
      name: trustee-operator
      source: redhat-operators
      sourceNamespace: openshift-marketplace
      startingCSV: trustee-operator.v0.1.0
    
  6. 次のコマンドを実行して、サブスクリプションを作成します:

    $ oc apply -f trustee-subscription.yaml

  7. 次のコマンドを実行して、オペレーターが正しくインストールされていることを確認します:

    $ oc get csv -n trustee-operator-system

    このコマンドは、完了までに数分かかる場合があります。

  8. 次のコマンドを実行して、プロセスを監視します:

    $ watch oc get csv -n trustee-operator-system

    出力例

    NAME                          DISPLAY                        PHASE
    trustee-operator.v0.1.0       Trustee Operator  0.1.0        Succeeded
    

トラスティのルートを作成する

トラスティのエッジ TLS 終端を使用して、セキュリティで保護されたルートを作成します。 外部イングレス トラフィックは、HTTPS としてルーター ポッドに到達し、HTTP としてトラスティ ポッドに渡されます。

  1. 次のコマンドを実行してエッジ ルートを作成します:

    $ oc create route edge --service=kbs-service --port kbs-port \
      -n trustee-operator-system
    

    現在、有効な CA 署名証明書を持つルートのみがサポートされています。 自己署名証明書でルートを使用することはできません。

  2. 次のコマンドを実行して、TRUSTEE_HOST 変数を設定します:

    $ TRUSTEE_HOST=$(oc get route -n trustee-operator-system kbs-service \
      -o jsonpath={.spec.host})
    
  3. 次のコマンドを実行して、ルートを確認します:

    $ echo $TRUSTEE_HOST

    出力例kbs-service-trustee-operator-system.apps.memvjias.eastus.aroapp.io

    ピア ポッド構成マップのこの値を記録します。

Confidential Containers 機能ゲートを有効にする

  1. cc-feature-gate.yaml マニフェスト ファイルを作成します:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: osc-feature-gates
      namespace: openshift-sandboxed-containers-operator
    data:
      confidential: "true"
    
  2. 次のコマンドを実行して、構成マップを作成します:

    $ oc apply -f cc-feature-gate.yaml

ピア ポッド構成マップを更新する

  1. Azure インスタンスから次の値を取得します:

    一. Azure リソース グループを取得して記録します:

    $ AZURE_RESOURCE_GROUP=$(oc get infrastructure/cluster -o jsonpath='{.status.platformStatus.azure.resourceGroupName}') && echo "AZURE_RESOURCE_GROUP: \"$AZURE_RESOURCE_GROUP\""

    二. Azure VNet 名を取得して記録します:

    $ AZURE_VNET_NAME=$(az network vnet list --resource-group ${AZURE_RESOURCE_GROUP} --query "[].{Name:name}" --output tsv)

    この値は、Azure サブネット ID を取得するために使用されます。

    iii. Azure サブネット ID を取得して記録します:

    $ AZURE_SUBNET_ID=$(az network vnet subnet list --resource-group ${AZURE_RESOURCE_GROUP} --vnet-name $AZURE_VNET_NAME --query "[].{Id:id} | [? contains(Id, 'worker')]" --output tsv) && echo "AZURE_SUBNET_ID: \"$AZURE_SUBNET_ID\""

    iv. Azure ネットワーク セキュリティ グループ (NSG) ID を取得して記録します:

    $ AZURE_NSG_ID=$(az network nsg list --resource-group ${AZURE_RESOURCE_GROUP} --query "[].{Id:id}" --output tsv) && echo "AZURE_NSG_ID: \"$AZURE_NSG_ID\""

    v. Azure リージョンを取得して記録します:

    $ AZURE_REGION=$(az group show --resource-group ${AZURE_RESOURCE_GROUP} --query "{Location:location}" --output tsv) && echo "AZURE_REGION: \"$AZURE_REGION\""

  2. 次の例に従って、peer-pods-cm.yaml マニフェスト ファイルを作成します:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: peer-pods-cm
      namespace: openshift-sandboxed-containers-operator
    data:
      CLOUD_PROVIDER: "azure"
      VXLAN_PORT: "9000"
      AZURE_INSTANCE_SIZE: "Standard_DC2as_v5"
      AZURE_INSTANCE_SIZES: "Standard_DC2as_v5,Standard_DC4as_v5,Standard_DC8as_v5"
      AZURE_SUBNET_ID: "<azure_subnet_id>"
      AZURE_NSG_ID: "<azure_nsg_id>"
      PROXY_TIMEOUT: "5m"
      AZURE_IMAGE_ID: "<azure_image_id>"
      AZURE_REGION: "<azure_region>"
      AZURE_RESOURCE_GROUP: "<azure_resource_group>"
      DISABLECVM: "false"
      AA_KBC_PARAMS: "cc_kbc::https://${TRUSTEE_HOST}"
    
    • ワークロードでインスタンス サイズが定義されていない場合は、AZURE_INSTANCE_SIZE が既定値です。 TDX の場合は、"Standard_EC4eds_v5" を指定します
    • AZURE_INSTANCE_SIZES は、ポッドの作成時に指定できるすべてのインスタンス サイズが一覧表示されます。 これにより、必要なメモリが少なく、CPU の数が少なく、大規模なワークロードではインスタンス サイズが大きいワークロードに対して、より小さなインスタンス サイズを定義できます。 TDX の場合は、"Standard_EC4eds_v5、Standard_EC8eds_v5、Standard_EC16eds_v5" を指定します。
    • 取得した AZURE_SUBNET_ID 値を指定します。
    • 取得した AZURE_NSG_ID 値を指定します。
    • AZURE_IMAGE_ID (オプション) 既定では、この値は、クラスターの資格情報に基づく Azure イメージ ID を使用して KataConfig カスタム リソースを実行するときに設定されます。 独自の Azure イメージを作成する場合は、正しいイメージ ID を指定します。
    • 取得した AZURE_REGION 値を指定します。
    • 取得した AZURE_RESOURCE_GROUP 値を指定します。
    • AA_KBC_PARAMS トラスティ ルートのホスト名を指定します。
  3. 次のコマンドを実行して、構成マップを作成します:

    $ oc apply -f peer-pods-cm.yaml

  4. 次のコマンドを実行して、peerpodconfig-ctrl-caa-daemon デーモン セットを再起動します:

    $ oc set env ds/peerpodconfig-ctrl-caa-daemon \
      -n openshift-sandboxed-containers-operator REBOOT="$(date)"
    

KataConfig カスタム リソースを作成する

  1. 次の例に従って、example-kataconfig.yaml マニフェスト ファイルを作成します:

    apiVersion: kataconfiguration.openshift.io/v1
        kind: KataConfig
        metadata:
          name: example-kataconfig
        spec:
          enablePeerPods: true
          logLevel: info
        #  kataConfigPoolSelector:
        #    matchLabels:
        #      <label_key>: '<label_value>'
    

    オプション: 特定のノードに kata-remote をインストールするためにノード ラベルを適用した場合は、キーと値 (例: cc: 'true') を指定します。

  2. 次のコマンドを実行して、KataConfig カスタム リソースを作成します:

    $ oc apply -f example-kataconfig.yaml

    新しい KataConfig カスタム リソースが作成され、ワーカー ノードにランタイム クラスとして kata-remote がインストールされます。

    インストールを確認する前に、kata-remote インストールが完了し、ワーカー ノードが再起動するまで待ちます。

  3. 次のコマンドを実行して、インストールの進行状況を監視します:

    $ watch "oc describe kataconfig | sed -n /^Status:/,/^Events/p"

    kataNodes のすべてのワーカーの状態がインストールされ、理由を指定せずに InProgress の条件が False の場合、kata-remote がクラスターにインストールされます。

  4. 次のコマンドを実行して、デーモン セットを確認します:

    $ oc get -n openshift-sandboxed-containers-operator ds/peerpodconfig-ctrl-caa-daemon

  5. 次のコマンドを実行して、ランタイム クラスを確認します:

    $ oc get runtimeclass

    出力例

    NAME             HANDLER         AGE
    kata-remote      kata-remote     152m
    

トラスティ認証シークレットを作成する

  1. 次のコマンドを実行して秘密キーを作成します:

    $ openssl genpkey -algorithm ed25519 > privateKey

  2. 次のコマンドを実行して公開キーを作成します:

    $ openssl pkey -in privateKey -pubout -out publicKey

  3. 次のコマンドを実行してシークレットを作成します:

    $ oc create secret generic kbs-auth-public-key --from-file=publicKey -n trustee-operator-system

  4. 次のコマンドを実行してシークレットを確認します:

    $ oc get secret -n trustee-operator-system

トラスティ構成マップを作成する

  1. kbs-config-cm.yaml マニフェスト ファイルを作成します:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: kbs-config-cm
      namespace: trustee-operator-system
    data:
      kbs-config.json: |
        {
          "insecure_http" : true,
          "sockets": ["0.0.0.0:8080"],
          "auth_public_key": "/etc/auth-secret/publicKey",
          "attestation_token_config": {
            "attestation_token_type": "CoCo"
          },
          "repository_config": {
            "type": "LocalFs",
            "dir_path": "/opt/confidential-containers/kbs/repository"
          },
          "as_config": {
            "work_dir": "/opt/confidential-containers/attestation-service",
            "policy_engine": "opa",
            "attestation_token_broker": "Simple",
              "attestation_token_config": {
              "duration_min": 5
              },
            "rvps_config": {
              "store_type": "LocalJson",
              "store_config": {
                "file_path": "/opt/confidential-containers/rvps/reference-values/reference-values.json"
              }
             }
          },
          "policy_engine_config": {
            "policy_path": "/opt/confidential-containers/opa/policy.rego"
          }
        }
    
  2. 次のコマンドを実行して、構成マップを作成します:

    $ oc apply -f kbs-config-cm.yaml

トラスティを構成する

次のトラスティ設定を構成します。

参照値を構成する

ハードウェア プラットフォームの信頼できるダイジェストを指定することで、参照値プロバイダー サービス (RVPS) の参照値を構成できます。

クライアントは、実行中のソフトウェア、トラステッド実行環境 (TEE) ハードウェア、ファームウェアから測定値を収集し、要求を含む見積もりを構成証明サーバーに送信します。 これらの測定値は、トラスティに登録されている信頼できるダイジェストと一致する必要があります。 このプロセスにより、機密 VM (CVM) が想定されるソフトウェア スタックを実行しており、改ざんされていないことが保証されます。

  1. rvps-configmap.yaml マニフェスト ファイルを作成します:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: rvps-reference-values
      namespace: trustee-operator-system
    data:
      reference-values.json: |
        [
        ]
    

    必要に応じて、reference-values.json ハードウェア プラットフォームの信頼できるダイジェストを指定します。 それ以外の場合は、空のままにします。

  2. 次のコマンドを実行して、RVPS 構成マップを作成します:

    $ oc apply -f rvps-configmap.yaml

独自の構成証明ポリシーを作成する

独自の構成証明ポリシーを作成することで、既定の構成証明ポリシーを上書きできます。

  1. 次の例に従って、attestation-policy.yaml マニフェスト ファイルを作成します:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: attestation-policy
      namespace: trustee-operator-system
    data:
      default.rego: |
         package policy
         import future.keywords.every
    
         default allow = false
    
         allow {
            every k, v in input {
                judge_field(k, v)
            }
         }
    
         judge_field(input_key, input_value) {
            has_key(data.reference, input_key)
            reference_value := data.reference[input_key]
            match_value(reference_value, input_value)
         }
    
         judge_field(input_key, input_value) {
            not has_key(data.reference, input_key)
         }
    
         match_value(reference_value, input_value) {
            not is_array(reference_value)
            input_value == reference_value
         }
    
         match_value(reference_value, input_value) {
            is_array(reference_value)
            array_include(reference_value, input_value)
         }
    
         array_include(reference_value_array, input_value) {
            reference_value_array == []
         }
    
         array_include(reference_value_array, input_value) {
            reference_value_array != []
            some i
            reference_value_array[i] == input_value
         }
    
         has_key(m, k) {
            _ = m[k]
         }
    

    package policy の場合、構成証明ポリシーは Open Policy Agent の仕様に従います。 この例では、構成証明ポリシーは、構成証明レポートで指定された要求を、RVPS データベースに登録されている参照値と比較します。 構成証明プロセスは、すべての値が一致する場合にのみ成功します。

  2. 次のコマンドを実行して、構成証明ポリシー構成マップを作成します:

    $ oc apply -f attestation-policy.yaml

TDX の証明書キャッシュ サービスのプロビジョニング

TEE が Intel Trust Domain Extensions (TDX) の場合は、プロビジョニング証明書キャッシュ サービス (PCCS) を構成する必要があります。 PCCS はプロビジョニング認定キー (PCK) 証明書を取得し、ローカル データベースにキャッシュします。

  1. tdx-config.yaml マニフェスト ファイルを作成します。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: tdx-config
      namespace: trustee-operator-system
    data:
      sgx_default_qcnl.conf: | \
          {
            "collateral_service": "https://api.trustedservices.intel.com/sgx/certification/v4/",
            "pccs_url": "<pccs_url>"
          }
    

    pccs_url の場合は、PCCS URL を指定します (例: https://localhost:8081/sgx/certification/v4/.)

  2. 次のコマンドを実行して、TDX 構成マップを作成します:

    $ oc apply -f tdx-config.yaml

コンテナー イメージの署名検証用のシークレットを作成する

コンテナー イメージの署名検証を使用する場合は、コンテナー イメージの公開署名キーを含むシークレットを作成する必要があります。 トラスティ オペレーターはこのシークレットを使用して署名を検証し、信頼された認証済みのコンテナー イメージのみが環境にデプロイされるようにします。

  1. 次のコマンドを実行して、コンテナー イメージの署名検証用のシークレットを作成します。

    $ oc apply secret generic <type> \
        --from-file=<tag>=./<public_key_file> \
        -n trustee-operator-system
    
    • KBS シークレットの種類 (例: img-sig) を指定します。
    • シークレットのタグ (例: pub-key) と、コンテナー イメージの公開署名キーを指定します。
  2. <type> 値を記録します。 KbsConfig カスタム リソースを作成する場合は、spec.kbsSecretResources キーにこの値を追加する必要があります。

コンテナー イメージの署名検証ポリシーを作成する

署名の検証は常に有効になっているため、コンテナー イメージの署名検証ポリシーを作成する必要があります。

重要

このポリシーが見つからない場合、ポッドは起動しません。 コンテナー イメージの署名検証を使用しない場合は、署名の検証なしでポリシーを作成します。

  1. 次の例に従って security-policy-config.json ファイルを作成します。

    署名の検証を使用しない場合:

    {
            "default": [
            {
            "type": "insecureAcceptAnything"
            }],
            "transports": {}
        }
    

    署名の検証を使用する場合:

    {
            "default": [
            {
            "type": "insecureAcceptAnything"
            ],
            "transports": {
            "<transport>": {
            "<registry>/<image>":
            [
            {
            "type": "sigstoreSigned",
            "keyPath": "kbs:///default/<type>/<tag>"
            }
            ]
            }
            }
        }
    
    • トランスポート用のイメージ リポジトリ (例: "docker") を指定します。
    • コンテナー レジストリとイメージ (例: "quay.io/my-image") を指定します。
    • 作成したコンテナー イメージ署名検証シークレットの種類とタグ (例: "img-sig/pub-key") を指定します。
  2. 次のコマンドを実行して、セキュリティ ポリシーを作成します。

    $ oc apply secret generic security-policy \
        --from-file=osc=./<security-policy-config.json> \
        -n trustee-operator-system
    

    シークレットの種類、セキュリティ ポリシー、キーなどを変更しないでください。

    セキュリティ ポリシーのシークレットは、KbsConfig カスタム リソースの spec.kbsSecretResources キーで指定されます。

KbsConfig カスタム リソースを作成する

トラスティを起動するには、KbsConfig カスタム リソースを作成する必要があります。

  1. kbsconfig-cr.yaml マニフェスト ファイルを作成します:

    apiVersion: confidentialcontainers.org/v1alpha1
    kind: KbsConfig
    metadata:
      labels:
        app.kubernetes.io/name: kbsconfig
        app.kubernetes.io/instance: kbsconfig
        app.kubernetes.io/part-of: trustee-operator
        app.kubernetes.io/managed-by: kustomize
        app.kubernetes.io/created-by: trustee-operator
      name: kbsconfig
      namespace: trustee-operator-system
    spec:
      kbsConfigMapName: kbs-config-cm
      kbsAuthSecretName: kbs-auth-public-key
      kbsDeploymentType: AllInOneDeployment
      kbsRvpsRefValuesConfigMapName: rvps-reference-values
      kbsSecretResources: ["kbsres1", "security-policy", "<type>"]
      kbsResourcePolicyConfigMapName: resource-policy
        # tdxConfigSpec:
        #   kbsTdxConfigMapName: tdx-config
        #   kbsAttestationPolicyConfigMapName: attestation-policy
        #   kbsServiceType: <service_type>
    
    • 省略可能: シークレットを作成した場合、コンテナー イメージ署名検証シークレットの type 値 (例: img-sig) を指定します。 シークレットを作成しなかった場合は、kbsSecretResources 値を ["kbsres1", "security-policy"] に設定します。
    • Intel Trust Domain Extensions の場合、tdxConfigSpec.kbsTdxConfigMapName: tdx-config のコメントを解除します。
    • カスタマイズされた構成証明ポリシーを作成する場合は、kbsAttestationPolicyConfigMapName: attestation-policy のコメントを解除します。
    • 既定の ClusterIP サービス以外のサービスの種類を作成して、クラスターの外部トラフィック内のアプリケーションを公開する場合は、kbsServiceType: <service_type> のコメントを解除します。 NodePortLoadBalancer、または ExternalName を指定できます。
  2. 次のコマンドを実行して、KbsConfig カスタム リソースを作成します:

    $ oc apply -f kbsconfig-cr.yaml

トラスティ構成を確認する

トラスティ ポッドとログを調べて、トラスティ構成を確認します。

  1. 次のコマンドを実行して、既定のプロジェクトを設定します:

    $ oc project trustee-operator-system

  2. 次のコマンドを実行して、ポッドを確認します:

    $ oc get pods -n trustee-operator-system

    出力例

    NAME                                                   READY   STATUS    RESTARTS   AGE
    trustee-deployment-8585f98449-9bbgl                    1/1     Running   0          22m
    trustee-operator-controller-manager-5fbd44cd97-55dlh   2/2     Running   0          59m
    
  3. 次のコマンドを実行して、POD_NAME 環境変数を設定します:

    $ POD_NAME=$(oc get pods -l app=kbs -o jsonpath='{.items[0].metadata.name}' -n trustee-operator-system)

  4. 次のコマンドを実行して、ポッド ログを確認します:

    $ oc logs -n trustee-operator-system $POD_NAME

    出力例

    [2024-05-30T13:44:24Z INFO  kbs] Using config file /etc/kbs-config/kbs-config.json
        [2024-05-30T13:44:24Z WARN  attestation_service::rvps] No RVPS address provided and will launch a built-in rvps
        [2024-05-30T13:44:24Z INFO  attestation_service::token::simple] No Token Signer key in config file, create an ephemeral key and without CA pubkey cert
        [2024-05-30T13:44:24Z INFO  api_server] Starting HTTPS server at [0.0.0.0:8080]
        [2024-05-30T13:44:24Z INFO  actix_server::builder] starting 12 workers
        [2024-05-30T13:44:24Z INFO  actix_server::server] Tokio runtime found; starting in existing Tokio runtime
    

構成証明プロセスを確認する

テスト ポッドを作成し、そのシークレットを取得することで、構成証明プロセスを確認できます。

重要: この手順は、構成証明が機能していることを確認する例です。 メモリ ダンプを使用してデータをキャプチャできるため、機密データを標準 I/O に書き込まないでください。 メモリに書き込まれるデータのみが暗号化されます。

既定では、ポッド VM イメージに埋め込まれたエージェント側ポリシーによって、Confidential Containers ポッドの exec API とログ API が無効になります。 このポリシーにより、機密データが標準 I/O に書き込まれないようにします。

テスト シナリオでは、ポッドにポリシー注釈を追加することで、実行時に制限をオーバーライドできます。 Technology Preview の場合、ランタイム ポリシーの注釈はリモート構成証明では検証されません。

  1. verification-pod.yaml マニフェスト ファイルを作成します:

    apiVersion: v1
    kind: Pod
    metadata:
      name: ocp-cc-pod
      labels:
        app: ocp-cc-pod
      annotations:
        io.katacontainers.config.agent.policy: cGFja2FnZSBhZ2VudF9wb2xpY3kKCmRlZmF1bHQgQWRkQVJQTmVpZ2hib3JzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgQWRkU3dhcFJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IENsb3NlU3RkaW5SZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBDb3B5RmlsZVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IENyZWF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IENyZWF0ZVNhbmRib3hSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBEZXN0cm95U2FuZGJveFJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IEV4ZWNQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgR2V0TWV0cmljc1JlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IEdldE9PTUV2ZW50UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgR3Vlc3REZXRhaWxzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgTGlzdEludGVyZmFjZXNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBMaXN0Um91dGVzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgTWVtSG90cGx1Z0J5UHJvYmVSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBPbmxpbmVDUFVNZW1SZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBQYXVzZUNvbnRhaW5lclJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFB1bGxJbWFnZVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFJlYWRTdHJlYW1SZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBSZW1vdmVDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBSZW1vdmVTdGFsZVZpcnRpb2ZzU2hhcmVNb3VudHNSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBSZXNlZWRSYW5kb21EZXZSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBSZXN1bWVDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTZXRHdWVzdERhdGVUaW1lUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU2V0UG9saWN5UmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU2lnbmFsUHJvY2Vzc1JlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFN0YXJ0Q29udGFpbmVyUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhcnRUcmFjaW5nUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgU3RhdHNDb250YWluZXJSZXF1ZXN0IDo9IHRydWUKZGVmYXVsdCBTdG9wVHJhY2luZ1JlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFR0eVdpblJlc2l6ZVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFVwZGF0ZUNvbnRhaW5lclJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFVwZGF0ZUVwaGVtZXJhbE1vdW50c1JlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFVwZGF0ZUludGVyZmFjZVJlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFVwZGF0ZVJvdXRlc1JlcXVlc3QgOj0gdHJ1ZQpkZWZhdWx0IFdhaXRQcm9jZXNzUmVxdWVzdCA6PSB0cnVlCmRlZmF1bHQgV3JpdGVTdHJlYW1SZXF1ZXN0IDo9IHRydWUK
    spec:
      runtimeClassName: kata-remote
      containers:
        - name: skr-openshift
          image: registry.access.redhat.com/ubi9/ubi:9.3
          command:
            - sleep
            - "36000"
          securityContext:
            privileged: false
            seccompProfile:
              type: RuntimeDefault
    

    ポッド metada annotations は、機密データが標準 I/O に書き込まれないようにするポリシーをオーバーライドします。

  2. 次のコマンドを実行してポッドを作成します:

    $ oc create -f verification-pod.yaml

  3. 次のコマンドを実行して、ocp-cc-pod ポッドの Bash シェルに接続します:

    $ oc exec -it ocp-cc-pod -- bash

  4. 次のコマンドを実行して、ポッド シークレットをフェッチします:

    $ curl http://127.0.0.1:8006/cdh/resource/default/kbsres1/key1

    出力例res1val1

    トラスティ サーバーは、構成証明が成功した場合にのみシークレットを返します。