Skip to content

Commit 5844a0f

Browse files
authored
feat: add firmware reference values ESO and RVPS integration (#27)
Enable bare metal attestation policy enforcement using firmware measurements (Intel TDX / AMD SEV-SNP) collected via veritas and stored in Vault. **New template:** - templates/firmware-refvals-eso.yaml: ExternalSecret (gated on kbs.baremetal.enabled) Pulls from secret/data/hub/firmwareReferenceValues into firmware-reference-values secret in trustee-operator-system namespace **Modified template:** - templates/rvps-values-policies.yaml: Add firmware reference value block Reads firmware-reference-values secret and appends to RVPS ConfigMap: - mr_td: TDX initial TD measurement (SHA-384) - rtmr_1: TDX firmware + bootloader (SHA-384) - rtmr_2: TDX kernel + initrd (SHA-384) - snp_launch_measurement: SNP initial memory measurement (SHA-384) - xfam: TDX extended feature mask (hex) Each value is an array (supports multi-version via merged values) Conditionally appends only if key exists in secret **New value:** - kbs.baremetal.enabled: false (default off, enabled per-profile) Controls firmware ESO creation and enables bare metal-specific features **Integration:** - Firmware values pushed to Vault via coco-pattern scripts/collect-firmware-refvals.sh - ESO syncs from Vault to firmware-reference-values secret (sync-wave 1) - RVPS policy reads secret and builds ConfigMap (sync-wave 6) - Attestation policy (PR 2C) will enforce firmware checks using RVPS values **Backwards compatible:** - ESO only created when kbs.baremetal.enabled=true - RVPS block conditionally appends if secret exists - No functional change when disabled Part of Wave 2 (firmware hardening) from bare metal attestation plan. This is PR 2B - requires PR 2A (coco-pattern workflow) for value collection.
1 parent 498777c commit 5844a0f

3 files changed

Lines changed: 56 additions & 0 deletions

File tree

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
{{- if .Values.kbs.baremetal.enabled }}
2+
---
3+
apiVersion: "external-secrets.io/v1beta1"
4+
kind: ExternalSecret
5+
metadata:
6+
annotations:
7+
argocd.argoproj.io/sync-wave: "1"
8+
name: firmware-refvals-eso
9+
namespace: trustee-operator-system
10+
spec:
11+
refreshInterval: 15s
12+
secretStoreRef:
13+
name: {{ .Values.secretStore.name }}
14+
kind: {{ .Values.secretStore.kind }}
15+
target:
16+
name: firmware-reference-values
17+
template:
18+
type: generic
19+
dataFrom:
20+
- extract:
21+
key: 'secret/data/hub/firmwareReferenceValues'
22+
{{- end }}

templates/rvps-values-policies.yaml

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,30 @@ spec:
4444
{{`{{- $referenceValues = append $referenceValues (dict "name" "snp_pcr12" "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr12)) -}}`}}
4545
{{`{{- $referenceValues = append $referenceValues (dict "name" "tdx_pcr12" "expiration" "2027-12-12T00:00:00Z" "value" (list $pcr12)) -}}`}}
4646
{{`{{- end -}}`}}
47+
{{`{{- $firmwareStash := (lookup "v1" "Secret" "trustee-operator-system" "firmware-reference-values") -}}`}}
48+
{{`{{- if $firmwareStash -}}`}}
49+
{{`{{- $firmwareData := $firmwareStash.data -}}`}}
50+
{{`{{- if $firmwareData.mr_td -}}`}}
51+
{{`{{- $mrTdValues := ($firmwareData.mr_td | base64dec | fromJson) -}}`}}
52+
{{`{{- $referenceValues = append $referenceValues (dict "name" "mr_td" "expiration" "2027-12-12T00:00:00Z" "value" $mrTdValues) -}}`}}
53+
{{`{{- end -}}`}}
54+
{{`{{- if $firmwareData.rtmr_1 -}}`}}
55+
{{`{{- $rtmr1Values := ($firmwareData.rtmr_1 | base64dec | fromJson) -}}`}}
56+
{{`{{- $referenceValues = append $referenceValues (dict "name" "rtmr_1" "expiration" "2027-12-12T00:00:00Z" "value" $rtmr1Values) -}}`}}
57+
{{`{{- end -}}`}}
58+
{{`{{- if $firmwareData.rtmr_2 -}}`}}
59+
{{`{{- $rtmr2Values := ($firmwareData.rtmr_2 | base64dec | fromJson) -}}`}}
60+
{{`{{- $referenceValues = append $referenceValues (dict "name" "rtmr_2" "expiration" "2027-12-12T00:00:00Z" "value" $rtmr2Values) -}}`}}
61+
{{`{{- end -}}`}}
62+
{{`{{- if $firmwareData.snp_launch_measurement -}}`}}
63+
{{`{{- $snpLaunchValues := ($firmwareData.snp_launch_measurement | base64dec | fromJson) -}}`}}
64+
{{`{{- $referenceValues = append $referenceValues (dict "name" "snp_launch_measurement" "expiration" "2027-12-12T00:00:00Z" "value" $snpLaunchValues) -}}`}}
65+
{{`{{- end -}}`}}
66+
{{`{{- if $firmwareData.xfam -}}`}}
67+
{{`{{- $xfamValues := ($firmwareData.xfam | base64dec | fromJson) -}}`}}
68+
{{`{{- $referenceValues = append $referenceValues (dict "name" "xfam" "expiration" "2027-12-12T00:00:00Z" "value" $xfamValues) -}}`}}
69+
{{`{{- end -}}`}}
70+
{{`{{- end -}}`}}
4771
- complianceType: mustonlyhave
4872
objectDefinition:
4973
apiVersion: v1

values.yaml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,16 @@ kbs:
6767
# For Azure: Use https://global.acccache.azure.net/sgx/certification/v4/
6868
# For bare metal/Intel: Use https://api.trustedservices.intel.com/sgx/certification/v4/
6969
collateralService: "https://api.trustedservices.intel.com/sgx/certification/v4/"
70+
71+
# Bare metal attestation configuration
72+
# Enables firmware reference value collection and enforcement
73+
baremetal:
74+
# Enable bare metal firmware reference values (Intel TDX / AMD SEV-SNP)
75+
# When enabled, creates ExternalSecret to pull firmware measurements from Vault
76+
# Requires firmware values pushed to secret/data/hub/firmwareReferenceValues
77+
# See docs/firmware-reference-values.md in coco-pattern for collection workflow
78+
enabled: false
79+
7080
# Attestation token certificate configuration
7181
# Used when secretStore.backend is "none" (cert-manager generates certs)
7282
attestation:

0 commit comments

Comments
 (0)