Skip to content

Integrate MIAF and WFM identity profile SUPs - #194

Open
matlec wants to merge 28 commits into
pre-draftfrom
feat/miaf-integration
Open

Integrate MIAF and WFM identity profile SUPs#194
matlec wants to merge 28 commits into
pre-draftfrom
feat/miaf-integration

Conversation

@matlec

@matlec matlec commented Jul 20, 2026

Copy link
Copy Markdown
Contributor

Description

Integrates the two voted MIAF SUPs into the normative specification:

What changes

  • Adds an Identity and Authorization section: the framework, the X.509-SVID profile, TLS/mTLS requirements, the trust bundle and discovery endpoints (with OpenAPI), the identity lifecycle and operator playbooks, the WFM Identity Profile, and security considerations.
  • Reworks the Management Interface security model. mTLS with X.509-SVIDs replaces server-side TLS plus RFC 9421 payload signatures. The onboarding and certificate-download endpoints and the PayloadSignature scheme are removed.
  • Drops {clientId} from every route. Caller identity now comes from the authenticated SPIFFE ID. Retained endpoints gain a 403 for local-policy denial and Cache-Control: private.
  • Bumps the Workload Management OpenAPI to 3.1.0, which the mutualTLS scheme and nullable typing require.

Deliberate deviations from the SUPs

  • Cryptography is broader and built for agility. ECDSA P-256 is the only mandatory-to-implement algorithm; ECDSA P-384 and Ed25519 are optional; RSA PKCS#1 v1.5 is allowed only for certificate and CSR signatures, for CA compatibility. The SUP fixed ECDSA P-256 plus RSA-PSS and banned PKCS#1 v1.5.
  • TLS is pinned to RFC 9852 (TLS 1.3 default, TLS 1.2 only as a non-default fallback), and the spec spells out that the TLS 1.2 fallback exposes the client SPIFFE ID in the cleartext handshake. The SUP only required TLS 1.3 support.
  • A WFM Client derives the WFM it expects from its own SVID path rather than from a separately configured target wfm-id, so there is no separate target-identifier config item (which simplifies configuration and operations).
  • Adds hardening the SUPs left open: a trust-anchor rotation playbook, Bundle Map rollback protection via spiffe_sequence with fail-closed on an empty bundle, refresh driven by spiffe_refresh_hint, and RFC 9440 section 4 spoof-proofing for the forwarded Client-Cert header.
  • Expands the security-considerations catalog past the SUP tables: MIS compromise, central key-custody concentration, Bundle substitution and rollback, an unreliable validator clock, TLS 1.2 handshake disclosure, forwarded-header injection, and profile-specific threats.

Issues Addressed

Change Type

Please select the relevant options:

  • Fix (change that resolves an issue)
  • New enhancement (change that adds specification content)
  • Content edits (change that edits existing content)

Checklist

  • I have read the CONTRIBUTING document.
  • My changes adhere to the established patterns, and best practices.

Replace the Management Interface security model with
the MIAF and WFM Identity Profile SUPs: add the Identity
and Authorization section, switch to mTLS with X.509-SVIDs,
drop {clientId} from routes, and remove the onboarding,
certificate, and RFC 9421 payload-signing paths.

Signed-off-by: Matthias Lechner <matlec.public@gmail.com>
Signed-off-by: Matthias Lechner <matlec.public@gmail.com>
@phil-abb
phil-abb self-requested a review July 21, 2026 10:42
@ajcraig
ajcraig self-requested a review July 22, 2026 12:53

@phil-abb phil-abb left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here's some preliminary feedback.

Comment thread mkdocs.yml
Comment thread src/specification/margo-management-interface/resources/index.md.jinja2 Outdated
Comment thread src/specification/margo-management-interface/resources/index.md.jinja2 Outdated
Comment thread system-design/specification/identity/trust-bundle-api-swagger.md
Comment thread system-design/specification/identity/trust-bundle-api-1.0.0.yaml
Comment thread system-design/specification/identity/wfm-identity-profile.md Outdated
Comment thread system-design/specification/identity/wfm-identity-profile.md
Comment thread system-design/specification/identity/wfm-identity-profile.md Outdated
matlec and others added 12 commits July 23, 2026 10:31
Rework the Trust Bundle retrieval endpoint to return a single
SPIFFE bundle (a JWK Set) per the SPIFFE Federation bundle-
endpoint model, instead of a SPIFFE Bundle Map.

Scope federation as future work and state that a verifier
validates SVIDs against its own Trust Domain.

Signed-off-by: Matthias Lechner <matlec.public@gmail.com>
Signed-off-by: Matthias Lechner <matlec.public@gmail.com>
Signed-off-by: Matthias Lechner <matlec.public@gmail.com>
Signed-off-by: Matthias Lechner <matlec.public@gmail.com>
…uirements-and-security.md

Co-authored-by: Philip Presson <philip.presson@us.abb.com>
Signed-off-by: Matthias Lechner <matlec.public@gmail.com>
…rations.md

Co-authored-by: Philip Presson <philip.presson@us.abb.com>
Signed-off-by: Matthias Lechner <matlec.public@gmail.com>
Co-authored-by: Philip Presson <philip.presson@us.abb.com>
Signed-off-by: Matthias Lechner <matlec.public@gmail.com>
…rations.md

Co-authored-by: Philip Presson <philip.presson@us.abb.com>
Signed-off-by: Matthias Lechner <matlec.public@gmail.com>
…rations.md

