Backstage permission framework and RBAC

Backstage ships with permissions that allow every signed-in user to do everything. This page explains how to turn on the permission framework, write policies on users and groups, resolve group membership at sign-in and test policies before rollout.

On this page

Why Backstage needs a real permission policy before rollout

A Backstage portal that holds service ownership, documentation, software templates and possibly Kubernetes views is only as safe as the rule that decides who can act on each of them. This page answers one question: how do you replace the allow-all default with an authorization policy that reflects your teams and data, and how do you prove that policy works before people depend on it. Without that change, any signed-in user can read, modify or trigger almost anything the portal exposes, and the portal becomes a shared surface with no owner-level controls.

Authentication and authorization answer different questions. Authentication establishes who the user is, which is the job of the sign-in providers and the sign-in resolvers that map each provider's identity to a catalog user. Authorization decides whether that identity may perform a specific action on a specific resource. The Backstage permission framework is the mechanism for the second question: plugins ask it whether an action is allowed, and a policy you write answers. Confirm the current policy interface and permission names in the Backstage authentication documentation and the permissions documentation for your Backstage version before designing rules against them.

A team usually needs this work when the portal serves more than one business unit, when catalog entries or TechDocs contain regulated or confidential information, or when a software template performs write actions such as creating repositories or provisioning infrastructure. Illustrative example: a template that creates a repository and a cloud resource should not be runnable by every user who can sign in. Before rollout, list which actions have effects outside Backstage, decide which groups own which entities, and plan test cases that confirm allowed and denied outcomes for each role.

Permission configuration options and when each fits

This table compares the main ways a team can configure Backstage permissions, from the default allow-all behavior to rules based on groups and catalog ownership. Read each row for the situations where the option fits and the trade-off it carries. The main takeaway is that group-based policies combined with accurate catalog ownership cover most production needs, but only if sign-in resolves groups correctly and every policy is tested before rollout.

OptionWhen it fitsTrade-off
Allow-all behavior in non-production onlySandboxes, local development and evaluation portals that hold no sensitive catalog dataAny signed-in user can read and change everything, so this setting must never carry over into production configuration
Custom policy class per deploymentOrganizations with specific rules, such as limiting template use or edits to owning teamsYour team writes, tests and maintains policy code, and must recheck it at each Backstage upgrade
Policies keyed on individual usersSmall portals with a few named administrators or a short list of exceptionsGrants go stale as people change roles, and the list becomes hard to audit as the organization grows
Policies keyed on group membershipMost organizations that already manage teams in an identity directoryDepends on groups resolving correctly at sign-in; missing or wrong groups silently deny or grant access
Decisions based on catalog ownershipRules such as owners of a component may edit its entity and its docsOnly as accurate as owner fields in catalog descriptors; unowned entities need an explicit fallback rule
Groups for roles, ownership for entitiesLarger catalogs where roles are shared across teams but changes must stay with ownersMore rules to test, and the two sources can disagree, so precedence must be written down
Sign-in resolver mapping to one identityAny deployment with more than one identity provider or a directory that holds group dataEach provider must resolve to the same user identity, or group-based rules apply to the wrong person
Guest access in productionShort-lived demos only, outside any environment that holds real catalog dataAuthentication guidance advises against it in production because guest sessions bypass the identity your rules depend on

Writing policies on users and groups

Once permissions are enabled, every request is decided by the policies you write, so the design of users and groups matters as much as the code. The six decisions below connect group structure, catalog ownership, templates, visibility and unaffiliated users into one access model you can test before rollout.

Mirror the organization in groups

Map policy groups to the teams that actually own services, such as platform, payments or data engineering, rather than to job titles or individual managers. Group membership is resolved at sign-in through your sign-in resolver, so confirm which directory attribute feeds each group and that the names are stable. Renames in the directory will change access in Backstage, so decide who owns that mapping before the first policy goes live.

Decide who edits team entities

Catalog entities carry an owner reference, and a sound default is that only members of the owning group can update or unregister an entity they own, while everyone else gets read access. Write this as a conditional rule on the entity owner rather than a list of named users, so it holds as teams change. Test it with a user from a different team to confirm the edit is denied.

Restrict template execution

Software templates can create repositories, open pull requests and call external systems, so running a template is a higher-risk permission than viewing one. Decide which groups may execute each template, and keep platform-owned templates limited to the platform group. Illustrative example: a sandbox template open to all engineers while a template that provisions production accounts is limited to the cloud team.

Limit Kubernetes and docs visibility

