Restores `agents-access` (**Coder Agents User**) as a built-in organization role and adds it to every organization's `default_org_member_roles`. Members keep Coder Agents by default, and admins can now restrict it per organization by removing the role from the defaults and granting it through IdP role sync or direct assignment. Since #28186, chat permissions lived in the organization-member floor, so the only way to limit Coder Agents was narrowing per-model access lists, which did not hide the feature. - Migration 000602 appends `agents-access` to every organization's defaults, so upgrading keeps every member's access. New organizations get it from `rbac.DefaultOrgMemberRoles()`. - Service accounts do not inherit the role from the defaults (`GetAuthorizationUserRoles`), so they still need an explicit grant for chat. - Owners and Organization Admins keep chat access regardless of defaults. Chats shared with a user stay readable without the role. - Role sync is unchanged. It does not store default roles, so after the default is removed a mapped user gets `agents-access` at their next sign-in. - The retired-role mechanism (`IsRetiredRoleName`) is removed. - `PATCH /api/v2/organizations/{organization}` rejects duplicate `default_org_member_roles` entries (the CLI already de-duplicated them). - Custom organization role requests treat built-in role names case-insensitively, since custom role names are stored lowercase and `Agents-Access` would otherwise become an undeletable shadow of the built-in role. - The Agents permission alert tells restricted members their chats are kept, and the model selector for users without chat permission no longer claims that no models are configured. Docs add "Control who can use Coder Agents" to the Agents getting-started guide. **NOTE**: Migration 000602 deletes custom roles named `agents-access`, which the built-in role would shadow. The down migration does not restore them. Stored member grants of `agents-access` from the earlier built-in role or a deleted custom role stay and now grant chat access. ## Validation - Remote dogfood [UAT](https://dogfood.cdr.dev/agents/e1c18dc6-f6f0-49a1-b6cd-6ce014b51a86) passed onfb441dfae5, covering case variants of built-in role names on create, update, delete, default roles, and member grants. The previous round, ona6fef66b3f, passed the upgrade from main5dde49dffbon a fresh database.6b7f107e0bonly changes wording (docs, comments, UI copy, CLI help) and did not go through UAT. - Local: rbac, dbauthz, idpsync, migrations (chain including 000602 down and up), querier, httpmw, provisionerdserver, coderd and enterprise chat, role, and organization tests, chatd, toolsdk, CLI; frontend vitest, story tests, biome, oxlint, tsc. ## Known issues (not changed here) - Sending from a chat page that was already open when access was removed shows a generic 404 panel until reload. - The members page role editor is not locked for OIDC users under org role sync; the API rejects the change with 400. - Creating a custom role named after a system role (`organization-member`, `organization-service-account`) returns 400 with a raw database unique-constraint error. <details> <summary>Review record</summary> - Remote UAT (UAT Critic sub-agent `6636c855ec`): round 1 on8bec029d35passed with issues, fixed ind7ba937a10and e0f16e1a45f; round 2 ona6fef66b3fpassed; round 3 onfb441dfae5passed. - Codex: round 1 ona6fef66b3ffound one P2 (case variants of built-in role names), fixed infb441dfae5with a red-green test. Rounds 2 and 3 onfb441dfae5found no major issues. - mafredri onfb441dfae5(PR text only): nine wording suggestions applied in 6b7f107e0b9; NOTE extended for stored grants; description trimmed. - Frontend: FE1 to FE10 and coder-frontend-review checkpoints self-audited. </details> > 🤖 This PR was opened by [Xum](https://mux.coder.com) on behalf of @ibetitsmike.
7.4 KiB
title
| title |
|---|
| Groups and roles (Premium) |
Groups and roles can be manually assigned in Coder. For production deployments, these can also be managed and synced by the identity provider.
Groups
Note
Groups require a Premium license. For more details, contact your account team.
Groups are logical segmentations of users in Coder and can be used to control which templates developers can use. For example:
- Users within the
devopsgroup can access theAWS-VMtemplate - Users within the
data-sciencegroup can access theJupyter-Kubernetestemplate
Roles
Roles determine which actions users can take within the platform. The roles in the following table apply across the whole deployment. Organizations have their own roles. Refer to Organization roles for more information.
| Auditor | User Admin | Template Admin | Owner | |
|---|---|---|---|---|
| Add and remove Users | ✅ | ✅ | ||
| Manage groups (premium) | ✅ | ✅ | ||
| Change User roles | ✅ | |||
| Manage ALL Templates | ✅ | ✅ | ||
| View ALL Workspaces | ✅ | ✅ | ||
| Update and delete ALL Workspaces | ✅ | |||
| Run external provisioners | ✅ | ✅ | ||
| Execute and use ALL Workspaces | ✅ | |||
| View all user operation Audit Logs | ✅ | ✅ |
A user may have one or more roles. Every user also holds an implicit Member role that covers their own account, such as reading their profile and managing their tokens.
The Member role doesn't grant workspace access on its own. The ability to create and use workspaces comes from the organization's default member roles, which include Organization Workspace Access by default. Refer to Default member roles for how to remove workspace operations from the default member set.
The preceding table describes a default deployment.
A deployment that sets CODER_DISABLE_OWNER_WORKSPACE_ACCESS removes the Owner role's SSH, application, and terminal access to other users' workspaces.
Owners keep that access to workspaces they own.
Refer to --disable-owner-workspace-access for the flag, environment variable, and YAML forms.
Organization roles
Organization roles apply inside a single organization rather than across the deployment. A user who belongs to more than one organization can hold different organization roles in each one. Assign organization roles from Admin settings > Organizations > Members, or sync them from your identity provider with IdP sync.
Coder ships the following organization roles:
- Organization Admin: manages the organization's templates, provisioners, groups, members, and organization role assignments.
- Organization User Admin: manages the organization's members, groups, and role assignments, including its IdP sync settings.
- Organization Template Admin: manages the organization's templates and provisioners, and reads its workspaces.
- Organization Auditor: reads the organization's audit logs and connection logs, along with the resources those logs reference.
- Organization Workspace Access: creates and operates the user's own workspaces in the organization.
- Organization Workspace Creation Ban: blocks creating and deleting workspaces in the organization, and overrides any role that would otherwise allow it.
- Coder Agents User: uses Coder Agents in the organization. Members other than service accounts hold this role through the organization's default member roles unless an administrator removes it.
Organization Admin doesn't include SSH, application, or terminal access to workspaces other members own. A user with that role can read, build, stop, and delete those workspaces. Connecting to one requires access granted through workspace sharing.
Every member of an organization also holds an implicit organization membership role that the dashboard doesn't display. That role carries the smallest permission set a member needs, such as reading the organization and their own membership record. Service accounts hold an equivalent implicit role.
Custom roles
Note
Custom roles are a Premium feature. Learn more.
Starting in v2.16.0, Premium Coder deployments can configure custom roles on the Organization level. You can create and assign custom roles in the dashboard under Organizations -> My Organization -> Roles.
Example roles
- The
Banking Compliance Auditorcustom role cannot create workspaces, but can read template source code and view audit logs - The
Organization Leadrole can access user workspaces for troubleshooting purposes, but cannot edit templates - The
Platform Memberrole cannot edit or create workspaces as they are created via a third-party system
Custom roles can also be applied to headless user accounts:
- A
Health Checkrole can view deployment status but cannot create workspaces, manage templates, or view users - A
CIrole can update manage templates but cannot create workspaces or view users
Creating custom roles
Selecting "Create custom role" opens a UI to select the desired permissions for a given persona.
From there, you can assign the custom role to any user in the organization under the Users settings in the dashboard.
Note that these permissions only apply to the scope of an organization, not across the deployment.
Security notes
A malicious Template Admin could write a template that executes commands on the
host (or coder server container), which potentially escalates their privileges
or shuts down the control plane. To avoid this, run
external provisioners.
In low-trust environments, we do not recommend giving users direct access to edit templates. Instead, use CI/CD pipelines to update templates with proper security scans and code reviews in place.