Using an API key instead of an OAuth client is deprecated. They are still supported but not recommended, as they have a maximum expiry of 90 days and must be refreshed manually.
To upgrade a Tailscale app that uses an API key, find the app in Inventory, then select Setup > Edit. Add the OAuth credentials and remove the API key. After you save the settings, check the App validations section to confirm your app authenticated correctly. No further action is needed after you add valid credentials.
In Opal, go to Inventory, click on the + App icon, and select Tailscale. Set the following fields.
Field
Value
Example(s)
App admin
The team that should manage the Tailscale app in Opal.
API Owners
Description
Let your end users know what they’re requesting access to.
SSH access to the production network
Tailnet name
Your tailnet’s domain name. Find this by opening the admin console and copying the name next to the Tailscale logo in the upper left.
example.com, [email protected], example.github
Tailscale OAuth Client ID
The Client ID of the OAuth client you generated in Step 1.
Tailscale OAuth Client Secret
The Client secret of the OAuth client you generated in Step 1.
Import Tailscale resources to Opal by selecting Import assets on the app’s Assets tab.
For each ACL tag that is selected, Opal automatically parses the existing access rules and SSH access rules that apply to that tag, and which groups have access to the tagged sources using those rules.Users can now request access or SSH access to a specific tag in Tailscale or to join a specific group.
Last modified on November 9, 2026
Was this page helpful?
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Opal Security Docs","colors":{"primary":"#0C7997","light":"#EDFCFC","dark":"#074055"},"logo":{"light":"https://mintcdn.com/opalsecurity/FBbZyeMPZrA69UcV/logo/logo-dark.svg?fit=max\u0026auto=format\u0026n=FBbZyeMPZrA69UcV\u0026q=85\u0026s=93a4bd75f157f9f0ab43cdf4d715b5cd","dark":"https://mintcdn.com/opalsecurity/FBbZyeMPZrA69UcV/logo/logo-light.svg?fit=max\u0026auto=format\u0026n=FBbZyeMPZrA69UcV\u0026q=85\u0026s=1774b545e4f1c5cad647f5194f7b26d9"},"favicon":{"light":"https://mintcdn.com/opalsecurity/DRAwGKUXMxLRQouh/logo/icon-opal-black.svg?fit=max\u0026auto=format\u0026n=DRAwGKUXMxLRQouh\u0026q=85\u0026s=9c8bd1204b6b5b83542c2ab5be549858","dark":"https://mintcdn.com/opalsecurity/DRAwGKUXMxLRQouh/logo/icon-opal-white.svg?fit=max\u0026auto=format\u0026n=DRAwGKUXMxLRQouh\u0026q=85\u0026s=73b53b4ceab6ae0b00e30b2042a6020a"},"icons":{"library":"lucide"},"styling":{"eyebrows":"breadcrumbs","latex":false},"integrations":{"ga4":{"measurementId":"G-1PPPM1WF6D"}},"errors":{"404":{"redirect":false,"title":"Page can't be found","description":"Sorry! This page might have been moved, or the link might be broken. Go back to our documentation via https://docs.opal.dev/docs/welcome."}},"metadata":{"timestamp":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"opalsecurity","hasAudioNarration":false,"actualSubdomain":"opalsecurity","customDomains":["docs.opal.dev"],"gitSource":{"type":"github","owner":"opalsecurity","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"feedback":{"thumbs":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6af7bc9ca5d707e66c231413","clientVersion":"0.0.4143","searchFilterCounts":[{"language":"default","tag":"API Reference","count":218},{"language":"default","tag":"Opal API","count":213},{"language":"default","tag":"Documentation","count":104},{"language":"default","tag":"Integrations","count":103},{"language":"default","tag":"Entitlement Management","count":69},{"language":"default","tag":"resources","count":34},{"language":"default","tag":"groups","count":32},{"language":"default","tag":"Getting Started","count":25},{"language":"default","tag":"Access Management","count":22},{"language":"default","tag":"Infrastructure","count":22}]},"assistantConfig":{"enableStarterQuestions":true,"enableContextualStarterQuestions":true,"deflection":{"enabled":true,"email":"support@opal.dev","showHelpButton":true}},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","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":"rbac-expansion","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":"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":"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":"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":"editor-metadata","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},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","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}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"integrations/tailscale","slug":"/integrations/tailscale","pageMetadata":{"title":"Tailscale","description":"Learn how to connect Opal to Tailscale to manage SSH access within your tailnet.","href":"/integrations/tailscale"},"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: \"Learn how to connect Opal to Tailscale to manage SSH access within your tailnet.\"\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`,code:`code`,em:`em`,li:`li`,ol:`ol`,p:`p`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{Heading,OptimizedImage,Table}=_components;if(!Heading)_missingMdxReference(`Heading`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);if(!Table)_missingMdxReference(`Table`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`With the Tailscale integration, you can granularly manage SSH access within your tailnet:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Allow users to request just-in-time access to resources on your tailnet from the web and Slack`}),`\n`,_jsx(_components.li,{children:`Set the right resource owners to delegate approvals to those with the most context`}),`\n`,_jsx(_components.li,{children:`Configure day-one access to Tailscale resources with groups from your identity provider`}),`\n`,_jsxs(_components.li,{children:[`Automatically escalate and revoke privileged resource access based on on-call schedules, e.g., `,_jsx(_components.a,{href:`/integrations/pagerduty-oncall`,children:`PagerDuty`}),` or `,_jsx(_components.a,{href:`/integrations/opsgenie`,children:`Opsgenie`})]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`supported-resources`,children:`Supported resources`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Resource`}),_jsx(_components.th,{children:`Read`}),_jsx(_components.th,{children:`Grant and revoke access`}),_jsx(_components.th,{children:`Available in Risk Center`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Tailscale Groups`}),_jsx(_components.td,{children:`✔️`}),_jsx(_components.td,{children:`✔️`}),_jsx(_components.td,{children:`✔️`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.a,{href:`https://tailscale.com/kb/1193/tailscale-ssh`,children:`Tailscale SSH`})}),_jsx(_components.td,{children:`✔️`}),_jsx(_components.td,{children:`✔️`}),_jsx(_components.td,{children:`✔️`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`requirements`,children:`Requirements`}),`\n`,_jsxs(_components.p,{children:[`Before you begin this guide, you’ll need a tailnet and an Opal account. To learn how to create a tailnet, see the `,_jsx(_components.a,{href:`https://tailscale.com/kb/1017/install/`,children:`Tailscale quickstart`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`configuration-steps`,children:`Configuration steps`}),`\n`,_jsx(_components.p,{children:`To use Opal with Tailscale:`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`Generate an `,_jsx(_components.a,{href:`https://tailscale.com/kb/1215/oauth-clients`,children:`OAuth client`}),` from the `,_jsx(_components.a,{href:`https://login.tailscale.com/admin/settings/oauth`,children:`OAuth clients page of the admin console`}),` and give the policy file the `,_jsx(_components.code,{children:`write`}),` scope.`]}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`Using an API key instead of an OAuth client is deprecated. They are still supported but not recommended, as they have a maximum expiry of 90 days and must be refreshed manually.`}),`\n`,_jsxs(_components.li,{children:[`To upgrade a Tailscale app that uses an API key, find the app in `,_jsx(_components.strong,{children:`Inventory`}),`, then select `,_jsx(_components.strong,{children:`Setup`}),` > `,_jsx(_components.strong,{children:`Edit`}),`. Add the OAuth credentials and remove the API key. After you save the settings, check the `,_jsx(_components.strong,{children:`App validations`}),` section to confirm your app authenticated correctly. No further action is needed after you add valid credentials.`]}),`\n`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`In Opal, go to `,_jsx(_components.strong,{children:`Inventory`}),`, click on the `,_jsx(_components.strong,{children:`+ App`}),` icon, and select `,_jsx(_components.strong,{children:`Tailscale`}),`. Set the following fields.`]}),`\n`]}),`\n`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Field`}),_jsx(_components.th,{children:`Value`}),_jsx(_components.th,{children:`Example(s)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`App admin`}),_jsx(_components.td,{children:`The team that should manage the Tailscale app in Opal.`}),_jsx(_components.td,{children:_jsx(_components.em,{children:`API Owners`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Description`}),_jsx(_components.td,{children:`Let your end users know what they’re requesting access to.`}),_jsx(_components.td,{children:_jsx(_components.em,{children:`SSH access to the production network`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Tailnet name`}),_jsx(_components.td,{children:`Your tailnet’s domain name. Find this by opening the admin console and copying the name next to the Tailscale logo in the upper left.`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`example.com`}),`, `,_jsx(_components.code,{children:`[email\\xA0protected]`}),`, `,_jsx(_components.code,{children:`example.github`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Tailscale OAuth Client ID`}),_jsxs(_components.td,{children:[`The `,_jsx(_components.code,{children:`Client ID`}),` of the OAuth client you generated in Step 1.`]}),_jsx(_components.td,{})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Tailscale OAuth Client Secret`}),_jsxs(_components.td,{children:[`The `,_jsx(_components.code,{children:`Client secret`}),` of the OAuth client you generated in Step 1.`]}),_jsx(_components.td,{})]})]})]}),`\n`,_jsxs(_components.ol,{start:`3`,children:[`\n`,_jsxs(_components.li,{children:[`Import Tailscale resources to Opal by selecting `,_jsx(_components.strong,{children:`Import assets`}),` on the app’s `,_jsx(_components.strong,{children:`Assets`}),` tab.`]}),`\n`]}),`\n`,_jsx(OptimizedImage,{src:`https://mintcdn.com/opalsecurity/4Xj9diJ3E3kX-9Xd/images/docs/f085a03b7c552727f6f13d559944a81239f31533e84da566de1dcd6602f851f9-import-to-tailscale.png?fit=max\u0026auto=format\u0026n=4Xj9diJ3E3kX-9Xd\u0026q=85\u0026s=1e379a6af0d8aa675d776a4ac7d8437f`,alt:``,\"data-og-width\":`3292`,width:`3292`,\"data-og-height\":`1301`,height:`1301`,\"data-path\":`images/docs/f085a03b7c552727f6f13d559944a81239f31533e84da566de1dcd6602f851f9-import-to-tailscale.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/opalsecurity/4Xj9diJ3E3kX-9Xd/images/docs/f085a03b7c552727f6f13d559944a81239f31533e84da566de1dcd6602f851f9-import-to-tailscale.png?w=280\u0026fit=max\u0026auto=format\u0026n=4Xj9diJ3E3kX-9Xd\u0026q=85\u0026s=91e62e9f8b446e9d18f74f6817a93666 280w, https://mintcdn.com/opalsecurity/4Xj9diJ3E3kX-9Xd/images/docs/f085a03b7c552727f6f13d559944a81239f31533e84da566de1dcd6602f851f9-import-to-tailscale.png?w=560\u0026fit=max\u0026auto=format\u0026n=4Xj9diJ3E3kX-9Xd\u0026q=85\u0026s=566b3dacfbc40dfc967c2d2256eadf85 560w, https://mintcdn.com/opalsecurity/4Xj9diJ3E3kX-9Xd/images/docs/f085a03b7c552727f6f13d559944a81239f31533e84da566de1dcd6602f851f9-import-to-tailscale.png?w=840\u0026fit=max\u0026auto=format\u0026n=4Xj9diJ3E3kX-9Xd\u0026q=85\u0026s=c92c7aa059638f28b1b952eecdde4f7b 840w, https://mintcdn.com/opalsecurity/4Xj9diJ3E3kX-9Xd/images/docs/f085a03b7c552727f6f13d559944a81239f31533e84da566de1dcd6602f851f9-import-to-tailscale.png?w=1100\u0026fit=max\u0026auto=format\u0026n=4Xj9diJ3E3kX-9Xd\u0026q=85\u0026s=52e7da27bbc11378c78247b7e538e349 1100w, https://mintcdn.com/opalsecurity/4Xj9diJ3E3kX-9Xd/images/docs/f085a03b7c552727f6f13d559944a81239f31533e84da566de1dcd6602f851f9-import-to-tailscale.png?w=1650\u0026fit=max\u0026auto=format\u0026n=4Xj9diJ3E3kX-9Xd\u0026q=85\u0026s=bf0ca78fdc838534a10e856ede15e4bc 1650w, https://mintcdn.com/opalsecurity/4Xj9diJ3E3kX-9Xd/images/docs/f085a03b7c552727f6f13d559944a81239f31533e84da566de1dcd6602f851f9-import-to-tailscale.png?w=2500\u0026fit=max\u0026auto=format\u0026n=4Xj9diJ3E3kX-9Xd\u0026q=85\u0026s=df41e9f0950bc7585e18895e4f2d695c 2500w`}),`\n`,_jsx(_components.p,{children:`For each ACL tag that is selected, Opal automatically parses the existing access rules and SSH access rules that apply to that tag, and which groups have access to the tagged sources using those rules.`}),`\n`,_jsx(_components.p,{children:`Users can now request access or SSH access to a specific tag in Tailscale or to join a specific group.`}),`\n`,_jsx(OptimizedImage,{src:`https://mintcdn.com/opalsecurity/fu-nWazMe1LxLhxi/images/docs/2a8a0a05c1570c82a14f50af6742d8bfc313e06e339456e9bbdc27cfd4583973-request-tailscale.png?fit=max\u0026auto=format\u0026n=fu-nWazMe1LxLhxi\u0026q=85\u0026s=54b75222e682277a2ebdd985d4b22382`,alt:``,\"data-og-width\":`3389`,width:`3389`,\"data-og-height\":`1902`,height:`1902`,\"data-path\":`images/docs/2a8a0a05c1570c82a14f50af6742d8bfc313e06e339456e9bbdc27cfd4583973-request-tailscale.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/opalsecurity/fu-nWazMe1LxLhxi/images/docs/2a8a0a05c1570c82a14f50af6742d8bfc313e06e339456e9bbdc27cfd4583973-request-tailscale.png?w=280\u0026fit=max\u0026auto=format\u0026n=fu-nWazMe1LxLhxi\u0026q=85\u0026s=5b0b8ad77bf636e7aecdc98508b535cf 280w, https://mintcdn.com/opalsecurity/fu-nWazMe1LxLhxi/images/docs/2a8a0a05c1570c82a14f50af6742d8bfc313e06e339456e9bbdc27cfd4583973-request-tailscale.png?w=560\u0026fit=max\u0026auto=format\u0026n=fu-nWazMe1LxLhxi\u0026q=85\u0026s=bbc54c7e43ddb512ddedbf7045d7a774 560w, https://mintcdn.com/opalsecurity/fu-nWazMe1LxLhxi/images/docs/2a8a0a05c1570c82a14f50af6742d8bfc313e06e339456e9bbdc27cfd4583973-request-tailscale.png?w=840\u0026fit=max\u0026auto=format\u0026n=fu-nWazMe1LxLhxi\u0026q=85\u0026s=b8c03a24db39f6ce3f1dbbaa6246dc35 840w, https://mintcdn.com/opalsecurity/fu-nWazMe1LxLhxi/images/docs/2a8a0a05c1570c82a14f50af6742d8bfc313e06e339456e9bbdc27cfd4583973-request-tailscale.png?w=1100\u0026fit=max\u0026auto=format\u0026n=fu-nWazMe1LxLhxi\u0026q=85\u0026s=7c5d2c65516265e237de88179cd4e599 1100w, https://mintcdn.com/opalsecurity/fu-nWazMe1LxLhxi/images/docs/2a8a0a05c1570c82a14f50af6742d8bfc313e06e339456e9bbdc27cfd4583973-request-tailscale.png?w=1650\u0026fit=max\u0026auto=format\u0026n=fu-nWazMe1LxLhxi\u0026q=85\u0026s=8d59b2ccb9f5ecb0a3bd1650053de360 1650w, https://mintcdn.com/opalsecurity/fu-nWazMe1LxLhxi/images/docs/2a8a0a05c1570c82a14f50af6742d8bfc313e06e339456e9bbdc27cfd4583973-request-tailscale.png?w=2500\u0026fit=max\u0026auto=format\u0026n=fu-nWazMe1LxLhxi\u0026q=85\u0026s=52eb7d623202dccfddcb22af29c09806 2500w`})]})}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":"Tailscale","description":"Learn how to connect Opal to Tailscale to manage SSH access within your tailnet.","href":"/integrations/tailscale"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Supported resources","slug":"supported-resources","depth":2,"children":[]},{"title":"Requirements","slug":"requirements","depth":2,"children":[]},{"title":"Configuration steps","slug":"configuration-steps","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/opalsecurity/d0e14c3cf9bbd682/changelog-scraper.js"],"subdomain":"opalsecurity","siteName":"Opal Security Docs","title":"Tailscale - Opal Security Docs","contextualStarterQuestions":[{"_id":"6af2097ac779f12ffaeddf59","deploymentId":"68ddaa9a3f8b7de5bc3a7b47","questionText":"How do I request SSH access?","status":"active","generatedBy":"contextual","path":"integrations/tailscale","createdAt":"2026-11-09T17:57:14.046Z","updatedAt":"2026-11-09T17:57:14.046Z","__v":0},{"_id":"6af2097ac779f12ffaeddf57","deploymentId":"68ddaa9a3f8b7de5bc3a7b47","questionText":"How do I set up Tailscale OAuth?","status":"active","generatedBy":"contextual","path":"integrations/tailscale","createdAt":"2026-11-09T17:57:14.046Z","updatedAt":"2026-11-09T17:57:14.046Z","__v":0},{"_id":"6af2097ac779f12ffaeddf58","deploymentId":"68ddaa9a3f8b7de5bc3a7b47","questionText":"What resources can I manage?","status":"active","generatedBy":"contextual","path":"integrations/tailscale","createdAt":"2026-11-09T17:57:14.046Z","updatedAt":"2026-11-09T17:57:14.046Z","__v":0}],"navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-09T17:57:01.668Z","gitLastModified":"2026-11-09T17:56:39.000Z","originalFileLocation":"integrations/tailscale.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=\"system\"}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=\"Learn how to connect Opal to Tailscale to manage SSH access within your tailnet.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Opal Security Docs\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/opalsecurity/t501z2uOx-XXqevB/_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/opalsecurity/t501z2uOx-XXqevB/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/opalsecurity/t501z2uOx-XXqevB/_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/opalsecurity/t501z2uOx-XXqevB/_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/opalsecurity/t501z2uOx-XXqevB/_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/opalsecurity/t501z2uOx-XXqevB/_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/opalsecurity/t501z2uOx-XXqevB/_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/opalsecurity/t501z2uOx-XXqevB/_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/opalsecurity/t501z2uOx-XXqevB/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Tailscale - Opal Security Docs\">\u003cmeta data-mint-head property=\"og:description\" content=\"Learn how to connect Opal to Tailscale to manage SSH access within your tailnet.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Opal Security Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.opal.dev/integrations/tailscale\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://opalsecurity.mintlify.site/_mintlify/api/og/v2?division=Entitlement+Management\u0026amp;title=Tailscale\u0026amp;description=Learn+how+to+connect+Opal+to+Tailscale+to+manage+SSH+access+within+your+tailnet.\u0026amp;theme=156eb1ba223f12a303f95077\u0026amp;signature=16011c24aa0909a756dc788a061e748939c717db232be6a8ebb692763eda7689\">\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=\"Tailscale - Opal Security Docs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Learn how to connect Opal to Tailscale to manage SSH access within your tailnet.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://opalsecurity.mintlify.site/_mintlify/api/og/v2?division=Entitlement+Management\u0026amp;title=Tailscale\u0026amp;description=Learn+how+to+connect+Opal+to+Tailscale+to+manage+SSH+access+within+your+tailnet.\u0026amp;theme=156eb1ba223f12a303f95077\u0026amp;signature=16011c24aa0909a756dc788a061e748939c717db232be6a8ebb692763eda7689\">\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/opalsecurity/t501z2uOx-XXqevB/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Opal Security Docs\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#0C7997\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.opal.dev/integrations/tailscale\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/integrations/tailscale.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.opal.dev/#organization\",\"name\":\"Opal Security Docs\",\"url\":\"https://docs.opal.dev\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/opalsecurity/FBbZyeMPZrA69UcV/logo/logo-dark.svg?fit=max\u0026auto=format\u0026n=FBbZyeMPZrA69UcV\u0026q=85\u0026s=93a4bd75f157f9f0ab43cdf4d715b5cd\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.opal.dev#website\",\"name\":\"Opal Security Docs\",\"url\":\"https://docs.opal.dev\",\"publisher\":{\"@id\":\"https://docs.opal.dev/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.opal.dev/integrations/tailscale#webpage\",\"url\":\"https://docs.opal.dev/integrations/tailscale\",\"name\":\"Tailscale\",\"description\":\"Learn how to connect Opal to Tailscale to manage SSH access within your tailnet.\",\"dateModified\":\"2026-11-09T17:56:39.000Z\",\"isPartOf\":{\"@id\":\"https://docs.opal.dev#website\"},\"breadcrumb\":{\"@id\":\"https://docs.opal.dev/integrations/tailscale#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.opal.dev/integrations/tailscale#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Entitlement Management\",\"item\":\"https://docs.opal.dev/integrations/setting-up-your-aws-organization-in-opal\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tailscale\",\"item\":\"https://docs.opal.dev/integrations/tailscale\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.opal.dev/integrations/tailscale#article\",\"headline\":\"Tailscale\",\"name\":\"Tailscale\",\"description\":\"Learn how to connect Opal to Tailscale to manage SSH access within your tailnet.\",\"url\":\"https://docs.opal.dev/integrations/tailscale\",\"mainEntityOfPage\":{\"@id\":\"https://docs.opal.dev/integrations/tailscale#webpage\"},\"dateModified\":\"2026-11-09T17:56:39.000Z\",\"publisher\":{\"@id\":\"https://docs.opal.dev/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.opal.dev#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Opal Security Docs\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"Opal Security Docs\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/integrations/tailscale.md","siteName":"Opal Security Docs","nav":{"global":null,"tabs":[{"tab":"Documentation","pages":[{"title":"Documentation","href":"/docs/welcome"}]},{"tab":"Integrations","pages":[{"title":"Integrations","sidebarTitle":"Overview","mode":"wide","href":"/integrations/overview"},{"group":"IDP \u0026 HRIDP","pages":[{"group":"Okta","pages":[{"title":"Okta","sidebarTitle":"Connect to Okta","href":"/integrations/okta"},{"title":"Okta IDP/HRIS Integration","href":"/integrations/okta-idphris-integration"},{"title":"Import Okta apps","href":"/integrations/okta-apps"},{"title":"Okta rate limits","href":"/integrations/okta-rate-limits"}]},{"group":"OneLogin","pages":[{"title":"OneLogin IDP/HRIS Integration","tag":"NEW","href":"/integrations/onelogin-idphris-integration"}]},{"group":"Google","pages":[{"title":"Google","sidebarTitle":"Connect to Google","href":"/integrations/google"},{"title":"Google IDP/HRIS Integration","href":"/integrations/google-idphris-integration"},{"title":"Google Groups","href":"/integrations/google-groups"},{"title":"Google Shared Drive","tag":"NEW","href":"/integrations/google-shared-drive"},{"title":"Google Workspace","href":"/integrations/google-workspace"}]},{"group":"Azure","pages":[{"title":"Azure","sidebarTitle":"Connect to Azure","href":"/integrations/azure"},{"title":"Azure Entra IDP/HRIS Integration","href":"/integrations/azure-entra-idphris-integration"},{"title":"Azure Infrastructure Setup","href":"/integrations/azure-infrastructure-setup"},{"title":"Add Azure Databases","href":"/integrations/adding-azure-sql-databases"},{"title":"Azure Real Time Sync Setup","href":"/integrations/azure-real-time-sync"}]},{"group":"Active Directory","pages":[{"title":"Overview","sidebarTitle":"Connect to Active Directory","href":"/integrations/active-directory"},{"title":"Active Directory IDP/HRIS Integration","href":"/integrations/active-directory-idphris-integration"}]},{"group":"Workday","pages":[{"title":"Overview","sidebarTitle":"Connect to Workday","href":"/integrations/workday"},{"title":"Workday IDP/HRIS Integration","href":"/integrations/workday-idphris-integration"}]},{"group":"Rippling","pages":[{"title":"Rippling IDP/HRIS Integration","tag":"NEW","href":"/integrations/rippling-idphris-integration"}]}]},{"group":"Entitlement Management","pages":[{"group":"Infrastructure","expanded":true,"pages":[{"group":"Amazon Web Services (AWS)","expanded":false,"pages":[{"title":"Amazon Web Services (AWS)","href":"/integrations/setting-up-your-aws-organization-in-opal"},{"title":"Configure AWS for self-hosted Opal","href":"/integrations/aws-integration-on-prem-setup"},{"title":"Configure additional AWS accounts to manage in Opal","href":"/integrations/configure-additional-aws-accounts-to-manage-in-opal"},{"title":"AWS IAM Identity Center Workflows","href":"/integrations/aws-iam-identity-center-formerly-aws-sso"},{"title":"Add an IAM role","href":"/integrations/adding-an-iam-role"},{"title":"Add an RDS database","href":"/integrations/adding-an-rds-database"},{"title":"Add an EC2 instance","href":"/integrations/adding-an-ec2-instance"},{"title":"Add an EKS cluster","href":"/integrations/adding-an-eks-cluster"},{"title":"Adding AWS Resources to Opal Groups via AWS Tags","href":"/integrations/adding-aws-resources-to-opal-groups-via-aws-tags"},{"title":"AWS Real Time Sync Setup","href":"/integrations/aws-real-time-sync"}]},{"group":"Google Cloud Platform (GCP)","expanded":false,"pages":[{"title":"Google Cloud Platform (GCP)","sidebarTitle":"Connect to GCP","href":"/integrations/google-cloud-platform"},{"title":"Add an organization","href":"/integrations/adding-gcp-organization"},{"title":"Add a project","href":"/integrations/adding-gcp-project"},{"title":"Add a folder","href":"/integrations/adding-gcp-folder"},{"title":"Add a BigQuery Dataset","href":"/integrations/adding-bigquery-dataset"},{"title":"Add a Cloud Storage bucket","href":"/integrations/adding-gcp-bucket"},{"title":"Add a Cloud SQL Instance","href":"/integrations/adding-sql-instance"},{"title":"Add a Compute Engine Instance","href":"/integrations/adding-compute-instance"},{"title":"Google Kubernetes Engine (GKE)","href":"/integrations/google-kubernetes-engine-getting-started"},{"title":"GCP Service Accounts","href":"/integrations/gcp-service-accounts"}]},{"group":"Snowflake","expanded":false,"pages":[{"title":"Snowflake","sidebarTitle":"Connect to Snowflake","href":"/integrations/snowflake"},{"title":"Snowflake User Provisioning","href":"/integrations/snowflake-user-provisioning"}]}]},{"title":"1Password","tag":"NEW","href":"/integrations/1password"},{"title":"Anthropic Platform","href":"/integrations/anthropic"},{"title":"Astra","href":"/integrations/astra"},{"title":"Axiom","href":"/integrations/axiom"},{"title":"Box","tag":"NEW","href":"/integrations/box"},{"title":"Clickhouse","href":"/integrations/clickhouse"},{"title":"Atlassian Confluence","sidebarTitle":"Atlassian Confluence","href":"/integrations/confluence"},{"title":"Coupa","href":"/integrations/coupa"},{"title":"Cursor","href":"/integrations/cursor"},{"title":"Databricks","href":"/integrations/databricks"},{"title":"Datadog","href":"/integrations/datadog"},{"title":"Devin AI","href":"/integrations/devin"},{"title":"Docusign","href":"/integrations/docusign"},{"title":"Duo","href":"/integrations/duo"},{"title":"GitGuardian","tag":"NEW","href":"/integrations/gitguardian"},{"title":"GitHub","href":"/integrations/github"},{"title":"GitHub Enterprise","href":"/integrations/github-enterprise"},{"title":"GitLab","href":"/integrations/gitlab"},{"title":"Grafana","href":"/integrations/grafana"},{"title":"Hubspot","href":"/integrations/hubspot"},{"title":"Incident.io","href":"/integrations/incidentio"},{"title":"Atlassian Jira","sidebarTitle":"Atlassian Jira","href":"/integrations/jira"},{"title":"LDAP","href":"/integrations/ldap"},{"title":"Linear","sidebarTitle":"Linear","href":"/integrations/linear"},{"title":"NetSuite","href":"/integrations/netsuite"},{"title":"Okta CIAM","href":"/integrations/okta-ciam"},{"title":"OneLogin","tag":"NEW","href":"/integrations/onelogin"},{"title":"OpenAI Platform","href":"/integrations/openai"},{"title":"Oracle Fusion Cloud","href":"/integrations/oracle-fusion-cloud"},{"title":"PagerDuty","href":"/integrations/pagerduty-entitlements"},{"title":"Ramp","href":"/integrations/ramp"},{"title":"Rippling","href":"/integrations/rippling"},{"title":"Rootly","href":"/integrations/rootly"},{"title":"Salesforce","href":"/integrations/salesforce"},{"title":"Sentry","tag":"NEW","href":"/integrations/sentry"},{"title":"Slack users, groups, and roles","href":"/integrations/slack-user-groups"},{"title":"Square","tag":"NEW","href":"/integrations/square"},{"title":"Salesforce Tableau","description":"Learn how to connect your Opal instance with Tableau.","href":"/integrations/tableau"},{"title":"Tailscale","href":"/integrations/tailscale"},{"title":"Teleport","description":"Learn how to connect Opal to Teleport to manage access to Teleport roles.","href":"/integrations/teleport"},{"title":"Twingate","href":"/integrations/twingate"},{"title":"Vercel","href":"/integrations/vercel"},{"title":"Workato","tag":"NEW","href":"/integrations/workato"},{"title":"Workday groups and roles","href":"/integrations/workday-groups-and-roles"},{"title":"Wrike","href":"/integrations/wrike"},{"title":"Zendesk","href":"/integrations/zendesk"},{"title":"Zoom","href":"/integrations/zoom"}]},{"group":"Productivity Tools","pages":[{"group":"Communication","expanded":true,"pages":[{"title":"Google Chat","href":"/integrations/google-chat"},{"title":"Lark","href":"/integrations/lark"},{"title":"Microsoft Teams","href":"/integrations/microsoft-teams"},{"title":"Slack","href":"/integrations/slack"}]},{"group":"Ticketing","expanded":true,"pages":[{"title":"Freshservice","href":"/integrations/freshservice"},{"title":"Jira","href":"/integrations/jira-ticketing"},{"title":"Linear","href":"/integrations/linear-ticketing"},{"title":"Notion","href":"/integrations/notion"},{"title":"Risotto","tag":"BETA","href":"/integrations/risotto"},{"title":"ServiceNow","href":"/integrations/servicenow"},{"title":"Shortcut","href":"/integrations/shortcut"}]},{"group":"On-call","expanded":true,"pages":[{"title":"Opsgenie","deprecated":true,"href":"/integrations/opsgenie"},{"title":"PagerDuty","deprecated":true,"href":"/integrations/pagerduty-oncall"}]}]}]},{"tab":"API Reference","pages":[{"title":"API Reference","href":"/reference/authentication"}]},{"tab":"Changelog","pages":[{"title":"Changelog","href":"/changelog/changelog"}]}]},"basePath":"","title":"Tailscale - Opal Security Docs","buildId":"dpl_Fyv1NbzwP68g2bEH2Roy98uY1zmE","deploymentId":"dpl_Fyv1NbzwP68g2bEH2Roy98uY1zmE","dynamics":["a74be98ba7"],"chunks":["zoom-image-lightbox-BbK2OBGL.js","lightbox-handle-r17bVUz3.js"]}