Visibility of workloads and documentation should follow the same team boundaries as catalog edits, otherwise a user who cannot see a service can still read its runbook or pod status. Decide whether a user sees a service's Kubernetes resources only when they belong to the owning team, and confirm that TechDocs and Kubernetes views honor the same catalog read decision.

Fewer broad rules or many narrow ones

Fine-grained rules per entity type and action are precise and easy to audit for sensitive areas, but they multiply quickly and become hard to review and test. A small set of broad rules, such as allow read for all authenticated users and allow write for the owning group, is easier to reason about but may grant more than intended. Most teams start broad, then add narrow rules only where a risk review justifies them.

Handle users in no group

Users who sign in without any group membership need an explicit answer, because a default that allows everything or denies everything will surprise someone. Decide whether unaffiliated users get read-only catalog access or none, and confirm how contractors, service accounts and users removed from the directory are treated. Check this case in your test suite before rollout, since it is the most common gap in first policies.

Setup sequence: enable permissions, resolve groups, then test

This sequence turns Backstage from an allow-all portal into one where catalog access follows group membership from your identity provider. Each step leaves a check you can run before moving to the next, so the policy reaches production only after it has been exercised against representative users.

  1. Confirm the Backstage version and upgrade path

    The platform engineering lead checks which Backstage release line the instance runs and whether it is still inside the supported window before changing authorization. Backstage moves all @backstage packages together through yarn backstage-cli versions:bump, and the Backstage Upgrade Helper shows template changes between versions, so plan any version bump as a separate change. Confirm the Node.js version against the two adjacent even-numbered releases the versioning policy supports. Check: the instance builds and starts on the current version, and the team has written down the target version and the upgrade steps it will use.

  2. Enable the permission framework in configuration

    Backend engineers turn on the permission framework in the backend configuration and register the permission policy module that will evaluate requests. Until a real policy replaces the default, the instance may still allow everything, so this step should be reviewed as a change to the authorization boundary. Keep guest access off for production, as the authentication documentation advises. Check: the backend starts with the permission module loaded, and a request from a signed-in user reaches the policy layer and is logged as an authorization decision rather than silently allowed.

  3. Resolve group membership at sign-in

    Identity engineers configure the sign-in resolver for each identity provider so that group membership from the directory is written into the Backstage user identity. The authentication documentation advises that every provider resolve to the same identity, so a user who signs in with two providers should not end up as two users with different groups. Map directory groups to catalog Group entities with the same names the policy will reference. Check: sign in as a test user from each group, then confirm in the catalog that the user entity lists the expected group memberships and that a user with no group sees none.

  4. Write the initial policy for catalog read and write

    The team writes a first policy that covers catalog read and catalog write, the two permissions most teams need to scope first. Keep the initial rules few and readable: for example, members of an owning group can edit entities they own, and everyone signed in can read entities. Decide explicitly what happens to requests the policy does not match, and choose a default deny for anything not covered by a rule. Check: the policy file is in version control, has a named reviewer, and every rule has a comment stating the group or condition it relies on.

  5. Test the policy against representative users

    Platform engineers write automated tests that run the policy against sample users and group sets, covering the cases that matter most: an owner editing their own component, a user editing another team's component, a user with no groups, and a user in several groups. The tests should run in CI on every change to the policy or to the group mapping. Include at least one test for each permission the policy handles, so a missing rule fails the build. Check: the test suite passes in CI, and a deliberately broken rule causes a failure that names the case it breaks.

  6. Roll out to a staging instance

    The team deploys the same configuration and policy to a staging Backstage with a copy of the identity provider groups, or a representative subset. Testers sign in with accounts from each group and walk through the catalog pages, editing flows and any templates that touch catalog entities. Record every denied action that a real user needs, and decide whether it reflects a missing rule or a group that was never assigned. Check: each tester completes the agreed set of tasks, and every unexpected denial is either fixed in the policy or documented as intended.

  7. Promote the policy to production

    Once staging checks pass, the same versioned configuration and policy are promoted to production through the normal change process, with a rollback plan that restores the previous configuration. Watch the authorization decision logs and sign-in events for the first working period, and confirm with the identity team that group membership is resolving for real users. Check: production users in each group can perform their expected actions, denied requests in the logs match the rules that were meant to deny them, and the rollback has been confirmed to work on a non-production copy.

Resolving group membership at sign-in by identity provider

