Spaces:
Running
Running
# CIP-2: Auth Providers Proposal | |
## Status | |
Current Status: `Accepted` | |
## **Motivation** | |
Currently, Chroma does not provide any authentication mechanism. This CIP proposes to | |
add authentication abstractions and basic authentication mechanisms to Chroma. | |
There are intrinsic and extrinsic motivations for this CIP. The intrinsic motivation | |
is to provide a secure way to access Chroma as adoption grows and the team is gearing up to release a cloud offering. | |
The extrinsic motivation is driven by the community which is deploying Chroma in both public and private clouds and | |
in test and production environments. The community has expressed the need for authentication and authorization. | |
> Observation: We consider the Auth to be applicable to client-server mode. | |
## **Public Interfaces** | |
Changes to the public interface are related to the `Settings` class where we introduce new optional attributes to | |
control server and client-side auth providers. | |
## **Proposed Changes** | |
We propose two abstraction groups, one for the server-side and another for the client-side. In | |
addition we also introduce a FastAPI/startlette middleware adapter which will allow using the server-side abstractions | |
in the context of FastAPI. For client-side we rely on `requests` | |
### Architecture Overview | |
Architecture Overview: | |
 | |
Request Sequence: | |
 | |
### Constraints | |
This section provides the architectural constraints for the authentication framework. The constraints are set of | |
restrictions we impose to make the design simpler and more robust. | |
- There must be at most one active client-side auth provider | |
- There must be at most one active client-side credentials provider | |
- There must be at most one active server-side auth provider | |
- There must be at most one active server-side auth configuration provider | |
- There must be at most one active server-side auth credentials provider | |
### Core Concepts | |
- Auth Provider - an abstraction that provides authentication functionality for either client or server-side. The | |
provider is responsible for validating client credentials using (if available) configuration and credentials | |
providers. The auth provider is also responsible for carrying the Chroma-leg of any authentication flow. | |
- Auth Configuration Provider - an abstraction that provides configuration for auth providers. The configuration can be | |
loaded from a file, env vars or programmatically. The configuration is used for validating and/or accessing user | |
credentials. Examples: secret key for JWT token based auth, DB URL for DB based auth, etc. Depending on sensitivity of | |
the information stored in the configuration, the provider should implement the necessary interfaces to access such | |
information in a secure way. | |
- Auth Credentials Provider - an abstraction that provides credentials for auth providers. The credentials can be | |
loaded from a file, env vars or programmatically. The credentials are used for validating client-side credentials (for | |
sever-side auth) and retrieving or generating client-side credentials (for client-side auth). | |
#### Abstractions | |
##### Server-Side | |
We suggest multiple abstractions on the server-side to allow for easy integration with different auth providers. | |
We suggest the following abstractions: | |
> Note: All abstractions are defined under `chromadb.auth` package | |
- `ServerAuthProvider` - this is the base server auth provider abstraction that allows any server implementation of | |
Chroma to support variety of auth providers. The main responsibility of the auth provider is to orchestrate the auth | |
flow by gluing together the auth configuration and credentials providers. | |
- `ChromaAuthMiddleware` - The auth middleware is effectively an adapter responsible for providing server specific | |
implementation of the auth middleware. This includes three general types of operations - forwarding authentication to | |
the auth provider, instrumenting the server if needed to support a specific auth flow, ignore certain | |
actions/operations (e.g. in REST this would be verb+path) that should not be authenticated. | |
- `ServerAuthenticationRequest` - An abstraction for querying for authentication data from server specific | |
implementation. | |
- `ServerAuthenticationResponse` - An abstraction for returning authentication data to server specific implementation. | |
- `ServerAuthConfigurationProvider` - this is the base abstraction for auth configuration providers. The provider is | |
responsible for loading auth configuration from a file, env vars or programmatically. | |
- `AbstractCredentials` - base abstraction for credentials encapsulation from server to Auth Credentials Provider. | |
- `ServerAuthCredentialsProvider` - this is the base abstraction for auth credentials providers. The provider is | |
responsible for verifying client credentials. | |
##### Client-Side | |
We suggest multiple abstractions on the client-side to allow for easy integration with different auth providers. | |
- `ClientAuthProvider` - this is the base client auth provider abstraction that allows any client implementation of | |
Chroma to support variety of auth providers. The main responsibility of the auth provider is to orchestrate the auth | |
flow by gluing together the auth configuration and credentials providers, and any possible auth workflows (e.g. OAuth) | |
- `ClientAuthConfigurationProvider` - this is the base abstraction for auth configuration providers. The provider is | |
responsible for loading auth configuration from a file, env vars or programmatically. | |
- `ClientAuthCredentialsProvider` - this is the base abstraction for auth credentials providers. The provider is | |
responsible for verifying client credentials. | |
- `AbstractCredentials` - base abstraction for credentials encapsulation from client to Auth Credentials Provider. | |
- `ClientAuthProtocolAdapter` - this is an abstraction that allows for client-side auth providers to communicate with | |
backends using variety of protocols and libraries (e.g. `requests`, `gRPC` etc). The adapter is responsible for | |
translating the auth requests to generated by the credentials provider to a protocol specific message. | |
#### Workflows | |
##### Server-Side | |
 | |
