From 541a66101ea73ab314ad372f538b102b612ee5d5 Mon Sep 17 00:00:00 2001 From: Jim Marino Date: Wed, 28 Aug 2024 12:22:20 +0200 Subject: [PATCH] feat: Add Identity Hub concepts documentation (#207) Add Identity Hub concepts documentation --- .../wip/for-adopters/Identity Hub Concepts.md | 249 ++++++++++++++++++ .../wip/for-adopters/centralized-identity.svg | 14 + developer/wip/for-adopters/ih-deployments.svg | 36 +++ developer/wip/for-adopters/issuance-flow.png | Bin 0 -> 20030 bytes developer/wip/for-adopters/issuance-flow.puml | 22 ++ developer/wip/for-adopters/token-use.png | Bin 0 -> 20045 bytes developer/wip/for-adopters/token-use.puml | 23 ++ 7 files changed, 344 insertions(+) create mode 100644 developer/wip/for-adopters/Identity Hub Concepts.md create mode 100644 developer/wip/for-adopters/centralized-identity.svg create mode 100644 developer/wip/for-adopters/ih-deployments.svg create mode 100644 developer/wip/for-adopters/issuance-flow.png create mode 100644 developer/wip/for-adopters/issuance-flow.puml create mode 100644 developer/wip/for-adopters/token-use.png create mode 100644 developer/wip/for-adopters/token-use.puml diff --git a/developer/wip/for-adopters/Identity Hub Concepts.md b/developer/wip/for-adopters/Identity Hub Concepts.md new file mode 100644 index 00000000..b729092e --- /dev/null +++ b/developer/wip/for-adopters/Identity Hub Concepts.md @@ -0,0 +1,249 @@ +# Identity Hub Concepts + +Identity Hub (IH) manages organization identity resources such as credentials for a dataspace participant. It is designed for machine-to-machine interactions and does not manage personal verifiable credentials. Identity Hub implements the [Decentralized Claims Protocol (DCP)](https://github.com/eclipse-dataspace-dcp/decentralized-claims-protocol.) and is based on key decentralized identity standards, including [W3C DIDs](https://www.w3.org/TR/did-core/), the [W3C did:web Method](https://w3c-ccg.github.io/did-method-web/), and the [W3C Verifiable Credentials Data Model v1.1](https://www.w3.org/TR/vc-data-model/)specifications, so we recommend familiarizing yourself with those technologies first. + +>One question that frequently comes up is whether Identity Hub supports [OpenID for Verifiable Credentials (OID4VC)](https://openid.net/sg/openid4vc/specifications/). The short answer is No. That's because OID4VC mandates human (end-user) interactions, while Identity Hub is designed for machine-to-machine interactions where humans are not in the loop. Identity Hub is built on many of the same decentralized identity standards as OID4VC but implements DCP, a protocol specifically designed for non-human flows. + +Identity Hub securely stores and manages W3C Verifiable Credentials, including handling presentation and issuance. But Identity Hub is more than an enterprise "wallet" since it handles key material and DID documents. Identity Hub manages the following identity resources: + +- **Verifiable Credentials**. Receiving and managing issued credentials and generating Verifiable Presentations (VPs). +- **Key Pairs**. Generating, rotating, and revoking signing keys. +- **DID Documents**. Generating and publishing DID documents. + +> The [EDC MVD Project](https://github.com/eclipse-edc/MinimumViableDataspace) provides a full test dataspace setup with Identity Hub. It's an excellent tool to experiment with Identity Hub and decentralized identity technologies. + +As we will see, Identity Hub can be deployed to diverse topologies, from embedded in a small footprint edge connector to an organization-wide clustered system. Before getting into these details, let's review the role of Identity Hub. + +## Identities and Credentials in a Dataspace: The Role of Identity Hub + +> Note this section assumes a solid understanding of security protocols, DIDs, verifiable credentials, and modern cryptography concepts. + +Identity Hub is built on the [Decentralized Claims Protocol (DCP)](https://github.com/eclipse-dataspace-dcp/decentralized-claims-protocol). This protocol overlays the [Dataspace Protocol (DSP)](https://github.com/eclipse-dataspace-protocol-base/DataspaceProtocol) by adding security and trust based on a decentralized identity model. To see how a decentralized identity system works, we will contrast it with a centralized approach. + +Protocols such as traditional OAuth2 grants adopt a centralized model where a single identity provider or set of federated providers issue tokens on behalf of a party. Data consumers request a token from an *identity provider*, which, in turn, generates and signs one along with a set of claims. The data consumer passes the signed token to the data provider, which verifies the token using public key material from the identity provider: + +![](centralized-identity.svg) + +The centralized model is problematic for many dataspaces: +- **It is prone to network outages.** If the identity provider goes down, the entire dataspace is rendered inoperable. Using federated providers only partially mitigates this risk while increasing complexity since large sections of a dataspace will still be subject to outage. +- **It does not preserve privacy.** Since an identity provider issues and verifies tokens, it is privy to communications between data consumers and providers. While the provider may not know the content of the communications, it is aware of who is communicating with whom. +- **Participants are not in control of their identity and credentials.** The identity provider creates identity tokens and manages credentials, not the actual dataspace participants. + +Identity Hub and the *Decentralized Claims Protocol* are designed to address these limitations by introducing a model where there is no single point of failure, privacy is maintained, and dataspace participants control their identities and credentials. This approach is termed *decentralized identity* and builds on foundational standards from the [W3C](https://www.w3.org/) and [Decentralized Identity Foundation](https://identity.foundation/). + +### The Presentation Flow + +To understand the role of Identity Hub in a dataspace that uses a decentralized identity system, let's start with a basic example. A consumer wants to access data from a provider that requires proof the consumer is certified by a third-party auditor. The certification proof is a W3C Verifiable Credential issued by the auditor. For now, we'll assume the consumer's Identity Hub already manages the VC (issuance will be described later). + +When the consumer's control plane makes a contract negotiation request to the provider, it must include a declaration of which participant it is associated with (the participant ID) and a way for the provider to access the required certification VC. From the provider's perspective, it needs a mechanism to verify the consumer control plane is operating on behalf of the participant and that the VC is valid. Once this is done, the provider can trust the consumer control plane and grant it access to the data by issuing a contract agreement. + +Instead of obtaining a token from a third-party identity provider, DCP mandates self-issued tokens. Self-issued tokens are generated and signed by the requesting party, which in the current example is the data consumer. As we will see, these self-issued tokens identify the data consumer and include a way for the provider to resolve the consumer's credentials. This solves the issues of centralized identity systems highlighted above. By removing the central identity provider, DCP mitigates the risk of a network outage. Privacy is preserved since all communication is between the data consumer and the data provider. Finally, dataspace members remain in control of their identities and credentials. + +Let's look at how this works in practice. Identity and claims are transmitted as part of the transport header in DSP messages. The HTTP bindings for DSP do this using an `Authorization` token. DCP further specifies the header contents to be a self-signed JWT. The JWT `sub` claim contains the sender's Web DID, and the JWT is signed with a public key contained in the associated DID document (as a verification method). The data provider verifies the sending control plane's identity by resolving the DID document and checking the signed JWT against the public key. + +This step only proves that the requesting control plane is operating on behalf of a participant. However, the control plane cannot yet be trusted since it must present the VC issued by the third-party auditor. DCP also specifies the JWT contains an access token in the `token` claim. The data provider uses the access token to query the data consumer's Identity Hub for a Verifiable Presentation with one or more required credentials. It obtains the endpoint of the consumer's Identity Hub from a `service` entry of type `CredentialService` in the resolved DID document. At that point, the provider connector can query the Identity Hub using the access token to obtain a Verifiable Presentation containing the required VC: + +![](token-use.png) + +Once the VP is obtained, the provider can verify the VC to establish trust with the consumer control plane. + +Why not just include the VP in the token or another HTTP header and avoid the call to Identity Hub? There's a practical reason: VPs often exceed the header size limit imposed by HTTP infrastructure such as proxies. DSP and DCP could have devised the concept of a message envelope (remember WS-* and SOAP?) but chose not to because it ties credentials to outbound client requests. To see why this is limiting, consider the scenario where a consumer requests access to an ongoing data stream. The provider control plane may set up a *policy monitor* to periodically check the consumer's credentials while the stream is active. In the DCP model, the policy monitor can query the consumer's Identity Hub using the mechanism we described without the flow being initiated by the consumer. + +#### Verifiable Presentation Generation + +When the data provider issues a presentation request, the consumer Identity Hub generates a Verifiable Presentation based on the query received in the request. DSP defines two ways to specify a query: using a list of string-based *scopes* or a [DIF Presentation Exchange presentation definition](https://identity.foundation/presentation-exchange/spec/v2.0.0/#presentation-definition). Identity Hub does not yet support DIF Presentation Exchange (this feature is in development), so scopes are currently the only supported mechanism for requesting a set of credentials be included. + +The default setup for Identity Hub translates a scope string to a Verifiable Credential type. For example, the following presentation query includes the `AuditCertificationCredential`: + +```json +{ + "@context": [ + "https://w3id.org/tractusx-trust/v0.8", + "https://identity.foundation/presentation-exchange/submission/v1" + ], + "@type": "PresentationQueryMessage", + "scope": ["AuditCertificationCredential"] +} +``` + +Identity Hub will process this as a request for the `AuditCertificationCredential` type. If the access token submitted along with the request permits the `AuditCertificationCredential`, Identity Hub will generate a Verifiable Presentation containing the `AuditCertificationCredential`. The generated VP will contain multiple credentials if more than one scope is present. + +> The default scope mapping behavior can be overridden by creating a custom extension that provides an implementation of the `ScopeToCriterionTransformer` interface. + +Two VP formats are supported: JWT-based and Linked-Data Proof. The JWT-based format is the default and recommended format because, in testing, it exhibited an order of magnitude better performance than the Linked-Data Proof format. It's possible to override the default JWT format by either implementing `VerifiablePresentationService` or providing a configuration of `VerifiablePresentationServiceImpl`. + +> When DIF Present Exchange is supported, client requests will be able to specify the presentation format to generate. + +### Issuance Flow + +**Note: Identity Hub issuance support is currently a work in progress.** + +W3C Verifiable Credentials enable a holder to present claims directly to another party without the involvement or knowledge of the credential issuer. This is essential to preserve privacy and mitigate against network outages in a dataspace. DCP defines the way Identity Hub obtains credentials from an issuer. In DCP, issuance is an asynchronous process. The Identity Hub sends a request to the issuer endpoint, including a self-signed identity token. Similar to the presentation flow described above, the identity token contains an access token the issuer can use to send the VC to the requester's Identity Hub. This is done asynchronously. The VC could be issued immediately or after an approval process: + +![](issuance-flow.png) + +Issuance can use the same claims verification as the presentation flow. For example, the auditor issuer in the previous example may require the presentation of a dataspace membership credential issued by another organization. In this case, the issuer would use the access token sent in the outbound request to query for the required credential from the Identity Hub before issuing its VC. + +## Using the Identity Hub + +Identity Hub is built using the EDC modularity and extensibility system. It relies on core EDC features, including +cryptographic primitives, Json-Ld processing, and DID resolution. This architecture affords a great deal of deployment flexibility. Let's break down the different supported deployment scenarios. + + +![](ih-deployments.svg) +### Organizational Component + +Many organizations prefer to manage identity resources centrally, as strict security and control can be enforced over these sensitive resources. Identity Hub can be deployed as a centrally managed component in an organization that other EDC components use. In this scenario, Identity Hub will manage all identity resources for an organization for all dataspaces it participates in. For example, If an organization is a member of two dataspaces, DS1 and DS2, that issue membership credentials, both credentials will be managed by the central deployment. Connectors deployed for DS1 and DS2 will use their respective membership credentials from the central Identity Hub. + +### Per Dataspace Component + +Some organizations may prefer to manage their identity resources at the dataspace level. For example, a multinational may participate in multiple regional dataspaces. Each dataspace may be geographically restricted, requiring all data and resources to be regionally fenced. In this case, an Identity Hub can deployed for each regional dataspace, allowing for separate management and isolation. + +### Embedded + +Identity Hub is designed to scale down for edge-style deployments where footprint and latency are primary concerns. In these scenarios, Identity Hub can be deployed embedded in the same runtime process as other connector components, providing a simple, fast, and efficient deployment unit. + +## Identity Hub APIs and Resources + +Identity Hub supports two main APIs: the *Identity API* for managing resources and the *DCP API*, which implements the wire protocol defined by the Decentralized Claims Protocol Specification. End-users generally do not interact with the DCP API, so we won't cover it here. The *Identity API* is the primary way operators and third-party applications interact with the Identity Hub. Since the API provides access to highly sensitive resources, it's essential to secure it. **Above all, the API should never be exposed over a public network such as the Internet.** + +The best way to understand the Identity API is to start with the resources it is designed to manage. This will give you a solid grounding for reviewing the OpenAPI documentation and using its RESTful interface. It's also important to note that since the Identity Hub is extensible, additional resource types may be added by third parties to enable custom use cases. + +### The Participant Context + +The Identity API includes CRUD operations for managing participant contexts. This API requires elevated administrative privileges. + +A *participant context* is a unit of control for resources in Identity Hub. A participant context is tied to a dataspace participant identity. Most of the time, an organization will have a single identity and use the same Web DID in multiple dataspaces. Its Identity Hub, therefore, will be configured with exactly one participant context to manage identity and credential resources. + +If an organization uses different identities in multiple dataspaces, its Identity Hub will contain one participant context per identity. All resources are contained and accessed through a participant context. The participant context acts as both a *scope* and *security* boundary. Access control for public client API endpoints is scoped to a specific participant context. For example, the JWT access token sent to data providers described above is associated with a specific context and may not be used to access resources in another context. Furthermore, the lifecycle of participant resources is bound to their containing context; if a participant context is removed, the operation will cascade to all contained resources. + +A participant context can be in one of three states: + +- `CREATED` - The participant context is initialized but not operational. Resources may be added and updated, but they are not publicly accessible. +- `ACTIVATED` - The participant context is operational, and resources are publicly accessible. +- `DEACTIVATED` - The participant context is not operational. Resources may be added and updated, but they are not publicly accessible. + +The participant context can transition from `CREATED` to `ACTIVATED` and between the `ACTIVATED` and `DEACTIVATED` states. + +It's useful to note that Identity Hub relies on the core EDC eventing system to enable custom extensions. Services may register to receive participant context events, for example, when a context is created or deleted, to implement custom workflows. + +### DID Documents + +When a participant context is created, it is associated with a DID. After a participant context is activated, a corresponding DID document will be generated and published. Currently, Identity Hub only supports Web DIDs, so publishing the document will make it available at the URL specified by the DID. Identity Hub can support other DID methods through custom extensions. + +In addition, custom publishers can be created by implementing the `DidDocumentPublisher` interface and adding it via an extension to the Identity Hub runtime. For example, a publisher could deploy Web DID documents to a web server. Identity Hub includes an extension for locally publishing Web DID documents. The extension serves Web DID documents using a public API registered under the `/did` path. Note that this extension is not designed to handle high-volume requests, as DID documents are served directly from storage and are not cached. For these scenarios, publishing to a web server is recommended. + +### Key Pair Resources + +Key pair resources are used to sign and verify credentials, presentations, and other resources managed by Identity Hub. The public and private keys associated with a key pair resource can be generated by Identity Hub or provided when the resource is created. Identity Hub persists all private keys in a secure store and supports using Hashicorp Vault as the store. + +A Key pair resource can be in one of the following states: + +- `CREATED` +- `ACTIVATED` +- `ROTATED` +- `REVOKED` + +Let's walk through these lifecycle states. + +#### Key Activation + +When a key pair is created, it is not yet used to sign resources. When a key pair is activated, Identity Hub makes the public key material available as a verification method in the participant context's DID document so that other parties can verify resources such as verifiable presentations signed by the private key. This is done by publishing an updated DID document for the participant context during the activation step. + +#### Key Rotation + +For security reasons, key pair resources should be periodically rotated and replaced by new ones. Identity Hub supports a staged rotation process to avoid service disruptions and ensure that existing signed resources can still be validated for a specified period. + +For example, let's assume private key A is used to sign Credential CA and public key A' is used to verify CA. If the key pair A-A' is immediately revoked, CA can no longer be validated, which may cause a service disruption. Key rotation can be used to avoid this. When the key pair A-A' is rotated, a new key pair, B-B', is created and used to sign resources. The private key A is immediately destroyed. A', however, will remain as a verification method in the DID document associated with the participant context. CA validation will continue to work. When CA and all other resources signed by A expire, A' can safely be removed from the DID document. + +>It's important to perform key rotation periodically to enhance overall system security. This implies that signed resources should have a validity period less than the rotation period of the key used to sign them and should also be reissued on a frequent basis. + +#### Key Revocation + +If a private key is compromised, it must be immediately revoked. Revocation involves removing the verification method entry in the DID document and publishing the updated version. This will invalidate all resources signed with the revoked key pair. + +### Verifiable Credentials + +> Support for storing verifiable credentials using the DCP issuance flow is currently in development. In the meantime, adopters must develop custom extensions for storing verifiable credential resources or create them through the Identity API. + +## Resource Operations + +Identity Hub implements transactional guarantees when resource operations are performed through the Identity API. The purpose of transactional behavior is to ensure the Identity Hub maintains a consistent state. This section catalogs those operations and guarantees. + +### Participant Context Operations + +#### Create + +When a participant context is created, the following sequence is performed: +- A transaction is opened. +- An API key is generated to access the context via the Identity API +- A DID document is created and added to storage. +- A default key pair is created and added to storage. +- The DID document is published if the participant context is set to active when created. +- The transaction commits on success, or a rollback is performed. + +#### Delete + +When a participant context is deleted, the following sequence is performed: +- A transaction is opened. +- The DID document is unpublished if the resource is in the `PUBLISHED` state. +- The DID document resource is removed from storage. +- All associated key pair resources are removed from storage except for private keys. +- The participant context is removed from storage. +- The transaction commits on success, or a rollback is performed. +- All private keys associated with the context are removed after the transaction is committed since Vaults are not transactional resources. + +If destroying private keys fails, manual intervention will be required to clean them up. Note that the IH will be in a consistent state. + +#### Activate + +A participant context cannot be activated without a default key pair. + +When a participant context is activated, the following sequence is performed: +- A transaction is opened. +- The context is updated in storage. +- The DID document is published. +- The transaction commits on success, or a rollback is performed. + +#### Deactivate + +When a participant context is deactivated, the following sequence is performed: +- A transaction is opened. +- The context is updated in storage. +- The DID document is unpublished. +- The transaction commits on success, or a rollback is performed. + +There is a `force` option that will commit the transaction if the DID document unpublish operation is not successful. + +### Key Pair Operations + +#### Activate + +This operation can only be performed when the participant context is in the `CREATED` or `ACTIVATED` state. + +When a key pair is activated, the following sequence is performed: +- A transaction is opened. +- The new key pair is added to storage. +- If the DID document resource is in the `PUBLISHED` state, the DID document is published with all verification methods for public keys in the `ACTIVATED` state. +- The transaction commits on success, or a rollback is performed. + +If the transaction commit fails, the DID document must be manually repaired. This can be done by republishing the DID document. + +#### Rotate + +When a key pair is rotated and a new one is added, the following sequence is performed: +- A transaction is opened. +- The new key pair is added to storage. +- If the DID document resource is in the `PUBLISHED` state, the DID document is published with a verification method for the new public key. +- The transaction commits on success, or a rollback is performed. +- The old private key is destroyed (note, not the old public key) after the transaction is committed since Vaults are not transactional resources. + +#### Revoke + +When a key pair is rotated, the following sequence is performed: + +When a key pair is revoked, the following sequence is performed: +- A transaction is opened. +- The key pair state is updated. +- If the DID document resource is in the `PUBLISHED` state, the DID document is published with a verification method for the rotated public key removed. +- The transaction commits on success, or a rollback is performed. diff --git a/developer/wip/for-adopters/centralized-identity.svg b/developer/wip/for-adopters/centralized-identity.svg new file mode 100644 index 00000000..4e6bc42c --- /dev/null +++ b/developer/wip/for-adopters/centralized-identity.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/developer/wip/for-adopters/ih-deployments.svg b/developer/wip/for-adopters/ih-deployments.svg new file mode 100644 index 00000000..93ddb1d3 --- /dev/null +++ b/developer/wip/for-adopters/ih-deployments.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/developer/wip/for-adopters/issuance-flow.png b/developer/wip/for-adopters/issuance-flow.png new file mode 100644 index 0000000000000000000000000000000000000000..b6c039e89a03cb443c804c6f6dfb2a482b020e6b GIT binary patch literal 20030 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 b|Jgfw()fj+HZ21lgTe~DWM4fwG;n> literal 0 HcmV?d00001 diff --git a/developer/wip/for-adopters/issuance-flow.puml b/developer/wip/for-adopters/issuance-flow.puml new file mode 100644 index 00000000..685b32d4 --- /dev/null +++ b/developer/wip/for-adopters/issuance-flow.puml @@ -0,0 +1,22 @@ +@startuml +!pragma layout smetana + +!include diagram.styles.puml + +autonumber + +box "Participant" +participant "Client" as C +participant "Identity Hub" as IH +end box + +box "Issuer" +participant "Issuer Service(s)" as IS #FFF4B3 +end box + +C -> IH: Initiate process +IH -> IS: Request Credential using Self-Issued ID token +IS -> IH: (async) )Write Membership Credential + + +@enduml diff --git a/developer/wip/for-adopters/token-use.png b/developer/wip/for-adopters/token-use.png new file mode 100644 index 0000000000000000000000000000000000000000..ae77998740cd0a99bb7e47db76d7b701c411e449 GIT binary patch literal 20045 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 literal 0 HcmV?d00001 diff --git a/developer/wip/for-adopters/token-use.puml b/developer/wip/for-adopters/token-use.puml new file mode 100644 index 00000000..b642a022 --- /dev/null +++ b/developer/wip/for-adopters/token-use.puml @@ -0,0 +1,23 @@ +@startuml +!pragma layout smetana + +!include diagram.styles.puml + +autonumber + +box "Data Consumer" +participant "Connector" as C +participant "Identity Hub" as IH +end box + +box "Data Provider" +participant "Connector" as PC +end box + +C -> IH: SI token request +IH -> C: Token response w/ access token + +C-> PC: Request w/ si token and access token +PC-> IH: request w/ access token +IH ->PC: VP response +@enduml