Source control platforms are often the first identity source teams wire up, and their group model is different from a directory. Group membership in these providers usually means organization teams or group memberships, which are not always returned in the sign-in token by default. Your resolver therefore has to either request the right scopes or query the provider for memberships after authentication, then translate those values into Backstage group entity references.

  • Team and group names: Decide whether policies key on the team slug, the team display name or a numeric ID, and keep that choice consistent across the catalog.
  • Nested structures: Confirm whether nested teams or subgroups flow through to your resolver, since flattening them changes who receives access.
  • Scope requests: Check which OAuth scopes the provider needs in order to return membership data, and document them alongside your configuration.
  • Personal accounts: Users outside any organization will have no team memberships, so define the default they receive.
  • Token refresh: Membership changes made after sign-in only take effect at the next resolution, so note how often users must sign in again.

Confirm each provider's group claim or membership lookup in the official Backstage authentication documentation before writing the resolver.

Security and operational risks to control

Backstage authorization fails quietly when defaults, identity mapping and change control drift apart. The cards below pair each risk with a control you can verify before and after rollout.

Silent allow-all defaults

Until permissions are enabled and a policy is wired in, Backstage does not restrict what signed-in users can read or change, so a portal can look secured while every action is allowed. Confirm in configuration that the permission framework is enabled and that your policy class is the one loaded at startup. Then test with a user who should be denied, not only with an administrator who should be allowed. A portal that loads without errors can still allow everything.

Stale group membership

Permissions that depend on groups are only as current as the group data Backstage holds. When someone changes teams, the old group can keep access until the catalog ingests the change or the next sign-in refreshes it. Decide how group membership is resolved at sign-in, how often the catalog syncs from your directory, and who is accountable when a transfer does not propagate. Test a transfer with a real account before you rely on the policy.

Guest access left enabled

A guest sign-in path lets people reach the portal without an identity that your directory controls, which breaks the link between a permission decision and a named person. The authentication guidance advises against offering guest access in production. Check the sign-in configuration in each environment, and confirm that no development setting was carried into production. Verify that every provider resolves to the same user identity so audit records point to one person.

Unreviewed policy changes

Policy code is access control, so a change that widens permissions should pass the same review as any other change to authorization logic. Store policies in version control, require a second reviewer, and run permission tests in the pipeline before deployment. Ask who can edit the group mapping and the policy file in production, since either change can grant access without touching the policy itself.

Plugins that bypass checks

A third-party or in-house plugin can read catalog data or call backend endpoints without going through the permission checks you wrote for core features. Before installing a plugin, review which backend routes it exposes and whether it calls the permission API. Test each plugin's routes with a denied user, and treat any route that returns data without a check as a blocking defect until it is fixed.

Gaps in audit records

Authorization decisions are only useful as evidence if you can later show who asked for what and what the policy returned. Confirm that your deployment logs sign-in events, denied requests and changes to permission configuration, and that logs are retained and sent to a store your security team can search. Ask your auditors which records they will sample before you decide what to keep.

Testing policies before rollout

What should our test users include before we roll out Backstage permission policies?

Test users should cover every real combination of role and group your organization uses, not just a platform admin and one developer. Include a user from each team that owns catalog entities, a member of each group the policies reference, a user with no group membership, a user who belongs to several groups, and a contractor or guest-style account if one will exist. Resolve each test identity through the same sign-in resolver your production provider uses, so the test reflects how group membership actually arrives at sign-in. Keep the list in version control next to the policy code so reviewers can see which identities were exercised and which were left out.

How do we check that deny cases actually deny?

Write a test for each action you intend to block, and assert the denial explicitly rather than only checking that allowed actions still work. For example, a user outside the owning group should be refused an edit to a catalog entity they do not own, and a user without a read grant should not see a TechDocs page tied to a restricted entity. Deny tests catch the most common failure in this area: a policy that returns allow by default for a case nobody thought about. Also test the boundary, such as a user who holds the right group but a different role, because a rule that checks only one condition often grants more than intended.

How should we test ownership-based rules?

Ownership rules depend on catalog data, so test them with catalog fixtures that include an entity owned by each test team, an entity with no owner, and an entity whose owner reference points at a group that does not exist. Then check that a member of the owning group gets the expected access, a member of another group does not, and orphaned entities fall back to the default you chose. Ownership tests fail quietly when catalog ingestion changes the owner field format, so include at least one test that runs against entities ingested from your real source of truth, not only hand-written YAML. Confirm the exact ownership field and reference format against the Backstage permissions documentation for your release.

How do we review changes to policies before they ship?

