Skip to content

identity: the key is sealed for attested runners; the control plane loses kms:Sign (I6) - #28

Merged
aledbf merged 1 commit into
mainfrom
i6/identity-key
Oct 4, 2026
Merged

aledbf merged 1 commit into
mainfrom
i6/identity-key

Conversation

@aledbf

@aledbf aledbf commented Oct 4, 2026 •

Copy link
Copy Markdown
Contributor

I6, with spin-stack/spin#286 (security zone: the user reviews).

  • identity.tf. The identity key is no longer a SIGN_VERIFY key the control plane signs with. It becomes a symmetric key spin-identity that seals an ECDSA P-256 data key pair, which KMS makes for the control plane without its plaintext. The key policy:

    • lets the control plane only GenerateDataKeyPairWithoutPlaintext (P-256, in the identity's context);
    • lets the new identity-keys role Decrypt only with Recipient and the runner's PCR4/7/12;
    • denies Decrypt without attestation to everyone;
    • denies the control plane's role every way to open the key or make one it knows.

    The key is prevent_destroy and rotated.

  • iam.tf.

    • SignItsWorkspacesIdentity is gone. The control plane's role has no KMS action of its own.
    • The control plane may assume the identity-keys role.
    • The runner's scope writes identity/issued/* and the CA, and reads rosters/*.
  • boundary.tf. No role deletes a roster version, identity/issuer.json or identity/x509-ca.der: a delete marker over a roster is a member put back.

  • config.tf. The document names identity = {key, role}.

  • outputs.tf. identity_documents reads the public half from issuer.json.

  • Tests. The posture test a_workspaces_identity_key_is_opened_only_by_an_attested_runner replaces the signing one. A planted P-384 pair spec fails it.

Order: merges with spin#286, and is applied once a spin release carries it: a control plane before #286 signs with KMS, and would find no kms:Sign.

🤖 Generated with Claude Code


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need. Autofix is disabled.

…oses kms:Sign

The identity key becomes a P-256 data key pair KMS makes for the control
plane without its plaintext, under a symmetric key whose policy opens it
only with Recipient to the runner's PCRs and denies the control plane's
role every use but making it unseen. The control plane grants it under a
role of its own; runners record what they sign under their own name and
read the rosters; no role deletes a roster or the key.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@aledbf
aledbf marked this pull request as ready for review October 4, 2026 14:02
@aledbf
aledbf merged commit 2216ffa into main Oct 4, 2026
2 checks passed
@aledbf
aledbf deleted the i6/identity-key branch October 4, 2026 14:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant