Skip to content

Commit aa4e4fd

Browse files
butler54claude
andcommitted
feat: OSC 1.13 / Trustee 1.2 support (v0.9.0)
KBS config TOML rewrite for Trustee 1.2: - New storage paths and plugin config format - Admin auth removed (DenyAll default) - tdx-config.yaml deleted (inline in KBS TOML) - RVPS file_dir_path for LocalJson storage RVPS format migration: - v1.1 array → v1.2 object format with migration annotation - Azure platform config defaults (SNP launch measurement, SMT, ABI) Attestation policy: - Fix az-snp-vtpm dash/underscore key mismatch - Add null guards for query_reference_value() to prevent count(null) crash - Align Azure SNP/TDX sections with upstream operator defaults - Skip KBS credential policy on Azure (peer-pods use SA pull secrets) Additional: - Sealed secrets JWK signing key ESO - kbsAuthSecretName dummy secret for Trustee 1.2 operator volume mount - Chart version bumped to 0.9.0 Breaking: Requires Trustee operator v1.2.0 / OSC v1.13.0. KBS config TOML not backwards compatible with Trustee 1.1. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent edcb675 commit aa4e4fd

12 files changed

Lines changed: 188 additions & 146 deletions

Chart.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,4 @@ keywords:
77
- confidential-containers
88
name: trustee
99
# DO NOT EDIT VERSION HERE, IT IS AUTO-GENERATED BY SEMANTIC-RELEASE
10-
version: 0.8.0
10+
version: 0.9.0

templates/attestation-policy.yaml

