From ece06066664171f61418744ae896609696d5cd28 Mon Sep 17 00:00:00 2001 From: Chris Butler Date: Thu, 16 Jul 2026 23:22:25 +0000 Subject: [PATCH 01/18] feat(14-01): rewrite KBS config TOML template for Trustee 1.2 - Replace admin type/insecure_api with authorization_mode - Rename insecure_key to insecure_header_jwk (B5) - Remove work_dir and policy_engine (B6) - Flatten RVPS config storage_type = LocalJson (B7) - Replace resource plugin with storage_backend_type (B8) - Add unified storage_backend section (B8, B13) - Remove policy_engine section entirely (B9) - Simplify attestation_token_broker to signer (B10) - Add inline dcap_verifier for TDX (C5) Co-Authored-By: Claude Opus 4.6 (1M context) --- templates/kbs-config-map.yaml | 45 +++++++++++++++-------------------- 1 file changed, 19 insertions(+), 26 deletions(-) diff --git a/templates/kbs-config-map.yaml b/templates/kbs-config-map.yaml index ef13389..60cbcf6 100644 --- a/templates/kbs-config-map.yaml +++ b/templates/kbs-config-map.yaml @@ -15,33 +15,19 @@ data: insecure_http = false private_key = "/etc/https-key/tls.key" certificate = "/etc/https-cert/tls.crt" - [admin] - {{- if eq (default "v1.0" .Values.kbs.admin.format) "v1.1" }} - type = "Simple" - insecure_api = false - [[admin.personas]] - id = "admin" - public_key_path = "/etc/auth-secret/publicKey" - {{- else }} - type = "DenyAll" - insecure_api = false - auth_public_key = "/etc/auth-secret/publicKey" - {{- end }} + [admin] + authorization_mode = "DenyAll" [attestation_token] - insecure_key = false + insecure_header_jwk = false attestation_token_type = "CoCo" - trusted_certs_paths = ["/etc/attestation-cert/tls.crt"] # Check for location in cert (based on key generated) + trusted_certs_paths = ["/etc/attestation-cert/tls.crt"] [attestation_service] type = "coco_as_builtin" - work_dir = "/opt/confidential-containers/attestation-service" - policy_engine = "opa" [attestation_service.attestation_token_broker] - type = "Ear" - policy_dir = "/opt/confidential-containers/attestation-service/policies" [attestation_service.attestation_token_broker.signer] key_path = "/etc/attestation-cert/tls.key" @@ -52,20 +38,27 @@ data: [attestation_service.rvps_config] type = "BuiltIn" - - [attestation_service.rvps_config.storage] - type = "LocalJson" - file_path = "/opt/confidential-containers/rvps/reference-values/reference-values.json" + storage_type = "LocalJson" {{- if .Values.kbs.gpu.enabled }} [attestation_service.verifier_config.nvidia_verifier] type = "Remote" {{- end }} + {{- if .Values.kbs.tdx.enabled }} + + [attestation_service.verifier_config.dcap_verifier] + collateral_service = "{{ .Values.kbs.tdx.collateralService }}" + {{- end }} [[plugins]] name = "resource" - type = "LocalFs" - dir_path = "/opt/confidential-containers/kbs/repository" + storage_backend_type = "kvstorage" + + [storage_backend] + storage_type = "LocalFs" + + [storage_backend.backends.local_fs] + dir_path = "/opt/confidential-containers/storage" - [policy_engine] - policy_path = "/opt/confidential-containers/opa/policy.rego" \ No newline at end of file + [storage_backend.backends.local_json] + dir_path = "/opt/confidential-containers/storage/local_json" From 0ddcf024838b37b10e93ec50a3fa839896886f26 Mon Sep 17 00:00:00 2001 From: Chris Butler Date: Thu, 16 Jul 2026 23:22:30 +0000 Subject: [PATCH 02/18] feat(14-01): update KbsConfig CR, delete tdx-config, bump to v0.9.0 - Remove tdxConfigSpec from KbsConfig CR (C1) - Delete tdx-config.yaml template (C4-C5) - Bump chart version from 0.8.0 to 0.9.0 (D-01) - Remove obsolete kbs.admin.format from values.yaml Co-Authored-By: Claude Opus 4.6 (1M context) --- Chart.yaml | 2 +- templates/kbs.yaml | 6 ------ templates/tdx-config.yaml | 15 --------------- values.yaml | 5 ----- 4 files changed, 1 insertion(+), 27 deletions(-) delete mode 100644 templates/tdx-config.yaml diff --git a/Chart.yaml b/Chart.yaml index 7b14bba..e090f1f 100644 --- a/Chart.yaml +++ b/Chart.yaml @@ -7,4 +7,4 @@ keywords: - confidential-containers name: trustee # DO NOT EDIT VERSION HERE, IT IS AUTO-GENERATED BY SEMANTIC-RELEASE -version: 0.8.0 +version: 0.9.0 diff --git a/templates/kbs.yaml b/templates/kbs.yaml index c0e3644..0389722 100644 --- a/templates/kbs.yaml +++ b/templates/kbs.yaml @@ -30,12 +30,6 @@ spec: kbsAttestationKeySecretName: attestation-cert - # TDX specific configuration (optional) - {{- if .Values.kbs.tdx.enabled }} - tdxConfigSpec: - kbsTdxConfigMapName: tdx-config - {{- end }} - # IBM SE specific configuration (optional) # ibmSEConfigSpec: # certStorePvc: diff --git a/templates/tdx-config.yaml b/templates/tdx-config.yaml deleted file mode 100644 index dcf8db2..0000000 --- a/templates/tdx-config.yaml +++ /dev/null @@ -1,15 +0,0 @@ -{{- if .Values.kbs.tdx.enabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: tdx-config - namespace: trustee-operator-system - annotations: - argocd.argoproj.io/sync-wave: "4" -data: - sgx_default_qcnl.conf: | - { - "collateral_service": "{{ .Values.kbs.tdx.collateralService }}", - "use_secure_cert": false - } -{{- end }} diff --git a/values.yaml b/values.yaml index 1b1b4f5..e74c025 100644 --- a/values.yaml +++ b/values.yaml @@ -20,11 +20,6 @@ global: # KBS (Key Broker Service) configuration kbs: - admin: - # Admin config format: "v1.0" for Trustee 1.0 (auth_public_key), - # "v1.1" for Trustee 1.1+ (type = "Simple" with [[admin.personas]]) - format: "v1.0" - # Security policy is an expected secret and is required to be pushed into the KBS # presumes security policy flavour is signed cosignKeys: secret/data/hub/coSignKeys From f2b0608bda98e7bd3c045ebabaf08ae78b442c0e Mon Sep 17 00:00:00 2001 From: Chris Butler Date: Thu, 16 Jul 2026 23:22:36 +0000 Subject: [PATCH 03/18] feat(14-02): migrate RVPS reference values to v1.2 format (B1-B3) - reference-values.yaml: rename key, change default - rvps-values-policies.yaml: list/append to dict/set - rvps-values-policies.yaml: update ConfigMap data key - All 16 reference value names preserved --- templates/reference-values.yaml | 2 +- templates/rvps-values-policies.yaml | 34 ++++++++++++++--------------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/templates/reference-values.yaml b/templates/reference-values.yaml index 258e4af..205e5f8 100644 --- a/templates/reference-values.yaml +++ b/templates/reference-values.yaml @@ -7,5 +7,5 @@ metadata: annotations: argocd.argoproj.io/sync-wave: "4" data: - reference-values.json: '[]' + reference_value: '{}' {{ end }} \ No newline at end of file diff --git a/templates/rvps-values-policies.yaml b/templates/rvps-values-policies.yaml index 5b97de0..1e3149f 100644 --- a/templates/rvps-values-policies.yaml +++ b/templates/rvps-values-policies.yaml @@ -25,7 +25,7 @@ spec: {{`{{- $debugRawHash := fromConfigMap "imperative" "debug-initdata" "RAW_HASH" -}}`}} {{`{{- $rawHashPadded := printf "%s00000000000000000000000000000000" $rawHash -}}`}} {{`{{- $debugRawHashPadded := printf "%s00000000000000000000000000000000" $debugRawHash -}}`}} - {{`{{- $referenceValues := list (dict "name" "init_data" "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr8Hash $debugPcr8Hash $rawHash $debugRawHash $rawHashPadded $debugRawHashPadded)) -}}`}} + {{`{{- $referenceValues := dict "init_data" (dict "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr8Hash $debugPcr8Hash $rawHash $debugRawHash $rawHashPadded $debugRawHashPadded)) -}}`}} {{`{{- $pcrStash := (lookup "v1" "Secret" "trustee-operator-system" "pcr-stash") -}}`}} {{`{{- if $pcrStash -}}`}} {{`{{- $secretData := $pcrStash.data.json | base64dec | fromJson -}}`}} @@ -33,34 +33,34 @@ spec: {{`{{- $pcr09 := $secretData.measurements.sha256.pcr09 -}}`}} {{`{{- $pcr11 := $secretData.measurements.sha256.pcr11 -}}`}} {{`{{- $pcr12 := $secretData.measurements.sha256.pcr12 -}}`}} - {{`{{- $referenceValues = append $referenceValues (dict "name" "snp_pcr03" "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr03)) -}}`}} - {{`{{- $referenceValues = append $referenceValues (dict "name" "tdx_pcr03" "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr03)) -}}`}} - {{`{{- $referenceValues = append $referenceValues (dict "name" "snp_pcr08" "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr8Hash $debugPcr8Hash)) -}}`}} - {{`{{- $referenceValues = append $referenceValues (dict "name" "tdx_pcr08" "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr8Hash $debugPcr8Hash)) -}}`}} - {{`{{- $referenceValues = append $referenceValues (dict "name" "snp_pcr09" "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr09)) -}}`}} - {{`{{- $referenceValues = append $referenceValues (dict "name" "tdx_pcr09" "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr09)) -}}`}} - {{`{{- $referenceValues = append $referenceValues (dict "name" "snp_pcr11" "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr11)) -}}`}} - {{`{{- $referenceValues = append $referenceValues (dict "name" "tdx_pcr11" "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr11)) -}}`}} - {{`{{- $referenceValues = append $referenceValues (dict "name" "snp_pcr12" "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr12)) -}}`}} - {{`{{- $referenceValues = append $referenceValues (dict "name" "tdx_pcr12" "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr12)) -}}`}} + {{`{{- $referenceValues = set $referenceValues "snp_pcr03" (dict "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr03)) -}}`}} + {{`{{- $referenceValues = set $referenceValues "tdx_pcr03" (dict "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr03)) -}}`}} + {{`{{- $referenceValues = set $referenceValues "snp_pcr08" (dict "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr8Hash $debugPcr8Hash)) -}}`}} + {{`{{- $referenceValues = set $referenceValues "tdx_pcr08" (dict "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr8Hash $debugPcr8Hash)) -}}`}} + {{`{{- $referenceValues = set $referenceValues "snp_pcr09" (dict "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr09)) -}}`}} + {{`{{- $referenceValues = set $referenceValues "tdx_pcr09" (dict "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr09)) -}}`}} + {{`{{- $referenceValues = set $referenceValues "snp_pcr11" (dict "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr11)) -}}`}} + {{`{{- $referenceValues = set $referenceValues "tdx_pcr11" (dict "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr11)) -}}`}} + {{`{{- $referenceValues = set $referenceValues "snp_pcr12" (dict "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr12)) -}}`}} + {{`{{- $referenceValues = set $referenceValues "tdx_pcr12" (dict "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr12)) -}}`}} {{`{{- end -}}`}} {{`{{- $firmwareStash := (lookup "v1" "Secret" "trustee-operator-system" "firmware-reference-values") -}}`}} {{`{{- if $firmwareStash -}}`}} {{`{{- $firmwareData := $firmwareStash.data.json | base64dec | fromJson -}}`}} {{`{{- if $firmwareData.mr_td -}}`}} - {{`{{- $referenceValues = append $referenceValues (dict "name" "mr_td" "expiration" "2027-12-12T00:00:00Z" "value" $firmwareData.mr_td) -}}`}} + {{`{{- $referenceValues = set $referenceValues "mr_td" (dict "expiration" "2027-12-12T00:00:00Z" "value" $firmwareData.mr_td) -}}`}} {{`{{- end -}}`}} {{`{{- if $firmwareData.rtmr_1 -}}`}} - {{`{{- $referenceValues = append $referenceValues (dict "name" "rtmr_1" "expiration" "2027-12-12T00:00:00Z" "value" $firmwareData.rtmr_1) -}}`}} + {{`{{- $referenceValues = set $referenceValues "rtmr_1" (dict "expiration" "2027-12-12T00:00:00Z" "value" $firmwareData.rtmr_1) -}}`}} {{`{{- end -}}`}} {{`{{- if $firmwareData.rtmr_2 -}}`}} - {{`{{- $referenceValues = append $referenceValues (dict "name" "rtmr_2" "expiration" "2027-12-12T00:00:00Z" "value" $firmwareData.rtmr_2) -}}`}} + {{`{{- $referenceValues = set $referenceValues "rtmr_2" (dict "expiration" "2027-12-12T00:00:00Z" "value" $firmwareData.rtmr_2) -}}`}} {{`{{- end -}}`}} {{`{{- if $firmwareData.snp_launch_measurement -}}`}} - {{`{{- $referenceValues = append $referenceValues (dict "name" "snp_launch_measurement" "expiration" "2027-12-12T00:00:00Z" "value" $firmwareData.snp_launch_measurement) -}}`}} + {{`{{- $referenceValues = set $referenceValues "snp_launch_measurement" (dict "expiration" "2027-12-12T00:00:00Z" "value" $firmwareData.snp_launch_measurement) -}}`}} {{`{{- end -}}`}} {{`{{- if $firmwareData.xfam -}}`}} - {{`{{- $referenceValues = append $referenceValues (dict "name" "xfam" "expiration" "2027-12-12T00:00:00Z" "value" $firmwareData.xfam) -}}`}} + {{`{{- $referenceValues = set $referenceValues "xfam" (dict "expiration" "2027-12-12T00:00:00Z" "value" $firmwareData.xfam) -}}`}} {{`{{- end -}}`}} {{`{{- end -}}`}} - complianceType: mustonlyhave @@ -71,7 +71,7 @@ spec: name: rvps-reference-values namespace: trustee-operator-system data: - reference-values.json: '{{`{{ toJson $referenceValues }}`}}' + reference_value: '{{`{{ toJson $referenceValues }}`}}' --- apiVersion: policy.open-cluster-management.io/v1 kind: PlacementBinding From 5f34085f0fb25adeb27a33288648c61a15027fdd Mon Sep 17 00:00:00 2001 From: Chris Butler Date: Thu, 16 Jul 2026 23:22:41 +0000 Subject: [PATCH 04/18] feat(14-02): rename resource policy ConfigMap key (B11) - Data key changed from policy.rego to resource-policy.rego - Custom EAR-based policy body preserved unchanged - B12 permissive default change not applicable --- templates/resource-policy.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/resource-policy.yaml b/templates/resource-policy.yaml index 3c2b583..c4da919 100644 --- a/templates/resource-policy.yaml +++ b/templates/resource-policy.yaml @@ -6,7 +6,7 @@ metadata: annotations: argocd.argoproj.io/sync-wave: "4" data: - policy.rego: | + resource-policy.rego: | package policy import rego.v1 From 31366dedbe91060211ef8ec8a43788bfc3fd7876 Mon Sep 17 00:00:00 2001 From: Chris Butler Date: Thu, 16 Jul 2026 23:42:38 +0000 Subject: [PATCH 05/18] fix: remove dead admin auth artifacts authorization_mode = "DenyAll" replaced the old admin auth keypair flow. Remove the now-unused: - kbs-operator-keys.yaml (ESO for admin public key) - kbsAuthSecretName from KbsConfig CR - kbs.publicKey vault path from values.yaml Co-Authored-By: Claude Opus 4.6 (1M context) --- templates/kbs-operator-keys.yaml | 23 ----------------------- templates/kbs.yaml | 1 - values.yaml | 3 --- 3 files changed, 27 deletions(-) delete mode 100644 templates/kbs-operator-keys.yaml diff --git a/templates/kbs-operator-keys.yaml b/templates/kbs-operator-keys.yaml deleted file mode 100644 index dba5139..0000000 --- a/templates/kbs-operator-keys.yaml +++ /dev/null @@ -1,23 +0,0 @@ -{{- if ne .Values.global.secretStore.backend "none" }} ---- -apiVersion: "external-secrets.io/v1" -kind: ExternalSecret -metadata: - annotations: - argocd.argoproj.io/sync-wave: "1" - name: kbs-auth-public-key-eso - namespace: trustee-operator-system -spec: - refreshInterval: 15s - secretStoreRef: - name: {{ .Values.secretStore.name }} - kind: {{ .Values.secretStore.kind }} - data: - target: - name: kbs-auth-public-key - template: - type: Opaque - dataFrom: - - extract: - key: {{ .Values.kbs.publicKey }} -{{- end }} \ No newline at end of file diff --git a/templates/kbs.yaml b/templates/kbs.yaml index 0389722..a2be7fd 100644 --- a/templates/kbs.yaml +++ b/templates/kbs.yaml @@ -7,7 +7,6 @@ metadata: argocd.argoproj.io/sync-wave: "7" spec: kbsConfigMapName: kbs-config - kbsAuthSecretName: kbs-auth-public-key kbsDeploymentType: AllInOneDeployment kbsRvpsRefValuesConfigMapName: rvps-reference-values kbsSecretResources: diff --git a/values.yaml b/values.yaml index e74c025..fabdb3f 100644 --- a/values.yaml +++ b/values.yaml @@ -24,9 +24,6 @@ kbs: # presumes security policy flavour is signed cosignKeys: secret/data/hub/coSignKeys - # Public key for authentication by a user with the KBS management API - publicKey: secret/data/hub/kbsPublicKey - # Dynamic secret resources list - add new secrets here # Each entry generates an ESO and gets added to kbsSecretResources # requires a name of the secret and a key to retrieve using ESO, typically from vault. From 8908d3a8d5eea0921fa8b4339e3bc52e87a74e9a Mon Sep 17 00:00:00 2001 From: Chris Butler Date: Fri, 17 Jul 2026 01:25:40 +0000 Subject: [PATCH 06/18] fix: restore kbsAuthSecretName with dummy secret for operator volume mount - Add kbsAuthSecretName: kbs-auth-public-key back to KbsConfig CR spec - Create dummy Opaque secret kbs-auth-public-key in trustee-operator-system - Operator v1.2 controller requires this field for volume mount even though admin auth is disabled (authorization_mode = DenyAll) --- templates/kbs-auth-dummy-secret.yaml | 14 ++++++++++++++ templates/kbs.yaml | 1 + 2 files changed, 15 insertions(+) create mode 100644 templates/kbs-auth-dummy-secret.yaml diff --git a/templates/kbs-auth-dummy-secret.yaml b/templates/kbs-auth-dummy-secret.yaml new file mode 100644 index 0000000..3dc409a --- /dev/null +++ b/templates/kbs-auth-dummy-secret.yaml @@ -0,0 +1,14 @@ +# Dummy secret required by Trustee 1.2 operator. +# The operator controller unconditionally creates a volume from +# kbsAuthSecretName. Admin auth is disabled (authorization_mode = "DenyAll"), +# so the content is irrelevant -- only existence matters. +apiVersion: v1 +kind: Secret +metadata: + name: kbs-auth-public-key + namespace: trustee-operator-system + annotations: + argocd.argoproj.io/sync-wave: "1" +type: Opaque +data: + publicKey: "" diff --git a/templates/kbs.yaml b/templates/kbs.yaml index a2be7fd..0389722 100644 --- a/templates/kbs.yaml +++ b/templates/kbs.yaml @@ -7,6 +7,7 @@ metadata: argocd.argoproj.io/sync-wave: "7" spec: kbsConfigMapName: kbs-config + kbsAuthSecretName: kbs-auth-public-key kbsDeploymentType: AllInOneDeployment kbsRvpsRefValuesConfigMapName: rvps-reference-values kbsSecretResources: From 1f314715dcafc87fb7577bc190050c69a4e47a77 Mon Sep 17 00:00:00 2001 From: Chris Butler Date: Fri, 17 Jul 2026 05:12:10 +0000 Subject: [PATCH 07/18] fix: add migration annotation to policy ConfigMaps for Trustee 1.2 The Trustee 1.2 operator migrates ConfigMaps without the kbs.confidentialcontainers.org/migrated-from-v1.1.0 annotation by creating a .v1.1 backup and deleting the original. However, it only implements recreation-from-backup for kbs-config, not for attestation-policy or resource-policy. This creates a loop where the operator deletes the ConfigMaps then fails because they're missing. Adding the migration annotation tells the operator these ConfigMaps are already in v1.2 format and should not be migrated. Co-Authored-By: Claude Opus 4.6 (1M context) --- templates/attestation-policy.yaml | 1 + templates/resource-policy.yaml | 1 + 2 files changed, 2 insertions(+) diff --git a/templates/attestation-policy.yaml b/templates/attestation-policy.yaml index abf47c5..d4270be 100644 --- a/templates/attestation-policy.yaml +++ b/templates/attestation-policy.yaml @@ -5,6 +5,7 @@ metadata: namespace: trustee-operator-system annotations: argocd.argoproj.io/sync-wave: "4" + kbs.confidentialcontainers.org/migrated-from-v1.1.0: v1.2.0 data: default_cpu.rego: | package policy diff --git a/templates/resource-policy.yaml b/templates/resource-policy.yaml index c4da919..39330ed 100644 --- a/templates/resource-policy.yaml +++ b/templates/resource-policy.yaml @@ -5,6 +5,7 @@ metadata: namespace: trustee-operator-system annotations: argocd.argoproj.io/sync-wave: "4" + kbs.confidentialcontainers.org/migrated-from-v1.1.0: v1.2.0 data: resource-policy.rego: | package policy From 1c6b23be31c7bb0ecfddc220c4b5959848da7725 Mon Sep 17 00:00:00 2001 From: Chris Butler Date: Fri, 17 Jul 2026 05:19:37 +0000 Subject: [PATCH 08/18] =?UTF-8?q?revert:=20RVPS=20v1.2=20format=20?= =?UTF-8?q?=E2=80=94=20Red=20Hat=20Trustee=20KBS=20v1.2.0=20uses=20v1.1=20?= =?UTF-8?q?format?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Red Hat Trustee KBS v1.2.0 still expects RVPS reference values in the v1.1 list format (reference-values.json key, array of name/value/expiration objects). The v1.2 dict format causes "malformed value: invalid type: map, expected a string" deserialization errors. Reverts f2b0608 until the Red Hat build ships native v1.2 RVPS support. Co-Authored-By: Claude Opus 4.6 (1M context) --- templates/reference-values.yaml | 2 +- templates/rvps-values-policies.yaml | 34 ++++++++++++++--------------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/templates/reference-values.yaml b/templates/reference-values.yaml index 205e5f8..258e4af 100644 --- a/templates/reference-values.yaml +++ b/templates/reference-values.yaml @@ -7,5 +7,5 @@ metadata: annotations: argocd.argoproj.io/sync-wave: "4" data: - reference_value: '{}' + reference-values.json: '[]' {{ end }} \ No newline at end of file diff --git a/templates/rvps-values-policies.yaml b/templates/rvps-values-policies.yaml index 1e3149f..5b97de0 100644 --- a/templates/rvps-values-policies.yaml +++ b/templates/rvps-values-policies.yaml @@ -25,7 +25,7 @@ spec: {{`{{- $debugRawHash := fromConfigMap "imperative" "debug-initdata" "RAW_HASH" -}}`}} {{`{{- $rawHashPadded := printf "%s00000000000000000000000000000000" $rawHash -}}`}} {{`{{- $debugRawHashPadded := printf "%s00000000000000000000000000000000" $debugRawHash -}}`}} - {{`{{- $referenceValues := dict "init_data" (dict "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr8Hash $debugPcr8Hash $rawHash $debugRawHash $rawHashPadded $debugRawHashPadded)) -}}`}} + {{`{{- $referenceValues := list (dict "name" "init_data" "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr8Hash $debugPcr8Hash $rawHash $debugRawHash $rawHashPadded $debugRawHashPadded)) -}}`}} {{`{{- $pcrStash := (lookup "v1" "Secret" "trustee-operator-system" "pcr-stash") -}}`}} {{`{{- if $pcrStash -}}`}} {{`{{- $secretData := $pcrStash.data.json | base64dec | fromJson -}}`}} @@ -33,34 +33,34 @@ spec: {{`{{- $pcr09 := $secretData.measurements.sha256.pcr09 -}}`}} {{`{{- $pcr11 := $secretData.measurements.sha256.pcr11 -}}`}} {{`{{- $pcr12 := $secretData.measurements.sha256.pcr12 -}}`}} - {{`{{- $referenceValues = set $referenceValues "snp_pcr03" (dict "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr03)) -}}`}} - {{`{{- $referenceValues = set $referenceValues "tdx_pcr03" (dict "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr03)) -}}`}} - {{`{{- $referenceValues = set $referenceValues "snp_pcr08" (dict "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr8Hash $debugPcr8Hash)) -}}`}} - {{`{{- $referenceValues = set $referenceValues "tdx_pcr08" (dict "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr8Hash $debugPcr8Hash)) -}}`}} - {{`{{- $referenceValues = set $referenceValues "snp_pcr09" (dict "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr09)) -}}`}} - {{`{{- $referenceValues = set $referenceValues "tdx_pcr09" (dict "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr09)) -}}`}} - {{`{{- $referenceValues = set $referenceValues "snp_pcr11" (dict "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr11)) -}}`}} - {{`{{- $referenceValues = set $referenceValues "tdx_pcr11" (dict "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr11)) -}}`}} - {{`{{- $referenceValues = set $referenceValues "snp_pcr12" (dict "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr12)) -}}`}} - {{`{{- $referenceValues = set $referenceValues "tdx_pcr12" (dict "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr12)) -}}`}} + {{`{{- $referenceValues = append $referenceValues (dict "name" "snp_pcr03" "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr03)) -}}`}} + {{`{{- $referenceValues = append $referenceValues (dict "name" "tdx_pcr03" "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr03)) -}}`}} + {{`{{- $referenceValues = append $referenceValues (dict "name" "snp_pcr08" "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr8Hash $debugPcr8Hash)) -}}`}} + {{`{{- $referenceValues = append $referenceValues (dict "name" "tdx_pcr08" "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr8Hash $debugPcr8Hash)) -}}`}} + {{`{{- $referenceValues = append $referenceValues (dict "name" "snp_pcr09" "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr09)) -}}`}} + {{`{{- $referenceValues = append $referenceValues (dict "name" "tdx_pcr09" "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr09)) -}}`}} + {{`{{- $referenceValues = append $referenceValues (dict "name" "snp_pcr11" "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr11)) -}}`}} + {{`{{- $referenceValues = append $referenceValues (dict "name" "tdx_pcr11" "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr11)) -}}`}} + {{`{{- $referenceValues = append $referenceValues (dict "name" "snp_pcr12" "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr12)) -}}`}} + {{`{{- $referenceValues = append $referenceValues (dict "name" "tdx_pcr12" "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr12)) -}}`}} {{`{{- end -}}`}} {{`{{- $firmwareStash := (lookup "v1" "Secret" "trustee-operator-system" "firmware-reference-values") -}}`}} {{`{{- if $firmwareStash -}}`}} {{`{{- $firmwareData := $firmwareStash.data.json | base64dec | fromJson -}}`}} {{`{{- if $firmwareData.mr_td -}}`}} - {{`{{- $referenceValues = set $referenceValues "mr_td" (dict "expiration" "2027-12-12T00:00:00Z" "value" $firmwareData.mr_td) -}}`}} + {{`{{- $referenceValues = append $referenceValues (dict "name" "mr_td" "expiration" "2027-12-12T00:00:00Z" "value" $firmwareData.mr_td) -}}`}} {{`{{- end -}}`}} {{`{{- if $firmwareData.rtmr_1 -}}`}} - {{`{{- $referenceValues = set $referenceValues "rtmr_1" (dict "expiration" "2027-12-12T00:00:00Z" "value" $firmwareData.rtmr_1) -}}`}} + {{`{{- $referenceValues = append $referenceValues (dict "name" "rtmr_1" "expiration" "2027-12-12T00:00:00Z" "value" $firmwareData.rtmr_1) -}}`}} {{`{{- end -}}`}} {{`{{- if $firmwareData.rtmr_2 -}}`}} - {{`{{- $referenceValues = set $referenceValues "rtmr_2" (dict "expiration" "2027-12-12T00:00:00Z" "value" $firmwareData.rtmr_2) -}}`}} + {{`{{- $referenceValues = append $referenceValues (dict "name" "rtmr_2" "expiration" "2027-12-12T00:00:00Z" "value" $firmwareData.rtmr_2) -}}`}} {{`{{- end -}}`}} {{`{{- if $firmwareData.snp_launch_measurement -}}`}} - {{`{{- $referenceValues = set $referenceValues "snp_launch_measurement" (dict "expiration" "2027-12-12T00:00:00Z" "value" $firmwareData.snp_launch_measurement) -}}`}} + {{`{{- $referenceValues = append $referenceValues (dict "name" "snp_launch_measurement" "expiration" "2027-12-12T00:00:00Z" "value" $firmwareData.snp_launch_measurement) -}}`}} {{`{{- end -}}`}} {{`{{- if $firmwareData.xfam -}}`}} - {{`{{- $referenceValues = set $referenceValues "xfam" (dict "expiration" "2027-12-12T00:00:00Z" "value" $firmwareData.xfam) -}}`}} + {{`{{- $referenceValues = append $referenceValues (dict "name" "xfam" "expiration" "2027-12-12T00:00:00Z" "value" $firmwareData.xfam) -}}`}} {{`{{- end -}}`}} {{`{{- end -}}`}} - complianceType: mustonlyhave @@ -71,7 +71,7 @@ spec: name: rvps-reference-values namespace: trustee-operator-system data: - reference_value: '{{`{{ toJson $referenceValues }}`}}' + reference-values.json: '{{`{{ toJson $referenceValues }}`}}' --- apiVersion: policy.open-cluster-management.io/v1 kind: PlacementBinding From 13422a33a39ded4e14d9fe21d4e2f2bab75f6735 Mon Sep 17 00:00:00 2001 From: Chris Butler Date: Fri, 17 Jul 2026 05:24:14 +0000 Subject: [PATCH 09/18] fix: use reference_value key with v1.1 array format for RVPS The Trustee 1.2 operator hardcodes subPath=reference_value when mounting the RVPS ConfigMap, so the key must be reference_value (not reference-values.json). But the KBS v1.2.0 binary still expects v1.1 array format data. Use the v1.2 key name with v1.1 data format. Co-Authored-By: Claude Opus 4.6 (1M context) --- templates/reference-values.yaml | 2 +- templates/rvps-values-policies.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/reference-values.yaml b/templates/reference-values.yaml index 258e4af..4e97fb4 100644 --- a/templates/reference-values.yaml +++ b/templates/reference-values.yaml @@ -7,5 +7,5 @@ metadata: annotations: argocd.argoproj.io/sync-wave: "4" data: - reference-values.json: '[]' + reference_value: '[]' {{ end }} \ No newline at end of file diff --git a/templates/rvps-values-policies.yaml b/templates/rvps-values-policies.yaml index 5b97de0..5eafdd4 100644 --- a/templates/rvps-values-policies.yaml +++ b/templates/rvps-values-policies.yaml @@ -71,7 +71,7 @@ spec: name: rvps-reference-values namespace: trustee-operator-system data: - reference-values.json: '{{`{{ toJson $referenceValues }}`}}' + reference_value: '{{`{{ toJson $referenceValues }}`}}' --- apiVersion: policy.open-cluster-management.io/v1 kind: PlacementBinding From 1110b6b40fb21dd1814da9d81298948216e88082 Mon Sep 17 00:00:00 2001 From: Chris Butler Date: Fri, 17 Jul 2026 06:02:01 +0000 Subject: [PATCH 10/18] fix: complete Trustee 1.2 GitOps compatibility fixes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Add migration annotation to kbs-config-map.yaml and reference-values.yaml to prevent operator from deleting ArgoCD-managed ConfigMaps 2. Fix reference-values.yaml default from '[]' to '{}' — the LocalJson storage backend expects a JSON object 3. Rewrite rvps-values-policies.yaml to output v1.2 format: dict of URL-safe base64-encoded ReferenceValue structs (version, name, expiration, value fields per entry) 4. Add migration annotation to the ACM-policy-generated rvps-reference-values ConfigMap Addresses all issues documented in TRUSTEE-1.2-GITOPS-INCOMPATIBILITY.md Co-Authored-By: Claude Opus 4.6 (1M context) --- templates/kbs-config-map.yaml | 1 + templates/reference-values.yaml | 3 +- templates/rvps-values-policies.yaml | 53 ++++++++++++++++++++--------- 3 files changed, 39 insertions(+), 18 deletions(-) diff --git a/templates/kbs-config-map.yaml b/templates/kbs-config-map.yaml index 60cbcf6..87a54df 100644 --- a/templates/kbs-config-map.yaml +++ b/templates/kbs-config-map.yaml @@ -5,6 +5,7 @@ metadata: namespace: trustee-operator-system annotations: argocd.argoproj.io/sync-wave: "4" + kbs.confidentialcontainers.org/migrated-from-v1.1.0: v1.2.0 data: kbs-config.toml: | [http_server] diff --git a/templates/reference-values.yaml b/templates/reference-values.yaml index 4e97fb4..485d3bf 100644 --- a/templates/reference-values.yaml +++ b/templates/reference-values.yaml @@ -6,6 +6,7 @@ metadata: namespace: trustee-operator-system annotations: argocd.argoproj.io/sync-wave: "4" + kbs.confidentialcontainers.org/migrated-from-v1.1.0: v1.2.0 data: - reference_value: '[]' + reference_value: '{}' {{ end }} \ No newline at end of file diff --git a/templates/rvps-values-policies.yaml b/templates/rvps-values-policies.yaml index 5eafdd4..aa8821f 100644 --- a/templates/rvps-values-policies.yaml +++ b/templates/rvps-values-policies.yaml @@ -25,7 +25,9 @@ spec: {{`{{- $debugRawHash := fromConfigMap "imperative" "debug-initdata" "RAW_HASH" -}}`}} {{`{{- $rawHashPadded := printf "%s00000000000000000000000000000000" $rawHash -}}`}} {{`{{- $debugRawHashPadded := printf "%s00000000000000000000000000000000" $debugRawHash -}}`}} - {{`{{- $referenceValues := list (dict "name" "init_data" "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr8Hash $debugPcr8Hash $rawHash $debugRawHash $rawHashPadded $debugRawHashPadded)) -}}`}} + {{`{{- $referenceValues := dict -}}`}} + {{`{{- $entry := dict "version" "0.1.0" "name" "init_data" "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr8Hash $debugPcr8Hash $rawHash $debugRawHash $rawHashPadded $debugRawHashPadded) -}}`}} + {{`{{- $referenceValues = set $referenceValues "init_data" (toJson $entry | base64enc | replace "+" "-" | replace "/" "_") -}}`}} {{`{{- $pcrStash := (lookup "v1" "Secret" "trustee-operator-system" "pcr-stash") -}}`}} {{`{{- if $pcrStash -}}`}} {{`{{- $secretData := $pcrStash.data.json | base64dec | fromJson -}}`}} @@ -33,34 +35,49 @@ spec: {{`{{- $pcr09 := $secretData.measurements.sha256.pcr09 -}}`}} {{`{{- $pcr11 := $secretData.measurements.sha256.pcr11 -}}`}} {{`{{- $pcr12 := $secretData.measurements.sha256.pcr12 -}}`}} - {{`{{- $referenceValues = append $referenceValues (dict "name" "snp_pcr03" "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr03)) -}}`}} - {{`{{- $referenceValues = append $referenceValues (dict "name" "tdx_pcr03" "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr03)) -}}`}} - {{`{{- $referenceValues = append $referenceValues (dict "name" "snp_pcr08" "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr8Hash $debugPcr8Hash)) -}}`}} - {{`{{- $referenceValues = append $referenceValues (dict "name" "tdx_pcr08" "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr8Hash $debugPcr8Hash)) -}}`}} - {{`{{- $referenceValues = append $referenceValues (dict "name" "snp_pcr09" "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr09)) -}}`}} - {{`{{- $referenceValues = append $referenceValues (dict "name" "tdx_pcr09" "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr09)) -}}`}} - {{`{{- $referenceValues = append $referenceValues (dict "name" "snp_pcr11" "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr11)) -}}`}} - {{`{{- $referenceValues = append $referenceValues (dict "name" "tdx_pcr11" "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr11)) -}}`}} - {{`{{- $referenceValues = append $referenceValues (dict "name" "snp_pcr12" "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr12)) -}}`}} - {{`{{- $referenceValues = append $referenceValues (dict "name" "tdx_pcr12" "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr12)) -}}`}} + {{`{{- $e := dict "version" "0.1.0" "name" "snp_pcr03" "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr03) -}}`}} + {{`{{- $referenceValues = set $referenceValues "snp_pcr03" (toJson $e | base64enc | replace "+" "-" | replace "/" "_") -}}`}} + {{`{{- $e = dict "version" "0.1.0" "name" "tdx_pcr03" "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr03) -}}`}} + {{`{{- $referenceValues = set $referenceValues "tdx_pcr03" (toJson $e | base64enc | replace "+" "-" | replace "/" "_") -}}`}} + {{`{{- $e = dict "version" "0.1.0" "name" "snp_pcr08" "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr8Hash $debugPcr8Hash) -}}`}} + {{`{{- $referenceValues = set $referenceValues "snp_pcr08" (toJson $e | base64enc | replace "+" "-" | replace "/" "_") -}}`}} + {{`{{- $e = dict "version" "0.1.0" "name" "tdx_pcr08" "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr8Hash $debugPcr8Hash) -}}`}} + {{`{{- $referenceValues = set $referenceValues "tdx_pcr08" (toJson $e | base64enc | replace "+" "-" | replace "/" "_") -}}`}} + {{`{{- $e = dict "version" "0.1.0" "name" "snp_pcr09" "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr09) -}}`}} + {{`{{- $referenceValues = set $referenceValues "snp_pcr09" (toJson $e | base64enc | replace "+" "-" | replace "/" "_") -}}`}} + {{`{{- $e = dict "version" "0.1.0" "name" "tdx_pcr09" "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr09) -}}`}} + {{`{{- $referenceValues = set $referenceValues "tdx_pcr09" (toJson $e | base64enc | replace "+" "-" | replace "/" "_") -}}`}} + {{`{{- $e = dict "version" "0.1.0" "name" "snp_pcr11" "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr11) -}}`}} + {{`{{- $referenceValues = set $referenceValues "snp_pcr11" (toJson $e | base64enc | replace "+" "-" | replace "/" "_") -}}`}} + {{`{{- $e = dict "version" "0.1.0" "name" "tdx_pcr11" "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr11) -}}`}} + {{`{{- $referenceValues = set $referenceValues "tdx_pcr11" (toJson $e | base64enc | replace "+" "-" | replace "/" "_") -}}`}} + {{`{{- $e = dict "version" "0.1.0" "name" "snp_pcr12" "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr12) -}}`}} + {{`{{- $referenceValues = set $referenceValues "snp_pcr12" (toJson $e | base64enc | replace "+" "-" | replace "/" "_") -}}`}} + {{`{{- $e = dict "version" "0.1.0" "name" "tdx_pcr12" "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr12) -}}`}} + {{`{{- $referenceValues = set $referenceValues "tdx_pcr12" (toJson $e | base64enc | replace "+" "-" | replace "/" "_") -}}`}} {{`{{- end -}}`}} {{`{{- $firmwareStash := (lookup "v1" "Secret" "trustee-operator-system" "firmware-reference-values") -}}`}} {{`{{- if $firmwareStash -}}`}} {{`{{- $firmwareData := $firmwareStash.data.json | base64dec | fromJson -}}`}} {{`{{- if $firmwareData.mr_td -}}`}} - {{`{{- $referenceValues = append $referenceValues (dict "name" "mr_td" "expiration" "2027-12-12T00:00:00Z" "value" $firmwareData.mr_td) -}}`}} + {{`{{- $e := dict "version" "0.1.0" "name" "mr_td" "expiration" "2027-12-12T00:00:00Z" "value" $firmwareData.mr_td -}}`}} + {{`{{- $referenceValues = set $referenceValues "mr_td" (toJson $e | base64enc | replace "+" "-" | replace "/" "_") -}}`}} {{`{{- end -}}`}} {{`{{- if $firmwareData.rtmr_1 -}}`}} - {{`{{- $referenceValues = append $referenceValues (dict "name" "rtmr_1" "expiration" "2027-12-12T00:00:00Z" "value" $firmwareData.rtmr_1) -}}`}} + {{`{{- $e := dict "version" "0.1.0" "name" "rtmr_1" "expiration" "2027-12-12T00:00:00Z" "value" $firmwareData.rtmr_1 -}}`}} + {{`{{- $referenceValues = set $referenceValues "rtmr_1" (toJson $e | base64enc | replace "+" "-" | replace "/" "_") -}}`}} {{`{{- end -}}`}} {{`{{- if $firmwareData.rtmr_2 -}}`}} - {{`{{- $referenceValues = append $referenceValues (dict "name" "rtmr_2" "expiration" "2027-12-12T00:00:00Z" "value" $firmwareData.rtmr_2) -}}`}} + {{`{{- $e := dict "version" "0.1.0" "name" "rtmr_2" "expiration" "2027-12-12T00:00:00Z" "value" $firmwareData.rtmr_2 -}}`}} + {{`{{- $referenceValues = set $referenceValues "rtmr_2" (toJson $e | base64enc | replace "+" "-" | replace "/" "_") -}}`}} {{`{{- end -}}`}} {{`{{- if $firmwareData.snp_launch_measurement -}}`}} - {{`{{- $referenceValues = append $referenceValues (dict "name" "snp_launch_measurement" "expiration" "2027-12-12T00:00:00Z" "value" $firmwareData.snp_launch_measurement) -}}`}} + {{`{{- $e := dict "version" "0.1.0" "name" "snp_launch_measurement" "expiration" "2027-12-12T00:00:00Z" "value" $firmwareData.snp_launch_measurement -}}`}} + {{`{{- $referenceValues = set $referenceValues "snp_launch_measurement" (toJson $e | base64enc | replace "+" "-" | replace "/" "_") -}}`}} {{`{{- end -}}`}} {{`{{- if $firmwareData.xfam -}}`}} - {{`{{- $referenceValues = append $referenceValues (dict "name" "xfam" "expiration" "2027-12-12T00:00:00Z" "value" $firmwareData.xfam) -}}`}} + {{`{{- $e := dict "version" "0.1.0" "name" "xfam" "expiration" "2027-12-12T00:00:00Z" "value" $firmwareData.xfam -}}`}} + {{`{{- $referenceValues = set $referenceValues "xfam" (toJson $e | base64enc | replace "+" "-" | replace "/" "_") -}}`}} {{`{{- end -}}`}} {{`{{- end -}}`}} - complianceType: mustonlyhave @@ -70,6 +87,8 @@ spec: metadata: name: rvps-reference-values namespace: trustee-operator-system + annotations: + kbs.confidentialcontainers.org/migrated-from-v1.1.0: v1.2.0 data: reference_value: '{{`{{ toJson $referenceValues }}`}}' --- @@ -103,4 +122,4 @@ spec: matchLabels: local-cluster: "true" --- -{{ end }} \ No newline at end of file +{{ end }} From dff03040ee1e2eb55e492934af3ad9cd5581d7b0 Mon Sep 17 00:00:00 2001 From: Chris Butler Date: Fri, 17 Jul 2026 06:07:20 +0000 Subject: [PATCH 11/18] fix: add migration annotations and TCB OutOfDate fallback MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - kbs-config-map.yaml: add migration annotation - reference-values.yaml: add migration annotation, fix default to '{}' - attestation-policy.yaml: add hardware fallback for TCB OutOfDate (trust score 3 instead of 2) — Intel platforms commonly report OutOfDate TCB when microcode updates lag behind advisories Co-Authored-By: Claude Opus 4.6 (1M context) --- templates/attestation-policy.yaml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/templates/attestation-policy.yaml b/templates/attestation-policy.yaml index d4270be..796a0a3 100644 --- a/templates/attestation-policy.yaml +++ b/templates/attestation-policy.yaml @@ -241,6 +241,18 @@ data: input["tdx"].collateral_expiration_status == "0" } + # Fallback: TCB OutOfDate — hardware is real TDX but has known advisories + else := 3 if { + input["tdx"] + + input["tdx"].quote.header.tee_type == "81000000" + input["tdx"].quote.header.vendor_id == "939a7233f79c4ca9940a0db3957f0607" + + input["tdx"].quote.body.mr_td in query_reference_value("mr_td") + + input["tdx"].collateral_expiration_status == "0" + } + configuration := 2 if { input["tdx"] From 3fddd0c2ab7ca2341047962f98dbdc122852c531 Mon Sep 17 00:00:00 2001 From: Chris Butler Date: Fri, 17 Jul 2026 22:41:21 +0000 Subject: [PATCH 12/18] feat: add sealed secrets signing key ESO and KBS resource - sealed-secrets-signing-eso.yaml: sync public JWK from Vault to K8s Secret 'signing-key' in trustee-operator-system namespace - kbs.yaml: add 'signing-key' to kbsSecretResources so KBS can serve the public key at kbs:///default/signing-key/public Guest CDH uses the kid URI to fetch the public key for sealed secret signature verification during unsealing. Co-Authored-By: Claude Opus 4.6 (1M context) --- templates/kbs.yaml | 1 + templates/sealed-secrets-signing-eso.yaml | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 templates/sealed-secrets-signing-eso.yaml diff --git a/templates/kbs.yaml b/templates/kbs.yaml index 0389722..1718c95 100644 --- a/templates/kbs.yaml +++ b/templates/kbs.yaml @@ -22,6 +22,7 @@ spec: {{- end }} - "security-policy" - "attestation-status" + - "signing-key" kbsHttpsKeySecretName: kbs-https-key kbsHttpsCertSecretName: kbs-https-certificate kbsResourcePolicyConfigMapName: resource-policy diff --git a/templates/sealed-secrets-signing-eso.yaml b/templates/sealed-secrets-signing-eso.yaml new file mode 100644 index 0000000..8db1dbb --- /dev/null +++ b/templates/sealed-secrets-signing-eso.yaml @@ -0,0 +1,22 @@ +{{- if ne .Values.global.secretStore.backend "none" }} +--- +apiVersion: "external-secrets.io/v1" +kind: ExternalSecret +metadata: + annotations: + argocd.argoproj.io/sync-wave: "1" + name: sealed-secrets-signing-key-eso + namespace: trustee-operator-system +spec: + refreshInterval: 15s + secretStoreRef: + name: {{ .Values.secretStore.name }} + kind: {{ .Values.secretStore.kind }} + target: + name: signing-key + template: + type: Opaque + dataFrom: + - extract: + key: secret/data/hub/sealedSecretsSigningKey +{{- end }} From 92f0d7fd6ba90ed6a3fb63ab6b41eb1b1e248919 Mon Sep 17 00:00:00 2001 From: Chris Butler Date: Mon, 20 Jul 2026 12:35:41 +0000 Subject: [PATCH 13/18] feat(16): add Azure SNP platform config defaults for attestation Add hardcoded Azure DCasv5 platform configuration reference values (measurement, smt_enabled, tsme_enabled, abi_major, abi_minor, single_socket, smt_allowed) as configurable defaults in values.yaml. These are Azure platform constants for the CVM firmware and SEV-SNP policy. They are required by the attestation policy for configuration and executables trust claims but are not produced by veritas. The SNP launch measurement is static per Azure CVM firmware generation and will only change when Azure updates UEFI/vTPM firmware. Co-Authored-By: Claude Opus 4.6 (1M context) --- templates/rvps-values-policies.yaml | 18 +++++++++++++++++ values.yaml | 31 +++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/templates/rvps-values-policies.yaml b/templates/rvps-values-policies.yaml index aa8821f..42290d2 100644 --- a/templates/rvps-values-policies.yaml +++ b/templates/rvps-values-policies.yaml @@ -80,6 +80,24 @@ spec: {{`{{- $referenceValues = set $referenceValues "xfam" (toJson $e | base64enc | replace "+" "-" | replace "/" "_") -}}`}} {{`{{- end -}}`}} {{`{{- end -}}`}} + {{- if .Values.kbs.azure }} + {{- with .Values.kbs.azure }} + {{`{{- $e := dict "version" "0.1.0" "name" "measurement" "expiration" "2099-12-31T00:00:00Z" "value" (list `}} "{{ .snpLaunchMeasurement }}" {{`) -}}`}} + {{`{{- $referenceValues = set $referenceValues "measurement" (toJson $e | base64enc | replace "+" "-" | replace "/" "_") -}}`}} + {{`{{- $e = dict "version" "0.1.0" "name" "smt_enabled" "expiration" "2099-12-31T00:00:00Z" "value" (list `}} "{{ .smtEnabled }}" {{`) -}}`}} + {{`{{- $referenceValues = set $referenceValues "smt_enabled" (toJson $e | base64enc | replace "+" "-" | replace "/" "_") -}}`}} + {{`{{- $e = dict "version" "0.1.0" "name" "tsme_enabled" "expiration" "2099-12-31T00:00:00Z" "value" (list `}} "{{ .tsmeEnabled }}" {{`) -}}`}} + {{`{{- $referenceValues = set $referenceValues "tsme_enabled" (toJson $e | base64enc | replace "+" "-" | replace "/" "_") -}}`}} + {{`{{- $e = dict "version" "0.1.0" "name" "abi_major" "expiration" "2099-12-31T00:00:00Z" "value" (list `}} "{{ .abiMajor }}" {{`) -}}`}} + {{`{{- $referenceValues = set $referenceValues "abi_major" (toJson $e | base64enc | replace "+" "-" | replace "/" "_") -}}`}} + {{`{{- $e = dict "version" "0.1.0" "name" "abi_minor" "expiration" "2099-12-31T00:00:00Z" "value" (list `}} "{{ .abiMinor }}" {{`) -}}`}} + {{`{{- $referenceValues = set $referenceValues "abi_minor" (toJson $e | base64enc | replace "+" "-" | replace "/" "_") -}}`}} + {{`{{- $e = dict "version" "0.1.0" "name" "single_socket" "expiration" "2099-12-31T00:00:00Z" "value" (list `}} "{{ .singleSocket }}" {{`) -}}`}} + {{`{{- $referenceValues = set $referenceValues "single_socket" (toJson $e | base64enc | replace "+" "-" | replace "/" "_") -}}`}} + {{`{{- $e = dict "version" "0.1.0" "name" "smt_allowed" "expiration" "2099-12-31T00:00:00Z" "value" (list `}} "{{ .smtAllowed }}" {{`) -}}`}} + {{`{{- $referenceValues = set $referenceValues "smt_allowed" (toJson $e | base64enc | replace "+" "-" | replace "/" "_") -}}`}} + {{- end }} + {{- end }} - complianceType: mustonlyhave objectDefinition: apiVersion: v1 diff --git a/values.yaml b/values.yaml index fabdb3f..93fa0aa 100644 --- a/values.yaml +++ b/values.yaml @@ -70,6 +70,37 @@ kbs: # See docs/firmware-reference-values.md in coco-pattern for collection workflow enabled: false + # Azure SEV-SNP platform configuration reference values + # These are used by the attestation policy to verify the CVM configuration. + # The values below are defaults for Azure DCasv5-series VMs (AMD SEV-SNP). + # + # These are Azure platform constants that describe the SEV-SNP policy + # enforced by Azure for confidential VMs. They may vary by: + # + # VM Series | SMT | TSME | ABI Minor | Notes + # ----------------|-----|------|-----------|------ + # DCasv5 (Genoa) | true| true | 31 | Standard CoCo peer-pod VMs + # DCadsv5 (Genoa) | true| true | 31 | With local NVMe + # ECasv5 (Genoa) | true| true | 31 | Memory-optimized + # DCesv5 (Milan) | true| true | 31 | Earlier generation, may differ + # + # The SNP launch measurement (snpLaunchMeasurement) is a hash of the + # Azure UEFI firmware + vTPM initial state. It is static per Azure CVM + # firmware generation but will change when Azure updates the firmware. + # It is NOT derived from the workload image — it is an Azure platform + # constant for the VM type. + # + # If attestation fails on configuration/executables claims, check the + # trustee logs for the actual values reported by the VM and update these. + azure: + snpLaunchMeasurement: "qnydpVwThuWxZTsSWXi+2ns/laha6w+d2723g84FaijJ0CHaI5w0pYw6ZXZUJw7v" + smtEnabled: "true" + tsmeEnabled: "true" + abiMajor: "0" + abiMinor: "31" + singleSocket: "false" + smtAllowed: "true" + # Resource policy configuration resourcePolicy: # Enforce hardware trust claims in resource policy From 258a04929da6a438879eef6053a98353c11b350f Mon Sep 17 00:00:00 2001 From: Chris Butler Date: Mon, 20 Jul 2026 13:05:04 +0000 Subject: [PATCH 14/18] fix(16): add RVPS file_dir_path to KBS config for LocalJson storage MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The RVPS BuiltIn LocalJson storage needs file_dir_path to know where to read reference values. Without it, query_reference_value() returns empty — causing attestation policy to use default (contraindicated) trust claims for configuration and executables. Co-Authored-By: Claude Opus 4.6 (1M context) --- templates/kbs-config-map.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/templates/kbs-config-map.yaml b/templates/kbs-config-map.yaml index 87a54df..1edc903 100644 --- a/templates/kbs-config-map.yaml +++ b/templates/kbs-config-map.yaml @@ -40,6 +40,7 @@ data: [attestation_service.rvps_config] type = "BuiltIn" storage_type = "LocalJson" + file_dir_path = "/opt/confidential-containers/storage/local_json" {{- if .Values.kbs.gpu.enabled }} [attestation_service.verifier_config.nvidia_verifier] From 2655d4b87874ee000f2cc0194da37c4a11faa17c Mon Sep 17 00:00:00 2001 From: Chris Butler Date: Mon, 20 Jul 2026 13:35:26 +0000 Subject: [PATCH 15/18] fix(16): use dashes in attestation policy TEE keys (az-snp-vtpm, az-tdx-vtpm) The Trustee AS passes evidence to OPA with dashes (az-snp-vtpm) per the EAR token annotated_evidence key. The policy was using underscores (az_snp_vtpm), causing input["az_snp_vtpm"] to be undefined and all rules to fall through to defaults. Co-Authored-By: Claude Opus 4.6 (1M context) --- templates/attestation-policy.yaml | 80 +++++++++++++++---------------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/templates/attestation-policy.yaml b/templates/attestation-policy.yaml index 796a0a3..2b19b91 100644 --- a/templates/attestation-policy.yaml +++ b/templates/attestation-policy.yaml @@ -106,30 +106,30 @@ data: ##### Azure vTPM SNP executables := 3 if { - input["az_snp_vtpm"] - - input["az_snp_vtpm"].measurement in query_reference_value("measurement") - input["az_snp_vtpm"].tpm.pcr03 in query_reference_value("snp_pcr03") - input["az_snp_vtpm"].tpm.pcr08 in query_reference_value("snp_pcr08") - input["az_snp_vtpm"].tpm.pcr09 in query_reference_value("snp_pcr09") - input["az_snp_vtpm"].tpm.pcr11 in query_reference_value("snp_pcr11") - input["az_snp_vtpm"].tpm.pcr12 in query_reference_value("snp_pcr12") + input["az-snp-vtpm"] + + input["az-snp-vtpm"].measurement in query_reference_value("measurement") + input["az-snp-vtpm"].tpm.pcr03 in query_reference_value("snp_pcr03") + input["az-snp-vtpm"].tpm.pcr08 in query_reference_value("snp_pcr08") + input["az-snp-vtpm"].tpm.pcr09 in query_reference_value("snp_pcr09") + input["az-snp-vtpm"].tpm.pcr11 in query_reference_value("snp_pcr11") + input["az-snp-vtpm"].tpm.pcr12 in query_reference_value("snp_pcr12") } hardware := 2 if { - input["az_snp_vtpm"] + input["az-snp-vtpm"] # Check the reported TCB to validate the ASP FW count(query_reference_value("tcb_bootloader")) > 0 - input["az_snp_vtpm"].reported_tcb_bootloader in query_reference_value("tcb_bootloader") - input["az_snp_vtpm"].reported_tcb_microcode in query_reference_value("tcb_microcode") - input["az_snp_vtpm"].reported_tcb_snp in query_reference_value("tcb_snp") - input["az_snp_vtpm"].reported_tcb_tee in query_reference_value("tcb_tee") + input["az-snp-vtpm"].reported_tcb_bootloader in query_reference_value("tcb_bootloader") + input["az-snp-vtpm"].reported_tcb_microcode in query_reference_value("tcb_microcode") + input["az-snp-vtpm"].reported_tcb_snp in query_reference_value("tcb_snp") + input["az-snp-vtpm"].reported_tcb_tee in query_reference_value("tcb_tee") } # Fallback: TCB reference values not collected for Azure yet else := 3 if { - input["az_snp_vtpm"] + input["az-snp-vtpm"] } # For the 'configuration' trust claim 2 stands for @@ -137,67 +137,67 @@ data: # # For this, we compare all the configuration fields. configuration := 2 if { - input["az_snp_vtpm"] + input["az-snp-vtpm"] count(query_reference_value("smt_enabled")) > 0 - input["az_snp_vtpm"].platform_smt_enabled in query_reference_value("smt_enabled") - input["az_snp_vtpm"].platform_tsme_enabled in query_reference_value("tsme_enabled") - input["az_snp_vtpm"].policy_abi_major in query_reference_value("abi_major") - input["az_snp_vtpm"].policy_abi_minor in query_reference_value("abi_minor") - input["az_snp_vtpm"].policy_single_socket in query_reference_value("single_socket") - input["az_snp_vtpm"].policy_smt_allowed in query_reference_value("smt_allowed") + input["az-snp-vtpm"].platform_smt_enabled in query_reference_value("smt_enabled") + input["az-snp-vtpm"].platform_tsme_enabled in query_reference_value("tsme_enabled") + input["az-snp-vtpm"].policy_abi_major in query_reference_value("abi_major") + input["az-snp-vtpm"].policy_abi_minor in query_reference_value("abi_minor") + input["az-snp-vtpm"].policy_single_socket in query_reference_value("single_socket") + input["az-snp-vtpm"].policy_smt_allowed in query_reference_value("smt_allowed") } # Fallback: configuration reference values not available else := 3 if { - input["az_snp_vtpm"] + input["az-snp-vtpm"] } ##### Azure vTPM TDX executables := 3 if { - input["az_tdx_vtpm"] + input["az-tdx-vtpm"] - input["az_tdx_vtpm"].tpm.pcr03 in query_reference_value("tdx_pcr03") - input["az_tdx_vtpm"].tpm.pcr08 in query_reference_value("tdx_pcr08") - input["az_tdx_vtpm"].tpm.pcr09 in query_reference_value("tdx_pcr09") - input["az_tdx_vtpm"].tpm.pcr11 in query_reference_value("tdx_pcr11") - input["az_tdx_vtpm"].tpm.pcr12 in query_reference_value("tdx_pcr12") + input["az-tdx-vtpm"].tpm.pcr03 in query_reference_value("tdx_pcr03") + input["az-tdx-vtpm"].tpm.pcr08 in query_reference_value("tdx_pcr08") + input["az-tdx-vtpm"].tpm.pcr09 in query_reference_value("tdx_pcr09") + input["az-tdx-vtpm"].tpm.pcr11 in query_reference_value("tdx_pcr11") + input["az-tdx-vtpm"].tpm.pcr12 in query_reference_value("tdx_pcr12") } hardware := 2 if { - input["az_tdx_vtpm"] + input["az-tdx-vtpm"] # Check the quote is a TDX quote signed by Intel SGX Quoting Enclave - input["az_tdx_vtpm"].quote.header.tee_type == "81000000" - input["az_tdx_vtpm"].quote.header.vendor_id == "939a7233f79c4ca9940a0db3957f0607" + input["az-tdx-vtpm"].quote.header.tee_type == "81000000" + input["az-tdx-vtpm"].quote.header.vendor_id == "939a7233f79c4ca9940a0db3957f0607" # Check OVMF code hash count(query_reference_value("mr_td")) > 0 - input["az_tdx_vtpm"].quote.body.mr_td in query_reference_value("mr_td") + input["az-tdx-vtpm"].quote.body.mr_td in query_reference_value("mr_td") # Check TCB status (covers quote.body.tcb_svn claim check) - input["az_tdx_vtpm"].tcb_status == "UpToDate" + input["az-tdx-vtpm"].tcb_status == "UpToDate" } # Fallback: mr_td reference values not collected for Azure yet else := 3 if { - input["az_tdx_vtpm"] + input["az-tdx-vtpm"] - input["az_tdx_vtpm"].quote.header.tee_type == "81000000" - input["az_tdx_vtpm"].quote.header.vendor_id == "939a7233f79c4ca9940a0db3957f0607" - input["az_tdx_vtpm"].tcb_status == "UpToDate" + input["az-tdx-vtpm"].quote.header.tee_type == "81000000" + input["az-tdx-vtpm"].quote.header.vendor_id == "939a7233f79c4ca9940a0db3957f0607" + input["az-tdx-vtpm"].tcb_status == "UpToDate" } configuration := 2 if { - input["az_tdx_vtpm"] + input["az-tdx-vtpm"] count(query_reference_value("xfam")) > 0 - input["az_tdx_vtpm"].quote.body.xfam in query_reference_value("xfam") + input["az-tdx-vtpm"].quote.body.xfam in query_reference_value("xfam") } # Fallback: xfam reference values not available else := 3 if { - input["az_tdx_vtpm"] + input["az-tdx-vtpm"] } ##### Bare Metal TDX From 2b99d316919af7276629e1e39226b8432199744f Mon Sep 17 00:00:00 2001 From: Chris Butler Date: Mon, 20 Jul 2026 13:39:29 +0000 Subject: [PATCH 16/18] fix(16): add null guards for query_reference_value in attestation policy count(query_reference_value("key")) errors with "count requires array/object/set/string, got null" when the key doesn't exist in RVPS. This kills the entire OPA policy evaluation, preventing all rules (including fallbacks) from firing. Add null != check before count() to let the rule evaluate to false instead of erroring, allowing else fallbacks to work. Co-Authored-By: Claude Opus 4.6 (1M context) --- templates/attestation-policy.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/templates/attestation-policy.yaml b/templates/attestation-policy.yaml index 2b19b91..8ff2227 100644 --- a/templates/attestation-policy.yaml +++ b/templates/attestation-policy.yaml @@ -120,6 +120,7 @@ data: input["az-snp-vtpm"] # Check the reported TCB to validate the ASP FW + query_reference_value("tcb_bootloader") != null count(query_reference_value("tcb_bootloader")) > 0 input["az-snp-vtpm"].reported_tcb_bootloader in query_reference_value("tcb_bootloader") input["az-snp-vtpm"].reported_tcb_microcode in query_reference_value("tcb_microcode") @@ -139,6 +140,7 @@ data: configuration := 2 if { input["az-snp-vtpm"] + query_reference_value("smt_enabled") != null count(query_reference_value("smt_enabled")) > 0 input["az-snp-vtpm"].platform_smt_enabled in query_reference_value("smt_enabled") input["az-snp-vtpm"].platform_tsme_enabled in query_reference_value("tsme_enabled") @@ -172,6 +174,7 @@ data: input["az-tdx-vtpm"].quote.header.vendor_id == "939a7233f79c4ca9940a0db3957f0607" # Check OVMF code hash + query_reference_value("mr_td") != null count(query_reference_value("mr_td")) > 0 input["az-tdx-vtpm"].quote.body.mr_td in query_reference_value("mr_td") @@ -191,6 +194,7 @@ data: configuration := 2 if { input["az-tdx-vtpm"] + query_reference_value("xfam") != null count(query_reference_value("xfam")) > 0 input["az-tdx-vtpm"].quote.body.xfam in query_reference_value("xfam") } From 07ea4d06cd99e43e1591c3a99b48c62933358f5c Mon Sep 17 00:00:00 2001 From: Chris Butler Date: Mon, 20 Jul 2026 13:42:05 +0000 Subject: [PATCH 17/18] fix(16): align Azure attestation policy with upstream operator defaults MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Comment out measurement, TCB, and config checks for az-snp-vtpm (upstream has these commented out — Azure manages these at platform level) - Comment out mr_td, xfam checks for az-tdx-vtpm (per upstream) - Remove else fallbacks that were unreachable due to count(null) errors - Keep PCR checks active (snp_pcr03/08/09/11/12) as upstream does - hardware=2 and configuration=2 now granted when az-snp-vtpm present (matching upstream behavior) Root cause: count(query_reference_value("tcb_bootloader")) crashed with "count requires array, got null" killing entire OPA evaluation. Co-Authored-By: Claude Opus 4.6 (1M context) --- templates/attestation-policy.yaml | 64 +++++++++---------------------- 1 file changed, 18 insertions(+), 46 deletions(-) diff --git a/templates/attestation-policy.yaml b/templates/attestation-policy.yaml index 8ff2227..dc0d72a 100644 --- a/templates/attestation-policy.yaml +++ b/templates/attestation-policy.yaml @@ -108,7 +108,8 @@ data: executables := 3 if { input["az-snp-vtpm"] - input["az-snp-vtpm"].measurement in query_reference_value("measurement") + # measurement check commented out per upstream default (launch measurement is Azure platform constant) + # input["az-snp-vtpm"].measurement in query_reference_value("measurement") input["az-snp-vtpm"].tpm.pcr03 in query_reference_value("snp_pcr03") input["az-snp-vtpm"].tpm.pcr08 in query_reference_value("snp_pcr08") input["az-snp-vtpm"].tpm.pcr09 in query_reference_value("snp_pcr09") @@ -119,40 +120,23 @@ data: hardware := 2 if { input["az-snp-vtpm"] - # Check the reported TCB to validate the ASP FW - query_reference_value("tcb_bootloader") != null - count(query_reference_value("tcb_bootloader")) > 0 - input["az-snp-vtpm"].reported_tcb_bootloader in query_reference_value("tcb_bootloader") - input["az-snp-vtpm"].reported_tcb_microcode in query_reference_value("tcb_microcode") - input["az-snp-vtpm"].reported_tcb_snp in query_reference_value("tcb_snp") - input["az-snp-vtpm"].reported_tcb_tee in query_reference_value("tcb_tee") - } - - # Fallback: TCB reference values not collected for Azure yet - else := 3 if { - input["az-snp-vtpm"] + # TCB checks commented out per upstream default — Azure manages TCB validation + # input["az-snp-vtpm"].reported_tcb_bootloader in query_reference_value("tcb_bootloader") + # input["az-snp-vtpm"].reported_tcb_microcode in query_reference_value("tcb_microcode") + # input["az-snp-vtpm"].reported_tcb_snp in query_reference_value("tcb_snp") + # input["az-snp-vtpm"].reported_tcb_tee in query_reference_value("tcb_tee") } - # For the 'configuration' trust claim 2 stands for - # "The configuration is a known and approved config." - # - # For this, we compare all the configuration fields. configuration := 2 if { input["az-snp-vtpm"] - query_reference_value("smt_enabled") != null - count(query_reference_value("smt_enabled")) > 0 - input["az-snp-vtpm"].platform_smt_enabled in query_reference_value("smt_enabled") - input["az-snp-vtpm"].platform_tsme_enabled in query_reference_value("tsme_enabled") - input["az-snp-vtpm"].policy_abi_major in query_reference_value("abi_major") - input["az-snp-vtpm"].policy_abi_minor in query_reference_value("abi_minor") - input["az-snp-vtpm"].policy_single_socket in query_reference_value("single_socket") - input["az-snp-vtpm"].policy_smt_allowed in query_reference_value("smt_allowed") - } - - # Fallback: configuration reference values not available - else := 3 if { - input["az-snp-vtpm"] + # Config checks commented out per upstream default — Azure platform constants + # input["az-snp-vtpm"].platform_smt_enabled in query_reference_value("smt_enabled") + # input["az-snp-vtpm"].platform_tsme_enabled in query_reference_value("tsme_enabled") + # input["az-snp-vtpm"].policy_abi_major in query_reference_value("abi_major") + # input["az-snp-vtpm"].policy_abi_minor in query_reference_value("abi_minor") + # input["az-snp-vtpm"].policy_single_socket in query_reference_value("single_socket") + # input["az-snp-vtpm"].policy_smt_allowed in query_reference_value("smt_allowed") } ##### Azure vTPM TDX @@ -173,30 +157,18 @@ data: input["az-tdx-vtpm"].quote.header.tee_type == "81000000" input["az-tdx-vtpm"].quote.header.vendor_id == "939a7233f79c4ca9940a0db3957f0607" - # Check OVMF code hash - query_reference_value("mr_td") != null - count(query_reference_value("mr_td")) > 0 - input["az-tdx-vtpm"].quote.body.mr_td in query_reference_value("mr_td") + # mr_td and OVMF checks commented out per upstream default + # input["az-tdx-vtpm"].quote.body.mr_td in query_reference_value("mr_td") # Check TCB status (covers quote.body.tcb_svn claim check) input["az-tdx-vtpm"].tcb_status == "UpToDate" } - # Fallback: mr_td reference values not collected for Azure yet - else := 3 if { - input["az-tdx-vtpm"] - - input["az-tdx-vtpm"].quote.header.tee_type == "81000000" - input["az-tdx-vtpm"].quote.header.vendor_id == "939a7233f79c4ca9940a0db3957f0607" - input["az-tdx-vtpm"].tcb_status == "UpToDate" - } - configuration := 2 if { input["az-tdx-vtpm"] - query_reference_value("xfam") != null - count(query_reference_value("xfam")) > 0 - input["az-tdx-vtpm"].quote.body.xfam in query_reference_value("xfam") + # xfam check commented out per upstream default + # input["az-tdx-vtpm"].quote.body.xfam in query_reference_value("xfam") } # Fallback: xfam reference values not available From 02828641375f5848517c70cf73465c8b0f354ada Mon Sep 17 00:00:00 2001 From: Chris Butler Date: Tue, 21 Jul 2026 03:51:29 +0000 Subject: [PATCH 18/18] fix(16): skip KBS credential policy on Azure peer-pods Azure peer-pods CDH does not fetch registry credentials from KBS via authenticated_registry_credentials_uri. Pull secrets are distributed to workload namespace SAs instead (sandboxed-policies-chart ps-dist). The credential Secret in trustee-operator-system is only needed for baremetal kata where CDH fetches kbs:///default/credential/regcred. Co-Authored-By: Claude Opus 4.6 (1M context) --- templates/pull-secret-credential-policy.yaml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/templates/pull-secret-credential-policy.yaml b/templates/pull-secret-credential-policy.yaml index 20fb76e..c456d44 100644 --- a/templates/pull-secret-credential-policy.yaml +++ b/templates/pull-secret-credential-policy.yaml @@ -1,4 +1,7 @@ -{{ if eq .Values.global.coco.secured true }} +{{- if and (eq .Values.global.coco.secured true) (ne .Values.global.clusterPlatform "Azure") }} +{{- /* On Azure peer-pods, CDH does not fetch registry credentials from KBS. + Pull secrets are distributed to workload namespace SAs instead + (see sandboxed-policies-chart/pull-secret-distribution.yaml). */ -}} --- apiVersion: policy.open-cluster-management.io/v1 kind: Policy