Treat policy code like application code: changes go through a pull request, a named security reviewer approves them, and the test suite must pass before merge. Require the author to describe which identities and actions the change affects, and to add or update a deny test for every new allow. Keep a short change log that records why each rule exists and who requested it, because auditors and future maintainers will ask. Where possible, run the new policy in a staging instance with production-like group data for a period before enabling it for everyone, and compare access for a sample of users between the old and new versions.

How do we keep policy tests current through Backstage upgrades?

Pin the policy tests to the same Backstage release line as the rest of the portal, and run them as part of every upgrade branch, since permission API types and plugin permission names can change between releases. Upgrades move all @backstage packages together with the version bump command, and the Backstage Upgrade Helper shows the template changes to review. After each bump, rerun the full identity matrix and confirm that any new plugin permissions added by upgraded or newly installed plugins have an explicit rule, not an implicit default. Schedule a recurring review of the test list whenever groups are renamed or new teams are created in your identity provider.

Can our own team write and test these policies, or do we need a partner?

Your team can write and test policies if it has someone comfortable with TypeScript, the Backstage permissions API, and your identity provider's group model. The work that usually takes longer than expected is mapping which groups and ownership relations your organization really has, agreeing on default deny behavior with security and compliance owners, and building a repeatable test matrix. DeployOpen plans and implements this kind of work as a fixed-scope engagement, with scope, deliverables and timelines agreed in writing before work starts. Ask any provider for a written list of the identities, actions and plugins covered by the tests, and for who maintains the suite after handover.

What does it cost to test permission policies, and what drives the effort?

No supplied figure sets this cost, so the effort depends on your own inputs. The main drivers are the number of groups and roles in your identity provider, how many plugins and entity types need explicit rules, how many ownership relationships exist, and whether tests run in CI against real catalog data or only against fixtures. Test setup is largely one-time work, while the matrix grows as teams and plugins are added and must be maintained through each upgrade. When requesting a quote, ask the provider to break effort into policy design, test authoring, CI integration, staging validation and ongoing maintenance, so you can see what recurs.

Limits to confirm in your environment

Permission policies are only as reliable as the plugins, identity data and release process beneath them. The four checks below cover what each layer can and cannot enforce in your installed version, so you know where policies will hold and where they will not before you roll them out.

Plugin permission support

Not every plugin checks permissions on every endpoint, and coverage differs between built-in and community plugins. For each plugin your teams use, confirm in the installed version which actions are authorized and which routes are still open to any signed-in user. Treat an unchecked route as unprotected until you have tested it with a non-admin account. Record the results in a coverage list you can revisit at each upgrade.

Group data from your identity provider

Policies that target groups need group membership to arrive at sign-in. Confirm that your identity provider sends the group claims or directory data Backstage needs, including nested groups, and that group names are stable identifiers rather than display names. Ask whether membership changes take effect at the next sign-in or only after a token refresh, since that sets how quickly a removed engineer loses access.

Sign-in resolver behavior

The resolver decides which catalog user and group memberships a session carries. If it maps groups incorrectly or falls back to a guest identity, a policy can grant access to the wrong people without any error. Use one identity for each person across providers, and confirm in a test environment that a sample user receives exactly the groups you expect. Keep guest access off for production.

Release cadence and policy drift

Backstage ships a main release line monthly and a next line weekly, so permission APIs and plugin behavior can change between your upgrades. Confirm which release line your team tracks, who reviews release notes for permission changes, and how often you re-run your policy test suite. A policy that passed on one release can behave differently after a bump, so the test suite should run as part of every upgrade.

Catalog ownership data quality

Group-based policies are only as accurate as the owner fields on catalog entities. Review a sample of components and check that each spec.owner points to a real group, that stale or departed owners are flagged, and that systems without an owner are listed rather than left open to everyone. Ask who maintains ownership data and how changes in your directory reach the catalog, because this data often lags behind org changes.

How long does Backstage permission setup take and what does it cost?

Is there a fixed price for setting up Backstage permissions?

DeployOpen does not publish a price list. Each engagement is quoted from a written scope, and most are fixed-scope, so the price follows from the groups, policies, plugins and test coverage agreed before work starts. Backstage itself is open source under the Apache License 2.0 with no paid edition from the project, so the cost is the people and environments needed to do the work, not a license fee for the framework. Ask for the quote to list each component separately so you can see what is one-time and what recurs.

What drives the effort of a Backstage permission project?