Lines changed: 53 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ metadata:
55
namespace: trustee-operator-system
66
annotations:
77
argocd.argoproj.io/sync-wave: "4"
8+
kbs.confidentialcontainers.org/migrated-from-v1.1.0: v1.2.0
89
data:
910
default_cpu.rego: |
1011
package policy
@@ -105,98 +106,74 @@ data:
105106
106107
##### Azure vTPM SNP
107108
executables := 3 if {
108-
input["az_snp_vtpm"]
109-
110-
input["az_snp_vtpm"].measurement in query_reference_value("measurement")
111-
input["az_snp_vtpm"].tpm.pcr03 in query_reference_value("snp_pcr03")
112-
input["az_snp_vtpm"].tpm.pcr08 in query_reference_value("snp_pcr08")
113-
input["az_snp_vtpm"].tpm.pcr09 in query_reference_value("snp_pcr09")
114-
input["az_snp_vtpm"].tpm.pcr11 in query_reference_value("snp_pcr11")
115-
input["az_snp_vtpm"].tpm.pcr12 in query_reference_value("snp_pcr12")
109+
input["az-snp-vtpm"]
110+
111+
# measurement check commented out per upstream default (launch measurement is Azure platform constant)
112+
# input["az-snp-vtpm"].measurement in query_reference_value("measurement")
113+
input["az-snp-vtpm"].tpm.pcr03 in query_reference_value("snp_pcr03")
114+
input["az-snp-vtpm"].tpm.pcr08 in query_reference_value("snp_pcr08")
115+
input["az-snp-vtpm"].tpm.pcr09 in query_reference_value("snp_pcr09")
116+
input["az-snp-vtpm"].tpm.pcr11 in query_reference_value("snp_pcr11")
117+
input["az-snp-vtpm"].tpm.pcr12 in query_reference_value("snp_pcr12")
116118
}
117119
118120
hardware := 2 if {
119-
input["az_snp_vtpm"]
121+
input["az-snp-vtpm"]
120122
121-
# Check the reported TCB to validate the ASP FW
122-
count(query_reference_value("tcb_bootloader")) > 0
123-
input["az_snp_vtpm"].reported_tcb_bootloader in query_reference_value("tcb_bootloader")
124-
input["az_snp_vtpm"].reported_tcb_microcode in query_reference_value("tcb_microcode")
125-
input["az_snp_vtpm"].reported_tcb_snp in query_reference_value("tcb_snp")
126-
input["az_snp_vtpm"].reported_tcb_tee in query_reference_value("tcb_tee")
127-
}
128-
129-
# Fallback: TCB reference values not collected for Azure yet
130-
else := 3 if {
131-
input["az_snp_vtpm"]
123+
# TCB checks commented out per upstream default — Azure manages TCB validation
124+
# input["az-snp-vtpm"].reported_tcb_bootloader in query_reference_value("tcb_bootloader")
125+
# input["az-snp-vtpm"].reported_tcb_microcode in query_reference_value("tcb_microcode")
126+
# input["az-snp-vtpm"].reported_tcb_snp in query_reference_value("tcb_snp")
127+
# input["az-snp-vtpm"].reported_tcb_tee in query_reference_value("tcb_tee")
132128
}
133129
134-
# For the 'configuration' trust claim 2 stands for
135-
# "The configuration is a known and approved config."
136-
#
137-
# For this, we compare all the configuration fields.
138130
configuration := 2 if {
139-
input["az_snp_vtpm"]
140-
141-
count(query_reference_value("smt_enabled")) > 0
142-
input["az_snp_vtpm"].platform_smt_enabled in query_reference_value("smt_enabled")
143-
input["az_snp_vtpm"].platform_tsme_enabled in query_reference_value("tsme_enabled")
144-
input["az_snp_vtpm"].policy_abi_major in query_reference_value("abi_major")
145-
input["az_snp_vtpm"].policy_abi_minor in query_reference_value("abi_minor")
146-
input["az_snp_vtpm"].policy_single_socket in query_reference_value("single_socket")
147-
input["az_snp_vtpm"].policy_smt_allowed in query_reference_value("smt_allowed")
148-
}
149-
150-
# Fallback: configuration reference values not available
151-
else := 3 if {
152-
input["az_snp_vtpm"]
131+
input["az-snp-vtpm"]
132+
133+
# Config checks commented out per upstream default — Azure platform constants
134+
# input["az-snp-vtpm"].platform_smt_enabled in query_reference_value("smt_enabled")
135+
# input["az-snp-vtpm"].platform_tsme_enabled in query_reference_value("tsme_enabled")
136+
# input["az-snp-vtpm"].policy_abi_major in query_reference_value("abi_major")
137+
# input["az-snp-vtpm"].policy_abi_minor in query_reference_value("abi_minor")
138+
# input["az-snp-vtpm"].policy_single_socket in query_reference_value("single_socket")
139+
# input["az-snp-vtpm"].policy_smt_allowed in query_reference_value("smt_allowed")
153140
}
154141
155142
##### Azure vTPM TDX
156143
executables := 3 if {
157-
input["az_tdx_vtpm"]
144+
input["az-tdx-vtpm"]
158145
159-
input["az_tdx_vtpm"].tpm.pcr03 in query_reference_value("tdx_pcr03")
160-
input["az_tdx_vtpm"].tpm.pcr08 in query_reference_value("tdx_pcr08")
161-
input["az_tdx_vtpm"].tpm.pcr09 in query_reference_value("tdx_pcr09")
162-
input["az_tdx_vtpm"].tpm.pcr11 in query_reference_value("tdx_pcr11")
163-
input["az_tdx_vtpm"].tpm.pcr12 in query_reference_value("tdx_pcr12")
146+
input["az-tdx-vtpm"].tpm.pcr03 in query_reference_value("tdx_pcr03")
147+
input["az-tdx-vtpm"].tpm.pcr08 in query_reference_value("tdx_pcr08")
148+
input["az-tdx-vtpm"].tpm.pcr09 in query_reference_value("tdx_pcr09")
149+
input["az-tdx-vtpm"].tpm.pcr11 in query_reference_value("tdx_pcr11")
150+
input["az-tdx-vtpm"].tpm.pcr12 in query_reference_value("tdx_pcr12")
164151
}
165152
166153
hardware := 2 if {
167-
input["az_tdx_vtpm"]
154+
input["az-tdx-vtpm"]
168155
169156
# Check the quote is a TDX quote signed by Intel SGX Quoting Enclave
170-
input["az_tdx_vtpm"].quote.header.tee_type == "81000000"
171-
input["az_tdx_vtpm"].quote.header.vendor_id == "939a7233f79c4ca9940a0db3957f0607"
157+
input["az-tdx-vtpm"].quote.header.tee_type == "81000000"
158+
input["az-tdx-vtpm"].quote.header.vendor_id == "939a7233f79c4ca9940a0db3957f0607"
172159
173-
# Check OVMF code hash
174-
count(query_reference_value("mr_td")) > 0
175-
input["az_tdx_vtpm"].quote.body.mr_td in query_reference_value("mr_td")
160+
# mr_td and OVMF checks commented out per upstream default
161+
# input["az-tdx-vtpm"].quote.body.mr_td in query_reference_value("mr_td")
176162
177163
# Check TCB status (covers quote.body.tcb_svn claim check)
178-
input["az_tdx_vtpm"].tcb_status == "UpToDate"
179-
}
180-
181-
# Fallback: mr_td reference values not collected for Azure yet
182-
else := 3 if {
183-
input["az_tdx_vtpm"]
184-
185-
input["az_tdx_vtpm"].quote.header.tee_type == "81000000"
186-
input["az_tdx_vtpm"].quote.header.vendor_id == "939a7233f79c4ca9940a0db3957f0607"
187-
input["az_tdx_vtpm"].tcb_status == "UpToDate"
164+
input["az-tdx-vtpm"].tcb_status == "UpToDate"
188165
}
189166
190167
configuration := 2 if {
191-
input["az_tdx_vtpm"]
168+
input["az-tdx-vtpm"]
192169
193-
count(query_reference_value("xfam")) > 0
194-
input["az_tdx_vtpm"].quote.body.xfam in query_reference_value("xfam")
170+
# xfam check commented out per upstream default
171+
# input["az-tdx-vtpm"].quote.body.xfam in query_reference_value("xfam")
195172
}
196173
197174
# Fallback: xfam reference values not available
198175
else := 3 if {
199-
input["az_tdx_vtpm"]
176+
input["az-tdx-vtpm"]
200177
}
201178
202179
##### Bare Metal TDX
@@ -240,6 +217,18 @@ data:
240217
input["tdx"].collateral_expiration_status == "0"
241218
}
242219
220+
# Fallback: TCB OutOfDate — hardware is real TDX but has known advisories
221+
else := 3 if {
222+
input["tdx"]
223+
224+
input["tdx"].quote.header.tee_type == "81000000"
225+
input["tdx"].quote.header.vendor_id == "939a7233f79c4ca9940a0db3957f0607"
226+
227+
input["tdx"].quote.body.mr_td in query_reference_value("mr_td")
228+
229+
input["tdx"].collateral_expiration_status == "0"
230+
}
231+
243232
configuration := 2 if {
244233
input["tdx"]
245234
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
# Dummy secret required by Trustee 1.2 operator.
2+
# The operator controller unconditionally creates a volume from
3+
# kbsAuthSecretName. Admin auth is disabled (authorization_mode = "DenyAll"),
4+
# so the content is irrelevant -- only existence matters.
5+
apiVersion: v1
6+
kind: Secret
7+
metadata:
8+
name: kbs-auth-public-key
9+
namespace: trustee-operator-system
10+
annotations:
11+
argocd.argoproj.io/sync-wave: "1"
12+
type: Opaque
13+
data:
14+
publicKey: ""

templates/kbs-config-map.yaml

Lines changed: 21 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ metadata:
55
namespace: trustee-operator-system
66
annotations:
77
argocd.argoproj.io/sync-wave: "4"
8+
kbs.confidentialcontainers.org/migrated-from-v1.1.0: v1.2.0
89
data:
910
kbs-config.toml: |
1011
[http_server]
@@ -15,33 +16,19 @@ data:
1516
insecure_http = false
1617
private_key = "/etc/https-key/tls.key"
1718
certificate = "/etc/https-cert/tls.crt"
18-
[admin]
19-
{{- if eq (default "v1.0" .Values.kbs.admin.format) "v1.1" }}
20-
type = "Simple"
21-
insecure_api = false
2219
23-
[[admin.personas]]
24-
id = "admin"
25-
public_key_path = "/etc/auth-secret/publicKey"
26-
{{- else }}
27-
type = "DenyAll"
28-
insecure_api = false
29-
auth_public_key = "/etc/auth-secret/publicKey"
30-
{{- end }}
20+
[admin]
21+
authorization_mode = "DenyAll"
3122
3223
[attestation_token]
33-
insecure_key = false
24+
insecure_header_jwk = false
3425
attestation_token_type = "CoCo"
35-
trusted_certs_paths = ["/etc/attestation-cert/tls.crt"] # Check for location in cert (based on key generated)
26+
trusted_certs_paths = ["/etc/attestation-cert/tls.crt"]
3627
3728
[attestation_service]
3829
type = "coco_as_builtin"
39-
work_dir = "/opt/confidential-containers/attestation-service"
40-
policy_engine = "opa"
4130
4231
[attestation_service.attestation_token_broker]
43-
type = "Ear"
44-
policy_dir = "/opt/confidential-containers/attestation-service/policies"
4532
4633
[attestation_service.attestation_token_broker.signer]
4734
key_path = "/etc/attestation-cert/tls.key"
@@ -52,20 +39,28 @@ data:
5239
5340
[attestation_service.rvps_config]
5441
type = "BuiltIn"
55-
56-
[attestation_service.rvps_config.storage]
57-
type = "LocalJson"
58-
file_path = "/opt/confidential-containers/rvps/reference-values/reference-values.json"
42+
storage_type = "LocalJson"
43+
file_dir_path = "/opt/confidential-containers/storage/local_json"
5944
{{- if .Values.kbs.gpu.enabled }}
6045
6146
[attestation_service.verifier_config.nvidia_verifier]
6247
type = "Remote"
6348
{{- end }}
49+
{{- if .Values.kbs.tdx.enabled }}
50+
51+
[attestation_service.verifier_config.dcap_verifier]
52+
collateral_service = "{{ .Values.kbs.tdx.collateralService }}"
53+
{{- end }}
6454
6555
[[plugins]]
6656
name = "resource"
67-
type = "LocalFs"
68-
dir_path = "/opt/confidential-containers/kbs/repository"
57+
storage_backend_type = "kvstorage"
58+
59+
[storage_backend]
60+
storage_type = "LocalFs"
61+
62+
[storage_backend.backends.local_fs]
63+
dir_path = "/opt/confidential-containers/storage"
6964
70-
[policy_engine]
71-
policy_path = "/opt/confidential-containers/opa/policy.rego"
65+
[storage_backend.backends.local_json]
66+
dir_path = "/opt/confidential-containers/storage/local_json"

templates/kbs.yaml

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ spec:
2222
{{- end }}
2323
- "security-policy"
2424
- "attestation-status"
25+
- "signing-key"
2526
kbsHttpsKeySecretName: kbs-https-key
2627
kbsHttpsCertSecretName: kbs-https-certificate
2728
kbsResourcePolicyConfigMapName: resource-policy
@@ -30,12 +31,6 @@ spec:
3031
kbsAttestationKeySecretName: attestation-cert
3132

3233

33-
# TDX specific configuration (optional)
34-
{{- if .Values.kbs.tdx.enabled }}
35-
tdxConfigSpec:
36-
kbsTdxConfigMapName: tdx-config
37-
{{- end }}
38-
3934
# IBM SE specific configuration (optional)
4035
# ibmSEConfigSpec:
4136
# certStorePvc: <persistent-volume-claim>

templates/pull-secret-credential-policy.yaml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
{{ if eq .Values.global.coco.secured true }}
1+
{{- if and (eq .Values.global.coco.secured true) (ne .Values.global.clusterPlatform "Azure") }}
2+
{{- /* On Azure peer-pods, CDH does not fetch registry credentials from KBS.
3+
Pull secrets are distributed to workload namespace SAs instead
4+
(see sandboxed-policies-chart/pull-secret-distribution.yaml). */ -}}
25
---
36
apiVersion: policy.open-cluster-management.io/v1
47
kind: Policy

templates/reference-values.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ metadata:
66
namespace: trustee-operator-system
77
annotations:
88
argocd.argoproj.io/sync-wave: "4"
9+
kbs.confidentialcontainers.org/migrated-from-v1.1.0: v1.2.0
910
data:
10-
reference-values.json: '[]'
11+
reference_value: '{}'
1112
{{ end }}

templates/resource-policy.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@ metadata:
55
namespace: trustee-operator-system
66
annotations:
77
argocd.argoproj.io/sync-wave: "4"
8+
kbs.confidentialcontainers.org/migrated-from-v1.1.0: v1.2.0
89
data:
9-
policy.rego: |
10+
resource-policy.rego: |
1011
package policy
1112
import rego.v1
1213

0 commit comments

Comments
 (0)