Step-by-step guide to setting up role-based access control for large organizations.
This guide is part of the At Scale guides because it is designed for organizations managing access across multiple departments, business units, or workspaces.
Advanced role-based access controls are available only for Enterprise tier accounts.
For organizations with multiple departments or business units, the recommended approach is to remove all workspace access from the Everyone team and then create dedicated teams with access scoped to only what each group needs. This guide walks through the process step by step.Throughout this guide and the RBAC documentation, Cost Reporting items refers to the items managed within workspaces, such as Cost Reports, Dashboards, Folders, Saved Filters, Resource Reports, Kubernetes Efficiency Reports, Financial Commitment Reports, Network Flow Reports, and Canvases.
This guide assumes you are familiar with RBAC concepts like organization-level roles, team-level roles, and workspace access. For an overview, see Role-Based Access Control.
By default, the Everyone team gives all users access to everything.After setup, the Everyone team is locked down and each dedicated team only sees what they need.
The following steps walk through a typical setup for a large organization. In this example, senior leaders are Organization Owners (who always have full access to everything), while a Finance team manages their own Cost Reports and an Engineering team can only view engineering cost data.
1
Create your workspaces and assign integrations
Before configuring teams, create a workspace for each group or department that needs its own set of Cost Reporting items. For example, create a Finance workspace and an Engineering workspace. See Workspaces for instructions on creating and managing workspaces.Then, assign provider integrations to each workspace. The integrations assigned to a workspace determine what underlying cost data is available there. For example, assign your AWS and Datadog integrations to the Engineering workspace so the engineering team can track infrastructure and observability costs, and assign your Snowflake integration to the Finance workspace so the finance team can monitor data warehouse spend.
By default, any user who can view a workspace can see all cost data from the integrations assigned to it, including Organization Viewers, who can interactively adjust filters and explore reports without saving. Plan your integration-to-workspace mapping carefully before granting teams access. If groups need to share a workspace but must not see each other’s spend, see Restrict Cost Data with Access Policies below.
2
Lock down the Everyone team
Navigate to Settings > Teams > Everyone and set workspace access to No Access for every workspace. This ensures no user sees anything by default. Access is granted only through designated teams.
After this step, non-Organization Owner users will lose visibility into all Cost Reporting items until you assign them to a team with workspace access. Organization Owners are unaffected and always retain full access.
3
Set user organization-level roles
Assign each user an appropriate organization-level role:
Organization Owner—For administrators and senior leaders who need full visibility and control. Organization Owners always have full access to all workspaces and Cost Reporting items, so they do not need to be placed on any additional team.
Integration Owner—For users who need to manage provider integrations, Virtual Tags, Custom Providers, and Business Metrics but do not need other admin privileges.
Organization Editor—For most day-to-day users who need to create and edit Cost Reporting items.
Organization Viewer—For users who should only have read-only access.
Navigate to Settings > People, hover over a user, click the ellipses (…), then click Edit to set their role. The People page displays each user’s Organization Role in a dedicated column, making it easy to see role assignments at a glance.
4
Create teams
Navigate to Settings > Teams and create a team for each group that needs scoped access. For example:
Finance—Finance team members scoped to the Finance workspace.
Engineering—Engineering team members scoped to the Engineering workspace.
You do not need to create a team for Organization Owners—they already have full access to everything. However, if your leadership group wants their own dedicated workspace (e.g., an Executive workspace for sensitive reports), you can create a team for them and scope it to that workspace.
5
Set team workspace access
For each team, go to the Access tab and set the workspace access level:
Team
Finance Workspace
Engineering Workspace
Finance
Can Edit
No Access
Engineering
No Access
Can View
6
Add members and assign team roles
For each team, go to the Members tab, click Add Members, and assign each member a team-level role:
Team Owner—Can manage the team’s Cost Reporting items and control which teams have access to them.
Team Editor—Can create, edit, and delete items the team has access to.
Team Viewer—Can only view items the team has access to.
For example, a Finance analyst with an Organization Editor role and a Team Editor role on the Finance team will be able to create and edit Cost Reports in the Finance workspace, but will not see anything in the Engineering workspace.A more complex case: your CFO has an Organization Owner role and is also a member of the Finance team. Because Organization Owners always have full access to everything, the CFO can see and edit items in all workspaces, not just the Finance workspace. Their Finance team membership doesn’t restrict them. If you want to limit any user’s visibility to specific workspaces, assign them an Organization Editor role instead and rely on team membership to control their access.
7
Share specific items across teams (optional)
If a specific Cost Reporting item needs to be shared outside of its workspace, use Manage Access on the item itself. For example, say an executive Dashboard lives in the Finance workspace and you want the Engineering team to see it, without granting them access to the entire Finance workspace. Click the ellipses (…) on the dashboard, select Manage Access, and set the Engineering team to Can Access.
The setup above works well when each group can have its own workspace. But large organizations often hit a different problem: several teams need to work in the same workspace, share the same dashboards, and look at the same reports, yet each team must only see its own spend.This is common in financial services, in businesses with compliance-sensitive business units, and anywhere multiple product lines are billed through one cloud account. Splitting them into separate workspaces would mean duplicating your entire reporting setup for every group.Access Policies solve this by filtering the data itself rather than controlling which reports a team can reach. A policy is a set of filter rules that you assign to teams; members of those teams then see only matching data, in every report they open.
Access Policies are generally available to Vantage Enterprise customers with contracted Build Hours. If you are not currently eligible, contact the Vantage sales team at sales@vantage.sh.
Before Access Policies, enforcing a data boundary meant controlling it through report definitions. That forced an awkward trade-off: every restricted user had to be an Organization Viewer, because an Organization Editor could open a report and delete its filters. In practice, that meant a central admin team built and maintained every report for everyone.Access Policies enforce the boundary on the data rather than on how a report was built, so it can’t be edited away. Restricted users can be Organization Editors, build their own reports, and explore freely, and they still only ever see their own scope. For an organization with dozens of teams, this is the difference between a central reporting bottleneck and self-service.
In this example, an investment firm runs several research pods out of a single Research workspace. Each pod must be unable to see any other pod’s cloud spend, but they all share the same dashboards and report templates.
1
Create a team for each group
Following the steps above, create a team per pod—Pod Alpha, Pod Beta, and so on—and give each team Can Edit access to the Research workspace.At this point every pod can see every other pod’s costs. The next step fixes that.
2
Decide what identifies each group's data
Pick the attribute that reliably separates the groups. In most cases this is the account, because each pod’s workloads run in their own linked cloud accounts. Tags work too, if your tagging is consistent.
Build your policies from Provider, Billing Account, Account, or Region using the is comparison whenever you can. These four attributes behave identically across Cost Reports, Active Resources, and Recommendations. Other attributes vary by area: Service does not scope Active Resources, Metadata scopes only Active Resources, and a tag key without a value does not scope Recommendations. See What You Can Filter On.
3
Create one policy per group
Navigate to Settings > Teams > Policies and click Create Policy. For Pod Alpha:
Access Policy Name—Pod Alpha accounts
Teams—Pod Alpha
Access Policy Filters—Account is the list of Pod Alpha’s accounts
Repeat for each pod. Assign each policy to exactly one team so the boundaries stay easy to reason about.
4
Preview before you save
Click Preview on the policy form. Vantage applies that one policy’s draft rules to your own session so you can browse Cost Reports, Active Resources, Recommendations, and dashboards with the proposed boundary.Do this every time. As an Organization Owner you are exempt from Access Policies, so opening a report normally will show you everything and tell you nothing about whether the policy works.Click the X on the amber banner to exit, then click Save Changes.After assigning the policies, open each team’s Access tab and click Preview in the Policies section. This second preview combines every policy assigned to that team. It does not include policies from a person’s other teams, which is why the test-user check in the next step is still important.
5
Verify the boundary with a test user
Sign in as a non-Owner member of one pod, or ask someone on that team to check. Confirm that:
Cost Reports show only that pod’s accounts, even after they change filters and groupings.
The account picker in the filter builder lists only their own accounts.
Recommendations are scoped to their accounts, not the whole organization.
A CSV export contains the same data they see on screen.
6
Automate membership with SSO
Map each pod’s SSO group to its Vantage team using SSO group mapping. Team membership is refreshed every time a user signs in, so Access Policies follow people automatically as they join and leave groups. You assign each policy to its team once and never manage it per user.
Access Policies apply across your whole account rather than per workspace, so a policy follows a person into every workspace they visit. If your organization uses a workspace per customer or per environment, make sure the accounts a policy names exist in every workspace its teams can reach. A policy listing only production accounts will make that team’s reports come back empty in a development workspace.
Forecasts and anomalies stay available for anyone with an Access Policy applied, and both are limited to the data the policy allows. After a policy’s rules or a team’s membership changes, the Forecasts and Anomalies tabs can be empty until Vantage next generates them.
Can Organization Viewers see underlying cost data even if they can't save anything?
Yes. Any user with view access to a workspace can see all cost data from the integrations assigned to that workspace. Organization Viewers can also interactively adjust filters, date ranges, and groupings on Cost Reports to explore the data. These changes are temporary and are not saved. If you have sensitive cost data that should be restricted, assign those integrations only to workspaces that the appropriate teams can access, or restrict the data itself with Access Policies.
I put a user on a second team to restrict them further, but they can see more. Why?
Access Policies are combined so that a person sees data matching any of their teams’ policies. Each team is another pass that adds to what they can see, so adding a team always widens access rather than narrowing it.To tighten what someone sees, either remove them from a team or narrow the policy on the team they’re already on. If a user genuinely needs a combination that no single team represents, create a dedicated policy describing exactly what they should see and put them on one team with that policy.
My policy restricts Cost Reports but the user still sees every recommendation. Why?
Vantage applies one policy across Cost Reports, Active Resources, and Recommendations, but those areas don’t all describe data the same way. Recommendations honor Provider, Billing Account, Account, Region, Service, and tag key-value pairs. The rules Recommendations can’t interpret are a tag key without a value and Untagged, so a policy built only from those won’t narrow this page.Add a rule using one of the supported attributes, then use Preview to confirm each area is scoped. For a reliable boundary, build policies from Provider, Billing Account, Account, or Region. See What You Can Filter On.
How do integrations relate to workspaces and RBAC?
Each provider integration (e.g., an AWS account or Datadog connection) is assigned to one or more workspaces. This determines which cost data appears in each workspace. RBAC controls who can access each workspace, so the combination of integration assignment and team workspace access controls who can see what cost data. For example, if your AWS production integration is only assigned to the Finance workspace, only teams with access to the Finance workspace can see that data.
What happens to existing items when I lock down the Everyone team?
All items remain in their workspaces, nothing is deleted. However, non-Organization Owner users will immediately lose visibility into any item they could previously see through the Everyone team. Make sure you have your teams and workspace access configured before (or immediately after) locking down the Everyone team.
Can a user be on multiple teams?
Yes. A user can belong to as many teams as needed. If a user is on multiple teams that have access to the same item, they receive the highest permission level from any of those teams. See Role Precedence for details.
What if a user needs edit access in one workspace but view-only in another?
Place them on two different teams: one with Can Edit access to the first workspace and another with Can View access to the second. Their permissions are evaluated per workspace, so they can edit in one and only view in the other.
Can I undo the Everyone team lockdown?
Yes. Navigate to Settings > Teams > Everyone, go to the Access tab, and set the workspace access back to Can Edit or Can View. All users will immediately regain access through the Everyone team.
Will Organization Owners be affected by the Everyone team lockdown?
No. Organization Owners always have full access to all workspaces and Cost Reporting items, regardless of team configuration. The lockdown only affects users with Organization Editor, Integration Owner, or Organization Viewer roles.
Do API tokens respect RBAC?
Yes. API service tokens created at the team level inherit that team’s permissions. A token created for the Finance team will only have access to items the Finance team can see.Important: Service tokens used for organization-level actions—such as managing provider integrations or creating teams—must be assigned to the Everyone team. This applies to tokens used by the Kubernetes agent and the Terraform provider. Tokens assigned to other teams will not have the necessary permissions and may encounter authorization errors.
What if I have hundreds of users? Do I need to assign teams manually?
No. You have several options for managing team membership at scale:
{"docsConfig":{"theme":"aspen","$schema":"https://mintlify.com/docs.json","name":"Vantage","description":"Vantage is a cloud cost observability and FinOps platform. These docs cover provider integrations (AWS, Azure, GCP, Kubernetes, Snowflake, OpenAI, and more), Cost Reports, budgets, Autopilot, the Vantage MCP and FinOps Agent, the Vantage API, and the Terraform provider.","colors":{"primary":"#6742D6","light":"#6742D6","dark":"#6742D6"},"logo":{"light":"https://mintcdn.com/vantage-39/dQz82CvBD_D4tRVs/logo/light.svg?fit=max\u0026auto=format\u0026n=dQz82CvBD_D4tRVs\u0026q=85\u0026s=3eb2e2468e61bd6e30b8d750e93a32da","dark":"https://mintcdn.com/vantage-39/dQz82CvBD_D4tRVs/logo/dark.svg?fit=max\u0026auto=format\u0026n=dQz82CvBD_D4tRVs\u0026q=85\u0026s=70e86138443e9c2caf19ae568b3014e3","href":"https://www.vantage.sh"},"favicon":"https://mintcdn.com/vantage-39/l4Z3kvBHoexOLG9i/favicon.png?fit=max\u0026auto=format\u0026n=l4Z3kvBHoexOLG9i\u0026q=85\u0026s=f3fe4536b1b028b15e721f9791986e52","appearance":{"default":"light"},"background":{"decoration":"gradient","color":{"light":"#FDFCFD"}},"navbar":{"links":[{"href":"https://www.vantage.sh/pricing","label":"Pricing"}],"primary":{"type":"button","label":"Sign Up","href":"https://console.vantage.sh/signup"}},"footer":{"socials":{"x":"https://x.com/JoinVantage","linkedin":"https://www.linkedin.com/company/vantage-sh","slack":"https://vantage.sh/slack","github":"https://github.com/vantage-sh","youtube":"https://www.youtube.com/@Vantagesh"},"links":[{"header":"Docs","items":[{"label":"Introduction","href":"https://docs.vantage.sh/"},{"label":"Quickstart","href":"https://docs.vantage.sh/getting_started"},{"label":"Cost Reports","href":"https://docs.vantage.sh/cost_reports"},{"label":"Autopilot","href":"https://docs.vantage.sh/autopilot"},{"label":"Product Changelog","href":"https://docs.vantage.sh/changelog"},{"label":"Vantage University","href":"https://docs.vantage.sh/vantage_university"}]},{"header":"Community","items":[{"label":"Slack","href":"https://vantage.sh/slack"},{"label":"Cloud Cost Handbook","href":"https://handbook.vantage.sh/"},{"label":"EC2Instances.info","href":"https://instances.vantage.sh/"},{"label":"cur.vantage.sh","href":"https://cur.vantage.sh/"},{"label":"focus.vantage.sh","href":"https://focus.vantage.sh/"}]},{"header":"More","items":[{"label":"GitHub","href":"https://github.com/vantage-sh"},{"label":"Vantage Status","href":"https://status.vantage.sh/"}]},{"header":"Company","items":[{"label":"About","href":"https://www.vantage.sh/about"},{"label":"Privacy Policy","href":"https://www.vantage.sh/privacy-policy"},{"label":"Your Privacy Choices","href":"#privacy-choices"},{"label":"Terms of Use","href":"https://www.vantage.sh/website-terms-of-use"},{"label":"Service Agreement","href":"https://www.vantage.sh/service-agreement"},{"label":"Sub-Processors","href":"https://www.vantage.sh/subprocessors"}]}]},"seo":{"metatags":{"canonical":"https://docs.vantage.sh","og:type":"website","og:site_name":"Vantage Documentation"},"indexing":"all"},"fonts":{"heading":{"family":"Sora"}},"integrations":{"gtm":{"tagId":"GTM-TSMQ34V"}},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor"],"display":"header"},"thumbnails":{"background":"https://assets.vantage.sh/docs/social-card.jpg"},"styling":{"latex":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"vantage-39","hasAudioNarration":false,"actualSubdomain":"vantage-39","customDomains":["docs.vantage.sh"],"gitSource":{"type":"github","owner":"vantage-sh","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae4a9a52e4c4b8ea8e586a5","collectionId":"c1b21e28-6f6c-40b4-825c-3ac821c27e56","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae4a9a52e4c4b8ea8e586a5"},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6ae62f36f07e7eef79d4fddf","clientVersion":"0.0.4044","searchFilterCounts":[{"language":"default","tag":"API","count":250},{"language":"default","tag":"API Reference","count":243},{"language":"default","tag":"Product Docs","count":187},{"language":"default","tag":"Terraform Docs","count":67},{"language":"default","tag":"Provider Integrations","count":50},{"language":"default","tag":"AI, Terraform, \u0026 Developer Tools","count":25},{"language":"default","tag":"Integrations","count":21},{"language":"default","tag":"Account \u0026 Security","count":16},{"language":"default","tag":"Cloud","count":14},{"language":"default","tag":"Data \u0026 Infrastructure","count":14}],"searchSettings":{"showContentSnippets":true}},"assistantConfig":{"deflection":{"enabled":true,"email":"support@vantage.sh"}},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":true},"customCss":[{"filePath":"style.css","content":".dark .provider-card{background-color:rgb(var(--background-dark))}.provider-card p{margin:0}.assistant-action-button{display:inline-flex;align-items:center;gap:8px;padding:10px 20px;background-color:light-dark(#fff,#171420);color:light-dark(#6742d6,#b8a8ff);border:1.5px solid light-dark(#6742d6,#b8a8ff);border-radius:8px;font-weight:600;font-size:.9rem;text-decoration:none;transition:background-color .2s ease,border-color .2s ease}.slack-mock-frame{margin:1rem 0;border:1px solid light-dark(#e0e0e0,#404040);border-radius:8px;overflow:visible;max-width:100%}.slack-message-mock{padding:16px;border-radius:7px;font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,\"Helvetica Neue\",Arial,sans-serif;font-size:15px;line-height:1.46668;color:#1d1c1d}.dark .slack-message-mock,.dark .slack-message-mock .slack-message-mock-detail-label,.dark .slack-message-mock .slack-message-mock-detail-value,.dark .slack-message-mock .slack-message-mock-subtitle,.dark .slack-message-mock .slack-message-mock-title,.dark .slack-message-mock p,.dark .slack-message-mock strong{color:#1d1c1d}.dark .slack-message-mock .slack-message-mock-meta{color:#616061}.dark .slack-message-mock,.slack-message-mock{background-color:#fff}.dark .slack-message-mock-button{background-color:#2eb886;color:#fff}.dark .slack-message-mock-button-secondary{background-color:#fff;color:#1d1c1d;border-color:#d0d0d0}.slack-message-mock-subtitle,.slack-message-mock-title{font-size:18px;font-weight:900;margin-bottom:4px}.slack-message-mock-subtitle{margin-bottom:12px}.slack-message-mock-meta{font-size:12px;color:#616061;margin-bottom:8px}.slack-message-mock-divider{border:0;border-top:1px solid #e0e0e0;margin:12px 0}.slack-message-mock-detail-label{font-weight:700;font-size:14px}.slack-message-mock-detail-value{font-size:14px}.slack-message-mock-details{display:flex;gap:48px;margin-bottom:16px;flex-wrap:wrap}.slack-message-mock-body{margin:0 0 .75rem}.slack-message-mock-body:last-of-type{margin-bottom:0}.slack-message-mock-buttons{display:flex;gap:8px;flex-wrap:nowrap;margin-top:12px}.slack-message-mock-button{background-color:#2eb886;color:#fff;border:0;border-radius:4px;padding:8px 10px;font-size:12px;font-weight:700;cursor:default;white-space:nowrap;flex:1 1 0;min-width:0;text-align:center}.slack-message-mock-button-secondary{background-color:#fff;color:#1d1c1d;border:1px solid #d0d0d0}"}],"page":{"pagePath":"guides/rbac_setup","slug":"/guides/rbac_setup","pageMetadata":{"title":"RBAC Setup Guide","description":"Step-by-step guide to setting up role-based access control for large organizations.","href":"/guides/rbac_setup"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Step-by-step guide to setting up role-based access control for large organizations.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,em:`em`,li:`li`,p:`p`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{Accordion,AccordionGroup,Heading,Info,Mermaid,Note,Step,Steps,Table,Tip,Warning}=_components;if(!Accordion)_missingMdxReference(`Accordion`,true);if(!AccordionGroup)_missingMdxReference(`AccordionGroup`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Info)_missingMdxReference(`Info`,true);if(!Mermaid)_missingMdxReference(`Mermaid`,true);if(!Note)_missingMdxReference(`Note`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tip)_missingMdxReference(`Tip`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(Info,{children:_jsx(_components.p,{children:`This guide is part of the At Scale guides because it is designed for organizations managing access across multiple departments, business units, or workspaces.`})}),`\n`,_jsx(Info,{children:_jsx(_components.p,{children:`Advanced role-based access controls are available only for Enterprise tier accounts.`})}),`\n`,_jsxs(_components.p,{children:[`For organizations with multiple departments or business units, the recommended approach is to `,_jsx(_components.strong,{children:`remove all workspace access from the Everyone team`}),` and then create dedicated teams with access scoped to only what each group needs. This guide walks through the process step by step.`]}),`\n`,_jsxs(_components.p,{children:[`Throughout this guide and the `,_jsx(_components.a,{href:`/rbac`,children:`RBAC documentation`}),`, `,_jsx(_components.em,{children:`Cost Reporting items`}),` refers to the items managed within workspaces, such as Cost Reports, Dashboards, Folders, Saved Filters, Resource Reports, Kubernetes Efficiency Reports, Financial Commitment Reports, Network Flow Reports, and Canvases.`]}),`\n`,_jsx(Info,{children:_jsxs(_components.p,{children:[`This guide assumes you are familiar with RBAC concepts like organization-level roles, team-level roles, and workspace access. For an overview, see `,_jsx(_components.a,{href:`/rbac`,children:`Role-Based Access Control`}),`.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`before-and-after`,children:`Before and After`}),`\n`,_jsx(_components.p,{children:`By default, the Everyone team gives all users access to everything.`}),`\n`,_jsx(Mermaid,{chart:`flowchart LR\n U1[All Users] --> E1[Everyone Team] -->|Can Edit| WA[All Workspaces]\n\n style U1 fill:#fff,stroke:#999\n style E1 fill:#fff,stroke:#999\n style WA fill:#f5f5f5,stroke:#6742D6`}),`\n`,_jsx(_components.p,{children:`After setup, the Everyone team is locked down and each dedicated team only sees what they need.`}),`\n`,_jsx(Mermaid,{chart:`flowchart TD\n FT[Finance Team] -->|Can Edit| FW[Finance Workspace]\n O[Org Owners] -.->|Full Access| FW\n O -.->|Full Access| EW[Engineering Workspace]\n ET[Engineering Team] -->|Can View| EW\n E2[Everyone Team] -.-x|No Access| WB[All Workspaces]\n\n style E2 fill:#fff,stroke:#cc0000\n style WB fill:#f5f5f5,stroke:#cc0000\n style FW fill:#f5f5f5,stroke:#6742D6\n style EW fill:#f5f5f5,stroke:#6742D6\n style FT fill:#fff,stroke:#6742D6\n style ET fill:#fff,stroke:#6742D6\n style O fill:#6742D6,color:#fff`}),`\n`,_jsx(Heading,{level:`2`,id:`walkthrough`,children:`Walkthrough`}),`\n`,_jsx(_components.p,{children:`The following steps walk through a typical setup for a large organization. In this example, senior leaders are Organization Owners (who always have full access to everything), while a Finance team manages their own Cost Reports and an Engineering team can only view engineering cost data.`}),`\n`,_jsxs(Steps,{children:[_jsxs(Step,{title:`Create your workspaces and assign integrations`,children:[_jsxs(_components.p,{children:[`Before configuring teams, create a workspace for each group or department that needs its own set of Cost Reporting items. For example, create a `,_jsx(_components.strong,{children:`Finance`}),` workspace and an `,_jsx(_components.strong,{children:`Engineering`}),` workspace. See `,_jsx(_components.a,{href:`/workspaces`,children:`Workspaces`}),` for instructions on creating and managing workspaces.`]}),_jsxs(_components.p,{children:[`Then, `,_jsx(_components.a,{href:`/workspaces#manage-workspace-provider-integrations`,children:`assign provider integrations to each workspace`}),`. The integrations assigned to a workspace determine what underlying cost data is available there. For example, assign your AWS and Datadog integrations to the Engineering workspace so the engineering team can track infrastructure and observability costs, and assign your Snowflake integration to the Finance workspace so the finance team can monitor data warehouse spend.`]}),_jsx(Warning,{children:_jsxs(_components.p,{children:[`By default, any user who can view a workspace can see all cost data from the integrations assigned to it, including Organization Viewers, who can interactively adjust filters and explore reports without saving. Plan your integration-to-workspace mapping carefully before granting teams access. If groups need to share a workspace but must not see each other’s spend, see `,_jsx(_components.a,{href:`#restrict-cost-data-with-access-policies`,children:`Restrict Cost Data with Access Policies`}),` below.`]})})]}),_jsxs(Step,{title:`Lock down the Everyone team`,children:[_jsxs(_components.p,{children:[`Navigate to `,_jsx(_components.strong,{children:`Settings > Teams > Everyone`}),` and set workspace access to `,_jsx(_components.strong,{children:`No Access`}),` for every workspace. This ensures no user sees anything by default. Access is granted only through designated teams.`]}),_jsx(Warning,{children:_jsx(_components.p,{children:`After this step, non-Organization Owner users will lose visibility into all Cost Reporting items until you assign them to a team with workspace access. Organization Owners are unaffected and always retain full access.`})})]}),_jsxs(Step,{title:`Set user organization-level roles`,children:[_jsx(_components.p,{children:`Assign each user an appropriate organization-level role:`}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Organization Owner`}),`—For administrators and senior leaders who need full visibility and control. Organization Owners always have full access to all workspaces and Cost Reporting items, so they do not need to be placed on any additional team.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Integration Owner`}),`—For users who need to manage provider integrations, Virtual Tags, Custom Providers, and Business Metrics but do not need other admin privileges.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Organization Editor`}),`—For most day-to-day users who need to create and edit Cost Reporting items.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Organization Viewer`}),`—For users who should only have read-only access.`]}),`\n`]}),_jsxs(_components.p,{children:[`Navigate to `,_jsx(_components.strong,{children:`Settings > People`}),`, hover over a user, click the ellipses (`,_jsx(_components.strong,{children:`…`}),`), then click `,_jsx(_components.strong,{children:`Edit`}),` to set their role. The People page displays each user’s `,_jsx(_components.strong,{children:`Organization Role`}),` in a dedicated column, making it easy to see role assignments at a glance.`]})]}),_jsxs(Step,{title:`Create teams`,children:[_jsxs(_components.p,{children:[`Navigate to `,_jsx(_components.strong,{children:`Settings > Teams`}),` and create a team for each group that needs scoped access. For example:`]}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Finance`}),`—Finance team members scoped to the Finance workspace.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Engineering`}),`—Engineering team members scoped to the Engineering workspace.`]}),`\n`]}),_jsx(_components.p,{children:`You do not need to create a team for Organization Owners—they already have full access to everything. However, if your leadership group wants their own dedicated workspace (e.g., an Executive workspace for sensitive reports), you can create a team for them and scope it to that workspace.`})]}),_jsxs(Step,{title:`Set team workspace access`,children:[_jsxs(_components.p,{children:[`For each team, go to the `,_jsx(_components.strong,{children:`Access`}),` tab and set the workspace access level:`]}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Team`}),_jsx(_components.th,{children:`Finance Workspace`}),_jsx(_components.th,{children:`Engineering Workspace`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Finance`}),_jsx(_components.td,{children:`Can Edit`}),_jsx(_components.td,{children:`No Access`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Engineering`}),_jsx(_components.td,{children:`No Access`}),_jsx(_components.td,{children:`Can View`})]})]})]})]}),_jsxs(Step,{title:`Add members and assign team roles`,children:[_jsxs(_components.p,{children:[`For each team, go to the `,_jsx(_components.strong,{children:`Members`}),` tab, click `,_jsx(_components.strong,{children:`Add Members`}),`, and assign each member a team-level role:`]}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Team Owner`}),`—Can manage the team’s Cost Reporting items and control which teams have access to them.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Team Editor`}),`—Can create, edit, and delete items the team has access to.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Team Viewer`}),`—Can only view items the team has access to.`]}),`\n`]}),_jsxs(_components.p,{children:[`For example, a Finance analyst with an `,_jsx(_components.strong,{children:`Organization Editor`}),` role and a `,_jsx(_components.strong,{children:`Team Editor`}),` role on the Finance team will be able to create and edit Cost Reports in the Finance workspace, but will not see anything in the Engineering workspace.`]}),_jsxs(_components.p,{children:[`A more complex case: your CFO has an `,_jsx(_components.strong,{children:`Organization Owner`}),` role and is also a member of the Finance team. Because Organization Owners always have full access to everything, the CFO can see and edit items in `,_jsx(_components.em,{children:`all`}),` workspaces, not just the Finance workspace. Their Finance team membership doesn’t restrict them. If you want to limit any user’s visibility to specific workspaces, assign them an `,_jsx(_components.strong,{children:`Organization Editor`}),` role instead and rely on team membership to control their access.`]})]}),_jsx(Step,{title:`Share specific items across teams (optional)`,children:_jsxs(_components.p,{children:[`If a specific Cost Reporting item needs to be shared outside of its workspace, use `,_jsx(_components.strong,{children:`Manage Access`}),` on the item itself. For example, say an executive Dashboard lives in the Finance workspace and you want the Engineering team to see it, without granting them access to the entire Finance workspace. Click the ellipses (`,_jsx(_components.strong,{children:`…`}),`) on the dashboard, select `,_jsx(_components.strong,{children:`Manage Access`}),`, and set the Engineering team to `,_jsx(_components.strong,{children:`Can Access`}),`.`]})})]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`For organizations using SSO, you can `,_jsx(_components.a,{href:`/sso#set-up-sso-group-mapping-for-teams`,children:`map SSO groups to Vantage teams`}),` to automate team assignment when users log in. You can also manage teams programmatically via the `,_jsx(_components.a,{href:`https://docs.vantage.sh/api/teams/add-team-member`,children:`Vantage API`}),` or the `,_jsx(_components.a,{href:`https://registry.terraform.io/providers/vantage-sh/vantage/latest/docs/resources/team`,children:`Vantage Terraform provider`}),`.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`restrict-cost-data-with-access-policies`,children:`Restrict Cost Data with Access Policies`}),`\n`,_jsxs(_components.p,{children:[`The setup above works well when each group can have its own workspace. But large organizations often hit a different problem: several teams need to work in the `,_jsx(_components.strong,{children:`same`}),` workspace, share the same dashboards, and look at the same reports, yet each team must only see its own spend.`]}),`\n`,_jsx(_components.p,{children:`This is common in financial services, in businesses with compliance-sensitive business units, and anywhere multiple product lines are billed through one cloud account. Splitting them into separate workspaces would mean duplicating your entire reporting setup for every group.`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.a,{href:`/access_policies`,children:`Access Policies`}),` solve this by filtering the data itself rather than controlling which reports a team can reach. A policy is a set of filter rules that you assign to teams; members of those teams then see only matching data, in every report they open.`]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`Access Policies are generally available to Vantage Enterprise customers with contracted Build Hours. If you are not currently eligible, contact the Vantage sales team at `,_jsx(_components.a,{href:`mailto:sales@vantage.sh`,children:`sales@vantage.sh`}),`.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`why-this-matters-at-scale`,children:`Why This Matters at Scale`}),`\n`,_jsxs(_components.p,{children:[`Before Access Policies, enforcing a data boundary meant controlling it through report definitions. That forced an awkward trade-off: every restricted user had to be an `,_jsx(_components.strong,{children:`Organization Viewer`}),`, because an Organization Editor could open a report and delete its filters. In practice, that meant a central admin team built and maintained every report for everyone.`]}),`\n`,_jsxs(_components.p,{children:[`Access Policies enforce the boundary on the data rather than on how a report was built, so it can’t be edited away. Restricted users can be `,_jsx(_components.strong,{children:`Organization Editors`}),`, build their own reports, and explore freely, and they still only ever see their own scope. For an organization with dozens of teams, this is the difference between a central reporting bottleneck and self-service.`]}),`\n`,_jsx(Heading,{level:`3`,id:`walkthrough-2`,children:`Walkthrough`}),`\n`,_jsxs(_components.p,{children:[`In this example, an investment firm runs several research pods out of a single `,_jsx(_components.strong,{children:`Research`}),` workspace. Each pod must be unable to see any other pod’s cloud spend, but they all share the same dashboards and report templates.`]}),`\n`,_jsxs(Steps,{children:[_jsxs(Step,{title:`Create a team for each group`,children:[_jsxs(_components.p,{children:[`Following the steps above, create a team per pod—`,_jsx(_components.strong,{children:`Pod Alpha`}),`, `,_jsx(_components.strong,{children:`Pod Beta`}),`, and so on—and give each team `,_jsx(_components.strong,{children:`Can Edit`}),` access to the Research workspace.`]}),_jsx(_components.p,{children:`At this point every pod can see every other pod’s costs. The next step fixes that.`})]}),_jsxs(Step,{title:`Decide what identifies each group's data`,children:[_jsxs(_components.p,{children:[`Pick the attribute that reliably separates the groups. In most cases this is the `,_jsx(_components.strong,{children:`account`}),`, because each pod’s workloads run in their own linked cloud accounts. Tags work too, if your tagging is consistent.`]}),_jsx(Warning,{children:_jsxs(_components.p,{children:[`Build your policies from `,_jsx(_components.strong,{children:`Provider`}),`, `,_jsx(_components.strong,{children:`Billing Account`}),`, `,_jsx(_components.strong,{children:`Account`}),`, or `,_jsx(_components.strong,{children:`Region`}),` using the `,_jsx(_components.em,{children:`is`}),` comparison whenever you can. These four attributes behave identically across Cost Reports, Active Resources, and Recommendations. Other attributes vary by area: `,_jsx(_components.strong,{children:`Service`}),` does not scope Active Resources, `,_jsx(_components.strong,{children:`Metadata`}),` scopes only Active Resources, and a `,_jsx(_components.strong,{children:`tag key without a value`}),` does not scope Recommendations. See `,_jsx(_components.a,{href:`/access_policies#what-you-can-filter-on`,children:`What You Can Filter On`}),`.`]})})]}),_jsxs(Step,{title:`Create one policy per group`,children:[_jsxs(_components.p,{children:[`Navigate to `,_jsx(_components.strong,{children:`Settings > Teams > Policies`}),` and click `,_jsx(_components.strong,{children:`Create Policy`}),`. For Pod Alpha:`]}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Access Policy Name`}),`—Pod Alpha accounts`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Teams`}),`—Pod Alpha`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Access Policy Filters`}),`—`,_jsx(_components.em,{children:`Account is`}),` the list of Pod Alpha’s accounts`]}),`\n`]}),_jsx(_components.p,{children:`Repeat for each pod. Assign each policy to exactly one team so the boundaries stay easy to reason about.`})]}),_jsxs(Step,{title:`Preview before you save`,children:[_jsxs(_components.p,{children:[`Click `,_jsx(_components.strong,{children:`Preview`}),` on the policy form. Vantage applies that one policy’s draft rules to your own session so you can browse Cost Reports, Active Resources, Recommendations, and dashboards with the proposed boundary.`]}),_jsx(_components.p,{children:`Do this every time. As an Organization Owner you are exempt from Access Policies, so opening a report normally will show you everything and tell you nothing about whether the policy works.`}),_jsxs(_components.p,{children:[`Click the `,_jsx(_components.strong,{children:`X`}),` on the amber banner to exit, then click `,_jsx(_components.strong,{children:`Save Changes`}),`.`]}),_jsxs(_components.p,{children:[`After assigning the policies, open each team’s `,_jsx(_components.strong,{children:`Access`}),` tab and click `,_jsx(_components.strong,{children:`Preview`}),` in the `,_jsx(_components.strong,{children:`Policies`}),` section. This second preview combines every policy assigned to that team. It does not include policies from a person’s other teams, which is why the test-user check in the next step is still important.`]})]}),_jsxs(Step,{title:`Verify the boundary with a test user`,children:[_jsx(_components.p,{children:`Sign in as a non-Owner member of one pod, or ask someone on that team to check. Confirm that:`}),_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Cost Reports show only that pod’s accounts, even after they change filters and groupings.`}),`\n`,_jsx(_components.li,{children:`The account picker in the filter builder lists only their own accounts.`}),`\n`,_jsx(_components.li,{children:`Recommendations are scoped to their accounts, not the whole organization.`}),`\n`,_jsx(_components.li,{children:`A CSV export contains the same data they see on screen.`}),`\n`]})]}),_jsx(Step,{title:`Automate membership with SSO`,children:_jsxs(_components.p,{children:[`Map each pod’s SSO group to its Vantage team using `,_jsx(_components.a,{href:`/sso#set-up-sso-group-mapping-for-teams`,children:`SSO group mapping`}),`. Team membership is refreshed every time a user signs in, so Access Policies follow people automatically as they join and leave groups. You assign each policy to its team once and never manage it per user.`]})})]}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`Access Policies apply across your whole account rather than per workspace, so a policy follows a person into every workspace they visit. If your organization uses a workspace per customer or per environment, make sure the accounts a policy names exist in every workspace its teams can reach. A policy listing only production accounts will make that team’s reports come back empty in a development workspace.`})}),`\n`,_jsx(Info,{children:_jsxs(_components.p,{children:[`Forecasts and anomalies stay available for anyone with an Access Policy applied, and both are limited to the data the policy allows. After a policy’s rules or a team’s membership changes, the `,_jsx(_components.strong,{children:`Forecasts`}),` and `,_jsx(_components.strong,{children:`Anomalies`}),` tabs can be empty until Vantage next generates them.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`frequently-asked-questions`,children:`Frequently Asked Questions`}),`\n`,_jsxs(AccordionGroup,{children:[_jsx(Accordion,{title:`Can Organization Viewers see underlying cost data even if they can't save anything?`,id:`can-organization-viewers-see-underlying-cost-data-even-if-they-cant-save-anything`,children:_jsxs(_components.p,{children:[`Yes. Any user with view access to a workspace can see all cost data from the `,_jsx(_components.a,{href:`/workspaces#manage-workspace-provider-integrations`,children:`integrations assigned to that workspace`}),`. Organization Viewers can also interactively adjust filters, date ranges, and groupings on Cost Reports to explore the data. These changes are temporary and are not saved. If you have sensitive cost data that should be restricted, assign those integrations only to workspaces that the appropriate teams can access, or restrict the data itself with `,_jsx(_components.a,{href:`/access_policies`,children:`Access Policies`}),`.`]})}),_jsxs(Accordion,{title:`I put a user on a second team to restrict them further, but they can see more. Why?`,id:`i-put-a-user-on-a-second-team-to-restrict-them-further-but-they-can-see-more-why`,children:[_jsxs(_components.p,{children:[`Access Policies are combined so that a person sees data matching `,_jsx(_components.strong,{children:`any`}),` of their teams’ policies. Each team is another pass that adds to what they can see, so adding a team always widens access rather than narrowing it.`]}),_jsx(_components.p,{children:`To tighten what someone sees, either remove them from a team or narrow the policy on the team they’re already on. If a user genuinely needs a combination that no single team represents, create a dedicated policy describing exactly what they should see and put them on one team with that policy.`})]}),_jsxs(Accordion,{title:`My policy restricts Cost Reports but the user still sees every recommendation. Why?`,id:`my-policy-restricts-cost-reports-but-the-user-still-sees-every-recommendation-why`,children:[_jsxs(_components.p,{children:[`Vantage applies one policy across Cost Reports, Active Resources, and Recommendations, but those areas don’t all describe data the same way. Recommendations honor `,_jsx(_components.strong,{children:`Provider`}),`, `,_jsx(_components.strong,{children:`Billing Account`}),`, `,_jsx(_components.strong,{children:`Account`}),`, `,_jsx(_components.strong,{children:`Region`}),`, `,_jsx(_components.strong,{children:`Service`}),`, and tag key-value pairs. The rules Recommendations can’t interpret are a `,_jsx(_components.strong,{children:`tag key without a value`}),` and `,_jsx(_components.strong,{children:`Untagged`}),`, so a policy built only from those won’t narrow this page.`]}),_jsxs(_components.p,{children:[`Add a rule using one of the supported attributes, then use `,_jsx(_components.a,{href:`/access_policies#preview-a-policy`,children:`Preview`}),` to confirm each area is scoped. For a reliable boundary, build policies from Provider, Billing Account, Account, or Region. See `,_jsx(_components.a,{href:`/access_policies#what-you-can-filter-on`,children:`What You Can Filter On`}),`.`]})]}),_jsx(Accordion,{title:`How do integrations relate to workspaces and RBAC?`,id:`how-do-integrations-relate-to-workspaces-and-rbac`,children:_jsxs(_components.p,{children:[`Each provider integration (e.g., an AWS account or Datadog connection) is `,_jsx(_components.a,{href:`/workspaces#manage-workspace-provider-integrations`,children:`assigned to one or more workspaces`}),`. This determines which cost data appears in each workspace. RBAC controls who can access each workspace, so the combination of integration assignment and team workspace access controls who can see what cost data. For example, if your AWS production integration is only assigned to the Finance workspace, only teams with access to the Finance workspace can see that data.`]})}),_jsx(Accordion,{title:`What happens to existing items when I lock down the Everyone team?`,id:`what-happens-to-existing-items-when-i-lock-down-the-everyone-team`,children:_jsx(_components.p,{children:`All items remain in their workspaces, nothing is deleted. However, non-Organization Owner users will immediately lose visibility into any item they could previously see through the Everyone team. Make sure you have your teams and workspace access configured before (or immediately after) locking down the Everyone team.`})}),_jsx(Accordion,{title:`Can a user be on multiple teams?`,id:`can-a-user-be-on-multiple-teams`,children:_jsxs(_components.p,{children:[`Yes. A user can belong to as many teams as needed. If a user is on multiple teams that have access to the same item, they receive the `,_jsx(_components.strong,{children:`highest`}),` permission level from any of those teams. See `,_jsx(_components.a,{href:`/rbac#role-precedence`,children:`Role Precedence`}),` for details.`]})}),_jsx(Accordion,{title:`What if a user needs edit access in one workspace but view-only in another?`,id:`what-if-a-user-needs-edit-access-in-one-workspace-but-view-only-in-another`,children:_jsxs(_components.p,{children:[`Place them on two different teams: one with `,_jsx(_components.strong,{children:`Can Edit`}),` access to the first workspace and another with `,_jsx(_components.strong,{children:`Can View`}),` access to the second. Their permissions are evaluated per workspace, so they can edit in one and only view in the other.`]})}),_jsx(Accordion,{title:`Can I undo the Everyone team lockdown?`,id:`can-i-undo-the-everyone-team-lockdown`,children:_jsxs(_components.p,{children:[`Yes. Navigate to `,_jsx(_components.strong,{children:`Settings > Teams > Everyone`}),`, go to the `,_jsx(_components.strong,{children:`Access`}),` tab, and set the workspace access back to `,_jsx(_components.strong,{children:`Can Edit`}),` or `,_jsx(_components.strong,{children:`Can View`}),`. All users will immediately regain access through the Everyone team.`]})}),_jsx(Accordion,{title:`Will Organization Owners be affected by the Everyone team lockdown?`,id:`will-organization-owners-be-affected-by-the-everyone-team-lockdown`,children:_jsx(_components.p,{children:`No. Organization Owners always have full access to all workspaces and Cost Reporting items, regardless of team configuration. The lockdown only affects users with Organization Editor, Integration Owner, or Organization Viewer roles.`})}),_jsxs(Accordion,{title:`Do API tokens respect RBAC?`,id:`do-api-tokens-respect-rbac`,children:[_jsxs(_components.p,{children:[`Yes. `,_jsx(_components.a,{href:`/api/authentication#create-a-vantage-api-service-token`,children:`API service tokens`}),` created at the team level inherit that team’s permissions. A token created for the Finance team will only have access to items the Finance team can see.`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Important:`}),` Service tokens used for organization-level actions—such as managing provider integrations or creating teams—must be assigned to the `,_jsx(_components.strong,{children:`Everyone`}),` team. This applies to tokens used by the `,_jsx(_components.a,{href:`/kubernetes_agent`,children:`Kubernetes agent`}),` and the `,_jsx(_components.a,{href:`/terraform`,children:`Terraform provider`}),`. Tokens assigned to other teams will not have the necessary permissions and may encounter authorization errors.`]})]}),_jsxs(Accordion,{title:`What if I have hundreds of users? Do I need to assign teams manually?`,id:`what-if-i-have-hundreds-of-users-do-i-need-to-assign-teams-manually`,children:[_jsx(_components.p,{children:`No. You have several options for managing team membership at scale:`}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`SSO group mapping`}),`—`,_jsx(_components.a,{href:`/sso#set-up-sso-group-mapping-for-teams`,children:`Map SSO groups to Vantage teams`}),` so users are automatically assigned to the correct team when they log in.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`API`}),`—Use the `,_jsx(_components.a,{href:`https://docs.vantage.sh/api/teams/add-team-member`,children:`Vantage API`}),` to programmatically add members to teams.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Terraform`}),`—Use the `,_jsx(_components.a,{href:`https://registry.terraform.io/providers/vantage-sh/vantage/latest/docs/resources/team`,children:`Vantage Terraform provider`}),` to manage teams and membership as code.`]}),`\n`]})]})]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"RBAC Setup Guide","description":"Step-by-step guide to setting up role-based access control for large organizations.","href":"/guides/rbac_setup"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Before and After","slug":"before-and-after","depth":2,"children":[]},{"title":"Walkthrough","slug":"walkthrough","depth":2,"children":[]},{"title":"Restrict Cost Data with Access Policies","slug":"restrict-cost-data-with-access-policies","depth":2,"children":[{"title":"Why This Matters at Scale","slug":"why-this-matters-at-scale","depth":3,"children":[]},{"title":"Walkthrough","slug":"walkthrough-2","depth":3,"children":[]}]},{"title":"Frequently Asked Questions","slug":"frequently-asked-questions","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/vantage-39/6359ee1fc91f9229/privacy-choices.js"],"subdomain":"vantage-39","siteName":"Vantage","title":"RBAC Setup Guide - Vantage","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-22T14:20:12.582Z","originalFileLocation":"guides/rbac_setup.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"light\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Step-by-step guide to setting up role-based access control for large organizations.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Vantage\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/vantage-39/PifStyg__QCrZYe3/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/vantage-39/PifStyg__QCrZYe3/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/vantage-39/PifStyg__QCrZYe3/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/vantage-39/PifStyg__QCrZYe3/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/vantage-39/PifStyg__QCrZYe3/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/vantage-39/PifStyg__QCrZYe3/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/vantage-39/PifStyg__QCrZYe3/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/vantage-39/PifStyg__QCrZYe3/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/vantage-39/PifStyg__QCrZYe3/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"RBAC Setup Guide - Vantage\">\u003cmeta data-mint-head property=\"og:description\" content=\"Step-by-step guide to setting up role-based access control for large organizations.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Vantage Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.vantage.sh/guides/rbac_setup\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://vantage-39.mintlify.app/_mintlify/api/og/v2?division=At+Scale\u0026amp;title=RBAC+Setup+Guide\u0026amp;description=Step-by-step+guide+to+setting+up+role-based+access+control+for+large+organizations.\u0026amp;theme=3bb7eb86e412317f1e1ae2ab\u0026amp;signature=68a554219570b56a2fbfe593de8412a8ad918f8b8fadaaabd3e86c2beb062995\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"RBAC Setup Guide - Vantage\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Step-by-step guide to setting up role-based access control for large organizations.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://vantage-39.mintlify.app/_mintlify/api/og/v2?division=At+Scale\u0026amp;title=RBAC+Setup+Guide\u0026amp;description=Step-by-step+guide+to+setting+up+role-based+access+control+for+large+organizations.\u0026amp;theme=3bb7eb86e412317f1e1ae2ab\u0026amp;signature=68a554219570b56a2fbfe593de8412a8ad918f8b8fadaaabd3e86c2beb062995\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/vantage-39/PifStyg__QCrZYe3/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Vantage\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#6742D6\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.vantage.sh/guides/rbac_setup\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/guides/rbac_setup.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.vantage.sh/#organization\",\"name\":\"Vantage\",\"url\":\"https://docs.vantage.sh\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/vantage-39/dQz82CvBD_D4tRVs/logo/light.svg?fit=max\u0026auto=format\u0026n=dQz82CvBD_D4tRVs\u0026q=85\u0026s=3eb2e2468e61bd6e30b8d750e93a32da\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.vantage.sh#website\",\"name\":\"Vantage\",\"url\":\"https://docs.vantage.sh\",\"publisher\":{\"@id\":\"https://docs.vantage.sh/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.vantage.sh/guides/rbac_setup#webpage\",\"url\":\"https://docs.vantage.sh/guides/rbac_setup\",\"name\":\"RBAC Setup Guide\",\"description\":\"Step-by-step guide to setting up role-based access control for large organizations.\",\"dateModified\":\"2026-10-22T14:20:12.582Z\",\"isPartOf\":{\"@id\":\"https://docs.vantage.sh#website\"},\"breadcrumb\":{\"@id\":\"https://docs.vantage.sh/guides/rbac_setup#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.vantage.sh/guides/rbac_setup#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Vantage\",\"item\":\"https://docs.vantage.sh\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"RBAC Setup Guide\",\"item\":\"https://docs.vantage.sh/guides/rbac_setup\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.vantage.sh/guides/rbac_setup#article\",\"headline\":\"RBAC Setup Guide\",\"name\":\"RBAC Setup Guide\",\"description\":\"Step-by-step guide to setting up role-based access control for large organizations.\",\"url\":\"https://docs.vantage.sh/guides/rbac_setup\",\"mainEntityOfPage\":{\"@id\":\"https://docs.vantage.sh/guides/rbac_setup#webpage\"},\"dateModified\":\"2026-10-22T14:20:12.582Z\",\"publisher\":{\"@id\":\"https://docs.vantage.sh/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.vantage.sh#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Vantage\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Vantage","nav":{"global":null,"tabs":[{"tab":"Product Docs","pages":[{"title":"Product Docs","href":""}]},{"tab":"Guides","groups":[{"group":"Overview","icon":"book-open","pages":[{"title":"Guides","href":"/guides"}]},{"group":"Getting Started","icon":"flag-checkered","pages":[{"title":"30-Day Getting Started Playbook","href":"/guides/getting_started_playbook"}]},{"group":"FinOps Practice","icon":"chart-pie","pages":[{"title":"Chargeback and Showback","description":"Build a practical showback or chargeback model in Vantage with Virtual Tags, Cost Reports, Saved Filters, Budgets, and scheduled distribution.","href":"/guides/chargeback_showback"}]},{"group":"At Scale","icon":"gauge-high","pages":[{"title":"RBAC Setup Guide","href":"/guides/rbac_setup"},{"title":"Scaling Virtual Tags","description":"Keep virtual tag processing fast and predictable as you add providers, values, and nested allocation chains.","href":"/guides/scaling_tagging"}]},{"group":"AI \u0026 Automation","icon":"wand-magic-sparkles","pages":[{"title":"FinOps AI Prompt Guide","href":"/guides/finops_ai_prompt_guide"},{"title":"FinOps as Code","href":"/guides/finops_as_code"}]}]},{"tab":"API","pages":[{"title":"API","href":"/api"}]},{"tab":"Vantage University","pages":[{"title":"Vantage University","href":"/vantage_university"}]},{"tab":"Changelog","pages":[{"title":"Changelog","href":"/changelog"}]}]},"basePath":"","title":"RBAC Setup Guide - Vantage","buildId":"dpl_DeHjVRGfFnhYQwHnfC2pjeXXv8h9","deploymentId":"dpl_DeHjVRGfFnhYQwHnfC2pjeXXv8h9","dynamics":[],"chunks":[]}