##### Client-Side | |
 | |
### Configuration | |
#### Server-side | |
TBD | |
#### Client-side | |
### Reasoning | |
- Server-side abstraction - it is very useful as the intention is to support a variety of auth providers. | |
- Client-side abstraction - similar reasoning but from client's perspective. It will allow for both standard and | |
non-standard auth provider plugins to be added without further impacting the client side | |
- Backend (fastAPI) adapter - this is a backend-specific way of loading server-side auth provider plugins. It will also | |
serve as a template/blueprint when it comes to introducing the auth plugins to another backend framework (e.g. Flask) | |
We also propose that each auth provider on either side must be configurable via three main methods depending on | |
developer preference: | |
- File-base - a configuration file that provides the requisite config and credentials (recommended for production) | |
- Env - configuration through environment variables (this can also apply for the file-based config, which can be | |
specified in env var) | |
- Programmatically - provide requisite configuration through CLI or directly in code (it is left for the developer to | |
decide how such configuration is loaded and made available to the auth provider) - this is possibly the least secure | |
and should be used for testing | |
The intention is to start with two minimal but useful Auth providers: | |
- Basic Auth - base64 encoded user and password credentials. The credentials will be static in nature and defined via | |
auth provider config | |
- Token - A simple static token implementation | |
Both of the above providers will rely on the `Authorization` header to achieve their functionality. | |
> Both initial providers are there to help introduce a bear minimum security but are not recommended for production use | |
Further work: | |
- Introduction of JWT and mTLS auth providers | |
- API Keys | |
- Chroma managed user store - this would be similar to what standard DBMS’ are doing today - maintain a table with users | |
and salted password hashes | |
- K8s RBAC integration (for cloud-native deployments) | |
- GCP service accounts? | |
- SPIFFE and SPIRE integrations | |
- Go and Java client-side auth providers (for other impl like Rust and Ruby, we need to discuss with respective | |
maintainers) | |
> Note: this CIP intentionally does not tackle authZ but acknowledges that authN and authZ must work in tandem in future | |
> releases | |
## **Compatibility, Deprecation, and Migration Plan** | |
This change, introducing a pluggable auth framework is not impacting compatibility of existing deployments and users can | |
upgrade and use the new framework without the need for migration. | |
No deprecations. | |
## **Test Plan** | |
We will introduce a new set of tests to verify both client and server-side auth providers. | |
## **Rejected Alternatives** | |
We have considered direct middleware Auth or existing third-party libraries for FastAPI integration with auth providers, | |
but that will create a dependency for Chroma on FastAPI itself. | |
We have also considered using OAuth 2.0 or OIDC however the challenge there is that both of these protocols are | |
generally intended for User (human) auth whereas in our case we have a system-to-system auth. That said there still | |
might be room for either of these protocols, but further more in-depth use case analysis is required. | |
Relying entirely on external providers, while this is possible not providing out-of-the-box integrated auth capabilities | |
is a non-starter for many enterprise customers. | |