feat: gate platform-admin on a configurable role for mTLS-authenticated identities
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 5/5
- Temps estimé
- Plus d'une semaine
- Accessibilité débutants
- 45/100
- Type d'issue
- Fonctionnalité
- Clarté
- Plutôt claire
- Activité
- Active
- Stack technique
- helm, rust
- Domaine
- authentication, authorization, backend-api-design, devops, documentation
Piste de recherche
Commencez par MtlsAuthConfig dans crates/openshell-core/src/config.rs et par les chemins d’autorisation et d’identité mTLS dans crates/openshell-server/src/multiplex.rs, en particulier les sections citées. Examinez la configuration de la gateway Helm et les fichiers de documentation nommés dans les critères d’acceptation, puis résolvez le comportement OIDC/mTLS avant l’implémentation. Le travail est considéré comme terminé lorsque les protections au démarrage, les résultats d’autorisation, le rendu Helm et la documentation correspondent aux critères d’acceptation, sans modifier l’authentification JWT de sandbox.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
User Story
As an operator running the gateway behind a trusted fronting service that creates workspaces and sandboxes on behalf of users, I want a platform-admin identity authenticated by an mTLS client certificate and gated by a configurable admin role, without running an OIDC provider, so that only my fronting service holds platform admin and presenting any valid client certificate does not make a caller an admin.
Problem Statement
The gateway only enforces platform-admin RBAC when OIDC is configured. Without an OIDC issuer there is no way to distinguish an admin from an ordinary authenticated caller, so every mTLS-authenticated caller is treated as a platform admin. There is no supported managed platform identity that avoids standing up OIDC.
Impact / Why This Matters
To give a fronting service admin while end users have none, an operator must deploy a full OIDC issuer purely for role separation — disproportionate for a deployment whose only authenticated caller is a certificate-holding backend, and it adds an external dependency with its own availability and rotation concerns.
On main today:
AuthzPolicyis built only from OIDC config and isNonewithout an issuer (crates/openshell-server/src/multiplex.rs:282).- The role check runs only when that policy exists (
crates/openshell-server/src/multiplex.rs:1153); with no policy, anyPrincipal::Userreaches platform-admin methods unchecked. MtlsAuthConfigexposes onlyenabled(crates/openshell-core/src/config.rs:972-978), so an operator cannot declare which certificates are admin.
Proposed Design
mTLS authentication supports role-based authorization on its own, resolving admin/user roles from config when no OIDC issuer is present.
- Configurable roles on the mTLS block.
[openshell.gateway.mtls_auth]gainsadmin_roleanduser_role. A certificate carryingOU=<admin_role>is authorized for platform-admin methods;OU=<user_role>is a standard user subject to workspace-membership checks; neither is denied. - Fail closed. An empty
admin_rolenever makes a CA-signed certificate an admin. When mTLS user auth is enabled with no resolvable admin role, the gateway refuses to start. - Reject the unsafe combination. mTLS user auth together with
allow_unauthenticated_usersis rejected (the local-dev principal carries platform-admin). - Deployment. Helm renders the new fields into
gateway.tomland fails rendering on the same misconfigurations the binary rejects.
Observable outcome: an operator configures mTLS with an admin role, issues admin-OU certificates only to the fronting service, and that service can create workspaces/sandboxes while no other caller reaches platform-admin methods — with no OIDC anywhere.
Acceptance Criteria
- With mTLS enabled, an
admin_roleset, and no OIDC, a cert carryingOU=<admin_role>is authorized for platform-admin methods; a CA-signed cert without it is denied. - With no OIDC and no admin role configured, an mTLS identity is not treated as platform-admin.
- mTLS user auth enabled with no resolvable admin role fails at startup with a clear error.
- mTLS user auth plus
allow_unauthenticated_usersfails at startup with a clear error. - Configuring both OIDC and mTLS user auth resolves per the Open Question (proposed: fail at startup).
- Helm renders the mTLS role fields and fails rendering on the misconfigurations the binary rejects.
- Sandbox supervisor calls continue to authenticate via gateway-minted sandbox JWTs, unchanged.
-
docs/reference/gateway-config.mdxandarchitecture/gateway.mddocument the path and its guardrails.
Open Question
What happens when both OIDC and mTLS user auth are configured? Proposed: fail at startup. Silently honoring one and ignoring the other hides a misconfiguration on the auth boundary, and an mTLS caller carries cert OUs, not OIDC claims — so "OIDC wins" would leave it authenticated but effectively role-less. Whether both can even be active on the same listener needs confirmation.
Alternatives Considered
- Require OIDC for role separation (status quo). Forces an external identity provider onto a certificate-only deployment for no functional benefit.
- Treat all mTLS callers as admin (implicit today). This is the gap — every authenticated caller becomes admin.
- A dedicated admin-only client CA. Heavier operationally than a role OU and resolves to the same authorization question; possible follow-up, not the primary design.
Agent Investigation
The identity layer is already provider-agnostic (an Identity carries roles whether from OIDC or a cert), mTLS already extracts CN→subject and OU→roles (crates/openshell-server/src/multiplex.rs:1398-1409), and the role check is provider-neutral. The missing pieces are narrow: role fields on the mTLS config, a single resolver for the effective role names when there is no OIDC issuer, and having the authorization middleware consult it instead of only an OIDC-derived policy. The fail-closed and startup guards sit at existing config-validation and authorization sites. The sandbox JWT credential path is orthogonal and unchanged.
Checklist
- I've reviewed existing issues and the architecture docs
- This is a design proposal, not a "please build this" request
- Langage dominant
- Rust
- Étoiles
- 8.7k
- Forks
- 1.3k
- Merge moyen
- 2 j 6 h
- PR mergées (30 j)
- 301
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de NVIDIA/OpenShell
-
area:docs
Difficulté 1/5 Moins d'une heure Accessibilité débutants 88/100
-
state:triage-needed
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
-
area:cli state:validated
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
-
state:triage-needed
Difficulté 1/5 Moins d'une heure Accessibilité débutants 90/100
-
area:build spike state:review-ready state:stale
Difficulté 2/5 Une demi-journée Accessibilité débutants 68/100
Toutes les issues de NVIDIA/OpenShell
Issues similaires
-
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
TheLarkInn/aipm#2413 ·
-
documentation
Difficulté 1/5 Moins d'une heure Accessibilité débutants 90/100
alexgorbatchev/simple-ptt#15 ·
-
tooling
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
-
todo:ticket
Difficulté 2/5 1-3 heures Accessibilité débutants 70/100
-
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
taikoxyz/taiko-mono#22168 · 1 commentaire ·