The main drivers are the number of groups and roles you need to express, how complex your identity provider setup is, how many policies you must write and maintain, how many plugins need permission rules, and how deeply you test before rollout. Each of these multiplies the others: a large group structure with several plugins and nested team ownership takes far more policy design and test cases than a flat model covering only the catalog. Ask the provider to break the effort down along these five lines.

How does the identity provider affect the cost of permission setup?

A single, well-understood provider with clean group data is the simplest case. Complexity grows when group membership lives in more than one directory, when group names differ between the provider and the catalog, or when sign-in resolvers must map every provider to the same identity. The authentication documentation advises that all providers resolve to the same identity, so this mapping work is real effort. Confirm early which directories hold group membership and who controls them.

Can our own team set up Backstage permissions without a partner?

Yes, a team with Backstage and identity experience can do it in-house. The work is policy design, TypeScript configuration, group resolution at sign-in and test writing, which needs engineers who understand both the portal and your directory. Teams without that combination often find the group mapping and test depth take longer than expected. A partner is most useful when you want the design reviewed, the tests written to a scope you can audit, or capacity to run the rollout alongside your normal work.

What do we need to provide during a permission engagement?

Expect to provide identity administrators who can explain and export group membership, catalog owners who confirm which teams own which entities, and a staging Backstage instance that matches production sign-in. Access to the identity provider's test users and a named decision-maker for policy disputes also shorten the work. Without a staging instance, policies cannot be tested safely before rollout, so ask whether staging is in scope or must be supplied by you.

What recurs after permissions go live?

Policy maintenance recurs. New teams, renamed groups, new plugins and new catalog entity types all require policy changes and test updates. Backstage upgrades also recur: the versioning policy ships a main release monthly and a next release weekly, and high and critical vulnerabilities are backported to releases from the last six months where feasible. Each upgrade can change permission APIs or plugin behavior, so test coverage must be rerun. Ask whether support and upgrade work is included or sold as a separate retainer.

What should we ask for in a fixed-scope quote for Backstage permissions?

Ask for the list of groups and roles in scope, the named plugins and entity types covered by policies, the identity providers and resolvers involved, the number of test cases and the test levels, the staging environment and who provides it, the rollout steps and rollback plan, and the handover documents. Also ask which items are one-time and which recurs, what is excluded, and how changes found during testing are priced. A written scope with these items lets you compare providers on the same basis.

What does a test depth decision cost us?

Test depth is a direct cost lever. Basic tests cover the most common allow and deny decisions for catalog reads and writes. Deeper tests cover group inheritance, ownership edge cases, scaffolder actions and plugin-specific rules, and they need realistic catalog data. Illustrative example: a policy that allows only owners to edit a service needs tests for the owner, a member of a parent group, a user from another team and an unauthenticated caller. Each added case adds effort, so agree the test list in the scope before work begins.

How DeployOpen scopes and delivers Backstage permissions

DeployOpen scopes Backstage permissions as a fixed-scope engagement. Before any code changes, the policy model, the identity mapping and the test plan are agreed in writing, so the written scope states which plugins and permissions are covered, which groups and roles exist in your identity provider, which sign-in resolver maps users to catalog entities, and what the acceptance tests prove. Deliverables and timelines follow from that document, and a quote follows from the same written scope. Ask for the scope to name the permission policy module, the test suites and the environments that must pass before rollout, so disagreements are settled before the build rather than during it.

Delivery happens inside your infrastructure. The Backstage instance, its PostgreSQL databases, the permission policy code and the test harness run in the cloud accounts, data centers or air-gapped network you already operate, and the policy changes move through your own source control and deployment pipeline. Confirm with DeployOpen which access it needs during the build, how credentials are issued and revoked, and who on your side approves changes to the policy file. DeployOpen prepares the evidence of how access was designed and tested, but it does not issue audit reports or certifications; independent auditors and certification bodies make that determination.

Permissions change after launch as teams, groups and plugins change, and Backstage releases move quickly. DeployOpen offers retainers for upgrades, continuing policy review and regression testing against new plugin versions, which suit organizations that want the same team to keep the policy aligned with the identity model. Ask whether a retainer covers reviews of new group structures, changes to the sign-in resolver and re-runs of the permission test suite after each Backstage upgrade. A one-time build and an ongoing retainer carry different cost components, so ask for each to be quoted separately.

Talk to our team.

Tell us what you're working on, whether it's a deployment, an audit, a security test or a cyber range. You'll speak with an engineer who can help you scope it.

  • 30-minute call: free, with no obligation.
  • NDA on request: we can sign before you share details.
  • Clear next steps: a scope and plan after the call.