Repository navigation
Add Shared Signals Framework Transmitter capability - #48256
Conversation
6b46c3e to
279353a
Compare
|
@pedroigor @sguilhen as discussed here is the initial PR with a fully featured SSF Transmitter implementation without the SSF Receiver support. The SSF feature is now aligned with the structure of the SCIM feature as multiple sub modules: |
Unreported flaky test detectedIf the flaky tests below are affected by the changes, please review and update the changes accordingly. Otherwise, a maintainer should report the flaky tests prior to merging the PR. org.keycloak.testsuite.model.singleUseObject.SingleUseObjectModelTest#testClusterKeycloak CI - Store Model Tests |
c3fe2c5 to
5218eae
Compare
5218eae to
008a191
Compare
e6aa710 to
b6b32c2
Compare
9be57a4 to
df16cab
Compare
8e8f588 to
bb99279
Compare
Unreported flaky test detectedIf the flaky tests below are affected by the changes, please review and update the changes accordingly. Otherwise, a maintainer should report the flaky tests prior to merging the PR. org.keycloak.testsuite.adapter.servlet.SAMLServletAdapterTest#employeeSigPostNoIdpKeyTestCertSubjectAsKeyNameInKeyInfoKeycloak CI - Adapter IT Strict Cookies org.keycloak.testsuite.adapter.servlet.SAMLServletAdapterTest#salesPostTestKeycloak CI - Adapter IT Strict Cookies org.keycloak.testsuite.adapter.servlet.SAMLServletAdapterTest#testMultipleTabsParallelLoginKeycloak CI - Adapter IT Strict Cookies |
bb99279 to
49a6790
Compare
1fc3ec8 to
cfa9ae3
Compare
f84d9d7 to
f79d1ed
Compare
f79d1ed to
eccb7de
Compare
Adds Shared Signals Framework support to Keycloak in the **SSF Transmitter** role: Keycloak signs Security Event Tokens (SETs, RFC 8417) describing realm/user/session/credential events and delivers them to OAuth clients registered as **SSF Receivers**, either by HTTP PUSH (RFC 8935) or HTTP POLL (RFC 8936). Targets the OpenID Shared Signals Framework 1.0 (Final) specification plus the CAEP Interoperability Profile 1.0. Ships the legacy SSE CAEP profile alongside for Apple Business Manager / Apple School Manager interop, since Apple device-fleet enrolment is a concrete drive-use case. Gated behind \`Profile.Feature.SSF\` experimental, opt-in. Issue keycloak#43614 originally proposed SSF *Receiver* support (Keycloak ingesting SETs from upstream IdPs / risk engines). After exploring both sides, we're shipping the **Transmitter** first (see keycloak#48254) because it covers the strongest community asks (federate Keycloak events to downstream SaaS, Apple device fleet revoke flow) and lets us validate the SSF data-plane against real receivers before designing the harder "action mapping" question on the Receiver side. Receiver support remains on the roadmap and is tracked separately via keycloak#43614. **In:** - Compliance with SSF 1.0, CAEP 1.0, RISC 1.0, RFC 8935, RFC 8936, RFC 9493, RFC 8417 - SSF Transmitter support (Keycloak Realm can act as a SSF Transmitter) - SSF Stream management (CRUD, status, verification) - SSF Subjects management (subjects) - SET delivery via HTTP PUSH (RFC 8935) and HTTP POLL (RFC 8936) with POLL in a return-immediately form - SSF events temporarily stored in durable outbox with cluster-aware drainer and exponential backoff - SSF Receivers managed as OIDC Clients with client credentials grant or auth code grant (currently only one stream per client) - Support for SSF Stream, CAEP 1.0 and RISC 1.0 events (custom events via SPI) - CAEP credential-change / session-revoked / (device-compliance-change) event mapping from native Keycloak events - Support for RFC 9493 Subject Identifiers for Security Event Tokens - Support for SSF Receiver subject event subscription with subject selection (per-user / per-orgssf.notify.<clientId>attribute, support fordefault_subjectspolicy (ALL, NONE)) - Support for Synthetic event emittance via REST endpoint for non-Keycloak-native event sources (external IAM solution) - Per-receiver "Emit-only events" gate to suppress auto-emit per event type per receiver - Support for legacy SSE CAEP profile for Apple Business Manager / Apple School Manager interop (verified) - Per-realm SSF admin REST + Admin UI for SSF-enabled clients (Receiver / Stream / Subjects / Events) - Prometheus metrics (dispatcher, drainer, poll, verification, outbox depth, delivery metrics) **Out (tracked as separate follow-up issues):** - SSF Receiver role for Keycloak (ingestion of SETs) - POLL long-polling (\`returnImmediately=false\` honoured) - Dedicated SSF signing key (separate from realm OIDC signing key) - Chunked HELD release for very large backlogs - Performance characterization + security review - Formal interop matrix (caep.dev, ABM) - [X] All code gated behind \`Profile.Feature.SSF\` (experimental, off by default) - [X] Per-realm \`ssf.transmitterEnabled\` toggle; per-client \`ssf.enabled\` toggle - [X] SSF event listener registered as global (not user-toggleable per realm) - [X] Receiver-facing endpoints conformant with SSF 1.0 - [X] CAEP credential-change / session-revoked / device-compliance mapping pass interop testing against \`caep.dev\` - [X] SSE CAEP profile narrowed shape works with Apple Business Manager - [X] Integration test coverage for the dispatch / outbox / push / poll pipeline (100+ tests) - [X] Prometheus metrics exposed under \`keycloak_ssf_*\` - [X] Design notes published Fixes keycloak#48901 This PR was partially co-authored with Claude AI Signed-off-by: Thomas Darimont <thomas.darimont@googlemail.com>
eccb7de to
ed6cd53
Compare
Adds Shared Signals Framework support to Keycloak in the SSF Transmitter role: Keycloak signs Security Event Tokens (SETs, RFC 8417) describing realm/user/session/credential events and delivers them to OAuth clients
registered as SSF Receivers, either by HTTP PUSH (RFC 8935) or HTTP POLL (RFC 8936).
Targets the OpenID Shared Signals Framework 1.0 (Final) specification plus the CAEP Interoperability Profile 1.0. Ships the legacy SSE CAEP profile alongside for Apple Business Manager / Apple School Manager interop, since Apple device-fleet enrolment is a concrete drive-use case.
Gated behind
Profile.Feature.SSFexperimental, opt-in.Background
Issue #43614 originally proposed SSF Receiver support (Keycloak ingesting SETs from upstream IdPs / risk engines). After exploring both sides, we're shipping the Transmitter first (see #48254) because it covers the strongest community asks (federate Keycloak events to downstream SaaS, Apple device fleet revoke flow) and lets us validate the SSF data-plane against real receivers before designing the harder "action mapping" question on the Receiver side. Receiver support remains on the roadmap and is tracked separately via #43614.
Scope (experimental)
In:
Out (tracked as separate follow-up issues):
returnImmediately=falsehonoured)Tasks
Profile.Feature.SSF(experimental, off by default)ssf.transmitterEnabledtoggle; per-clientssf.enabledtogglecaep.devkeycloak_ssf_*Documentation
A more detailed description for the design Design + behaviour can be found here: (Design Document)
Fixes #48901
Signed-off-by: Thomas Darimont thomas.darimont@googlemail.com
This PR was partially co-authored with Claude AI