Co-authored-by: Philip Presson <philip.presson@us.abb.com>
Signed-off-by: Matthias Lechner <matlec.public@gmail.com>
Co-authored-by: Philip Presson <philip.presson@us.abb.com>
Signed-off-by: Matthias Lechner <matlec.public@gmail.com>
Co-authored-by: Philip Presson <philip.presson@us.abb.com>
Signed-off-by: Matthias Lechner <matlec.public@gmail.com>
Co-authored-by: Philip Presson <philip.presson@us.abb.com>
Signed-off-by: Matthias Lechner <matlec.public@gmail.com>
matlec added 2 commits July 24, 2026 07:52
Prefix every link to a page in the same folder
with "./" to force the Fumadocs resolving the
link as a relative link (solves the 404 issue)

Signed-off-by: Matthias Lechner <matlec.public@gmail.com>
The published site (Fumadocs, at docs.margo.org) builds its sidebar
from a meta.json in each folder; with none present it falls back to
alphabetical order, which scrambles the intended reading sequence.

Add a meta.json for each specification section that sets the section
title and lists its pages in the order given by mkdocs.yml, so the
rendered site matches the local mkdocs preview.

Signed-off-by: Matthias Lechner <matlec.public@gmail.com>
@github-actions

This comment was marked as outdated.

…ification into feat/miaf-integration

Signed-off-by: Matthias Lechner <matlec.public@gmail.com>
Signed-off-by: Matthias Lechner <matlec.public@gmail.com>
Comment thread system-design/specification/margo-management-interface/meta.json
Co-authored-by: Philip Presson <philip.presson@us.abb.com>
Signed-off-by: Matthias Lechner <matlec.public@gmail.com>
@github-actions

This comment was marked as resolved.

Signed-off-by: Matthias Lechner <matlec.public@gmail.com>
@matlec
matlec force-pushed the feat/miaf-integration branch from 6ca5769 to 3415662 Compare July 24, 2026 12:03
matlec added 4 commits July 24, 2026 16:10
…rator

The Trust Domain can be derived from the
provisioned SVID alone by inspecting the
SPIFFE ID in the cert's URI SAN.

Signed-off-by: Matthias Lechner <matlec.public@gmail.com>
Signed-off-by: Matthias Lechner <matlec.public@gmail.com>
Signed-off-by: Matthias Lechner <matlec.public@gmail.com>
…rt pinning)

Signed-off-by: Matthias Lechner <matlec.public@gmail.com>

## X.509-SVID Profile

MIAF adopts the [SPIFFE X.509-SVID specification](https://github.com/spiffe/spiffe/blob/main/standards/X509-SVID.md) by reference. X.509-SVID is the SVID representation used throughout MIAF.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe would be good to mention if it pinned to a specific version. And how future versions are handled

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good point, this is already covered here.

| **RSA (≥3072 + SHA-256)** | Modulus MUST be at least 3072 bits; signatures MUST use SHA-256. RSASSA-PSS (`PS256`, [RFC 8017](https://datatracker.ietf.org/doc/html/rfc8017)) is RECOMMENDED. RSASSA-PKCS#1 v1.5 (`RS256`) MAY be used only for X.509 certificate and CSR signatures (today the only RSA signatures in MIAF), for compatibility with issuing CAs that cannot produce PSS signatures (its use there remains sanctioned by [NIST SP 800-131A Rev 2](https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-131Ar2.pdf)). Any other RSA signature MIAF defines later MUST use PSS. |

- **ECDSA P-256 with SHA-256 is mandatory to implement.** Every MIAF component MUST implement it, for both presenting and validating SVIDs, so that any two components always share at least one algorithm.
- A component MAY additionally implement EdDSA (Ed25519), RSA, or both. Because a principal presents a single SVID bound to one signature algorithm, an SVID issued with a non-mandatory algorithm can be validated only by peers that implement that algorithm; a peer that does not will fail to validate it. Selecting an SVID signature algorithm that is supported across the Trust Domain is therefore the operator's responsibility at issuance (see [operator provisioning playbook](./identity-lifecycle.md#operator-provisioning-playbook)). ECDSA P-256 with SHA-256 is always a safe choice.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"Because a principal presents a single SVID bound to one signature algorithm" is technically imprecise. An SVID has:

  • a subject public-key algorithm
  • a CA certificate-signature algorithm

A MIAF profile could require the issuing CA to use the same algorithm family and parameters as the principal.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed, the wording was imprecise and could mislead people reading the spec. I have reworded that paragraph so that it now covers the signature algorithm of each certificate in the chain and the public-key algorithm of the leaf key.

A MIAF profile could require the issuing CA to use the same algorithm family and parameters as the principal.

I'd rather not add this requirement. An enterprise root CA using RSA with leaf certificates using EC is a common enough pattern, so I'd be concerned to over-constrain here. We'll also need mixed chains for post quantum transition. The updated wording puts the responsibility on the operator. So if an operator wants to be on the safe side, they can always choose ECDSA P-256 with SHA-256 throughout the chain.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe not the complete chain but at least the Issuing CA of the SVID?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mh, I'm not sure what that would buy us. Suppose we have an RSA root with an EC intermediate issuing EC leaf certificates. The verifier still needs RSA because the intermediate's certificate is signed with the root's RSA key. The set of algorithms the verifier must implement doesn't shrink. Meanwhile the constraint would tie the issuing CA's key to the leaf's algorithm family. So I'd leave this as operator guidance.

matlec added 3 commits July 30, 2026 12:15
Signed-off-by: Matthias Lechner <matlec.public@gmail.com>
Signed-off-by: Matthias Lechner <matlec.public@gmail.com>
Signed-off-by: Matthias Lechner <matlec.public@gmail.com>
Signed-off-by: Matthias Lechner <matlec.public@gmail.com>
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.

3 participants