docs(spire): revocation cascade timing + Keylime SPIRE server config
Document the trust withdrawal cascade: Keylime breach → posture degraded → sessions downgraded → SPIRE re-attestation fails → SVIDs expire → service mTLS fails → quorum degrades No new code for the cascade — it's emergent from existing re-attestation behavior + the Keylime attestor plugin. SPIRE federation handles cross-edge propagation through standard certificate expiration. Three timing profiles: Standard (~1hr), Enhanced (~15min), Critical (~5min) with SVID TTL configuration guidance. Example SPIRE server config with Keylime attestor + k8s_psat fallback for nodes without hardware TPM. Signed-off-by: Tyler King <tking@guildhouse.dev> Signed-off-by: Tyler J King <tking727@gmail.com>
This commit is contained in:
parent
5f62da6ca9
commit
f0268305ae
2 changed files with 135 additions and 0 deletions
63
deploy/cascade-timing.md
Normal file
63
deploy/cascade-timing.md
Normal file
|
|
@ -0,0 +1,63 @@
|
||||||
|
# Revocation Cascade Timing
|
||||||
|
|
||||||
|
When Keylime detects a TPM attestation failure, trust withdrawal cascades
|
||||||
|
through the stack automatically. No custom revocation protocol — each
|
||||||
|
layer reacts to the posture change produced by the layer above it.
|
||||||
|
|
||||||
|
## Cascade Stages
|
||||||
|
|
||||||
|
| # | Stage | Default Interval | Trigger |
|
||||||
|
|---|-------|-----------------|---------|
|
||||||
|
| 1 | Keylime detects failure | 300s (pull) / varies (push) | TPM quote mismatch, IMA violation, boot integrity |
|
||||||
|
| 2 | Posture evaluator updates ConfigMap | 300s | Keylime verdict changes |
|
||||||
|
| 3 | Bascule session downgrade | 30s | posture-current ConfigMap poll |
|
||||||
|
| 4 | SPIRE re-attestation fails | varies | Keylime attestor reads ConfigMap |
|
||||||
|
| 5 | SVID expiry (identity loss) | 3600s (1 hour) | SPIRE agent can't renew |
|
||||||
|
| 6 | Service mTLS failures | immediate after 5 | Peer cert expired/missing |
|
||||||
|
| 7 | Quorum degradation | immediate after 6 | SPIRE federation — other members see expired SVIDs |
|
||||||
|
|
||||||
|
## Timing Profiles
|
||||||
|
|
||||||
|
### Standard (default) — ~1 hour total cascade
|
||||||
|
|
||||||
|
Acceptable for most workloads. SVID TTL provides grace period for
|
||||||
|
transient failures.
|
||||||
|
|
||||||
|
### Enhanced — ~15 minute total cascade
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# SVID TTL
|
||||||
|
default_x509_svid_ttl: 15m
|
||||||
|
# SPIRE re-attestation (implicit via SVID rotation interval)
|
||||||
|
# Keylime poll: default 300s is fine
|
||||||
|
```
|
||||||
|
|
||||||
|
Higher renewal overhead, faster trust withdrawal.
|
||||||
|
|
||||||
|
### Critical — ~5 minute total cascade
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
default_x509_svid_ttl: 5m
|
||||||
|
```
|
||||||
|
|
||||||
|
Significant renewal overhead. Use only for high-security workloads
|
||||||
|
where fast trust withdrawal justifies the cost.
|
||||||
|
|
||||||
|
## Cross-Edge (Quorum) Propagation
|
||||||
|
|
||||||
|
When one quorum member's edge fails Keylime attestation:
|
||||||
|
|
||||||
|
1. That edge's SPIRE server stops issuing SVIDs (Keylime attestor rejects)
|
||||||
|
2. Existing SVIDs expire (per TTL)
|
||||||
|
3. Other members' services see TLS handshake failures (expired peer cert)
|
||||||
|
4. No explicit cross-member notification needed — SPIRE federation's
|
||||||
|
standard certificate lifecycle handles it
|
||||||
|
|
||||||
|
This is automatic. SPIRE federation trusts Member A's SVIDs via the
|
||||||
|
bundle exchange. When those SVIDs expire and aren't renewed, Member B's
|
||||||
|
services can't verify them.
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
See `spire-server-keylime.yaml` for the SPIRE server configuration with
|
||||||
|
the Keylime node attestor plugin and timing parameters.
|
||||||
72
deploy/spire-server-keylime.yaml
Normal file
72
deploy/spire-server-keylime.yaml
Normal file
|
|
@ -0,0 +1,72 @@
|
||||||
|
# SPIRE Server configuration with Keylime node attestor.
|
||||||
|
#
|
||||||
|
# Replaces tpm_devid attestor with Keylime-backed attestation.
|
||||||
|
# Keylime is the single TPM authority; this plugin queries its
|
||||||
|
# attestation results from the posture-current ConfigMap.
|
||||||
|
#
|
||||||
|
# See deploy/cascade-timing.md for revocation cascade timing.
|
||||||
|
|
||||||
|
server:
|
||||||
|
bind_address: 0.0.0.0
|
||||||
|
bind_port: 8081
|
||||||
|
data_dir: /var/lib/spire/server
|
||||||
|
log_level: INFO
|
||||||
|
trust_domain: guild-a.guildhouse.io
|
||||||
|
ca_ttl: 8760h # 1 year
|
||||||
|
default_x509_svid_ttl: 1h
|
||||||
|
default_jwt_svid_ttl: 5m
|
||||||
|
|
||||||
|
plugins:
|
||||||
|
NodeAttestor:
|
||||||
|
# Primary: Keylime-backed attestation for nodes with hardware TPM.
|
||||||
|
# Reads posture-current ConfigMap via volume mount.
|
||||||
|
keylime:
|
||||||
|
plugin_cmd: /opt/spire/plugins/keylime-attestor
|
||||||
|
plugin_data:
|
||||||
|
source: configmap
|
||||||
|
posture_configmap_path: /var/run/posture/posture-current
|
||||||
|
max_attestation_age_secs: 600
|
||||||
|
|
||||||
|
# Fallback: K8s PSAT for cloud nodes without hardware TPM.
|
||||||
|
k8s_psat:
|
||||||
|
plugin_data:
|
||||||
|
clusters:
|
||||||
|
local:
|
||||||
|
service_account_allow_list:
|
||||||
|
- spire:spire-agent
|
||||||
|
|
||||||
|
KeyManager:
|
||||||
|
guildhouse_substrate:
|
||||||
|
plugin_cmd: /opt/spire/plugins/substrate-keymanager
|
||||||
|
plugin_data:
|
||||||
|
trust_domain: guild-a.guildhouse.io
|
||||||
|
governance_addr: governance.quartermaster.svc.cluster.local:50051
|
||||||
|
notary_addr: notary.quartermaster.svc.cluster.local:50051
|
||||||
|
cluster_id: guild-a
|
||||||
|
governance_epoch_seconds: 300
|
||||||
|
|
||||||
|
CredentialComposer:
|
||||||
|
guildhouse_ssh:
|
||||||
|
plugin_cmd: /opt/spire/plugins/ssh-credential-composer
|
||||||
|
plugin_data:
|
||||||
|
trust_domain: guild-a.guildhouse.io
|
||||||
|
governance_addr: governance.quartermaster.svc.cluster.local:50051
|
||||||
|
default_cert_ttl: 5m
|
||||||
|
max_cert_ttl: 1h
|
||||||
|
|
||||||
|
Notifier:
|
||||||
|
guildhouse_governance:
|
||||||
|
plugin_cmd: /opt/spire/plugins/governance-notifier
|
||||||
|
plugin_data:
|
||||||
|
governance_addr: governance.quartermaster.svc.cluster.local:50051
|
||||||
|
ceremony_addr: ceremony.bascule.svc.cluster.local:50052
|
||||||
|
notary_addr: notary.quartermaster.svc.cluster.local:50051
|
||||||
|
cluster_id: guild-a
|
||||||
|
trust_domain: guild-a.guildhouse.io
|
||||||
|
governance_epoch_seconds: 300
|
||||||
|
|
||||||
|
DataStore:
|
||||||
|
sql:
|
||||||
|
plugin_data:
|
||||||
|
database_type: sqlite3
|
||||||
|
connection_string: /var/lib/spire/server/datastore.sqlite3
|
||||||
Loading…
Reference in a new issue