Access Control
The OpenShell gateway supports two access-control models for human callers on Kubernetes:
The Helm chart always generates mTLS certificates at install time. The gateway uses them for transport-layer security regardless of which access-control model you choose. The client bundle in the openshell-client-tls secret is used internally by sandbox supervisors, not for granting access to individual users.
For how the CLI resolves gateways and stores credentials, refer to Gateway Authentication.
OIDC User Authentication
Set server.oidc.issuer to enable OIDC. The gateway validates the Authorization: Bearer <token> header on every request against the issuer’s JWKS endpoint.
The audience value must match the client ID configured in your identity provider for the OpenShell resource server.
OIDC values reference
Auth-only mode vs. RBAC mode
Leave both adminRole and userRole empty to use auth-only mode: any request with a valid JWT from the configured issuer is accepted, but no role distinction is enforced.
Set both values to enable RBAC mode, where the gateway checks the role claim and enforces access based on the assigned role:
adminRole and userRole must both be set or both be empty — setting only one is not supported.
Provider-specific rolesClaim paths
Reverse-Proxy Auth Termination
When an access proxy — such as Cloudflare Access, ngrok, or a corporate SSO gateway — handles authentication in front of the OpenShell gateway, you can disable the gateway’s own client certificate verification:
The gateway still serves TLS, but stops requiring a client certificate on incoming connections. The proxy is responsible for authenticating callers and forwarding only authorized traffic.
To also disable TLS entirely (when the proxy terminates TLS before the request reaches the gateway):
Only disable TLS and gateway auth when the gateway is not reachable from outside the cluster and the proxy path is fully trusted. Never expose a plaintext, auth-disabled gateway to a public network.
Register the gateway with the CLI using the proxy’s public URL — the browser-based login flow runs automatically on first use: