Configure Access for Linux Desktops
This guide demonstrates how to configure Teleport to provide secure, audited access to Linux desktops running X11 desktop environments.
How it works
The Teleport Linux Desktop Service runs directly on the Linux host you want to access. When a user connects, the service starts a virtual X11 display using Xvfb (X virtual framebuffer) and launches the user's chosen desktop environment inside it.
The Linux Desktop Service establishes a reverse tunnel to the Teleport Proxy Service, so only a single outbound connection from the host is required—no inbound firewall rules are needed.
Available desktop sessions are discovered from .desktop files in
/usr/share/xsessions. You can restrict which sessions are offered using the
xsessions.included and xsessions.excluded filters in the service configuration.
Prerequisites
To complete the steps in this guide, verify your environment meets the following requirements:
-
A running Teleport cluster accessible at a hostname with a valid TLS certificate. If you want to get started with Teleport, sign up for a free trial or set up a demo environment.
-
The
tctlandtshclients.Installing
tctlandtshclients-
Determine the version of your Teleport cluster. The
tctlandtshclients must be at most one major version behind your Teleport cluster version. Send a GET request to the Proxy Service at/v1/webapi/findand use a JSON query tool to obtain your cluster version. Replace teleport.example.com:443 with the web address of your Teleport Proxy Service:- Mac/Linux
- Windows - Powershell
TELEPORT_DOMAIN=teleport.example.com:443TELEPORT_VERSION="$(curl -s https://$TELEPORT_DOMAIN/v1/webapi/find | jq -r '.server_version')"$TELEPORT_DOMAIN = "teleport.example.com:443"$TELEPORT_VERSION = (Invoke-RestMethod -Uri "https://${TELEPORT_DOMAIN}/v1/webapi/find").server_version -
Follow the instructions for your platform to install
tctlandtshclients:- Mac
- Windows - Powershell
- Linux
Download the signed macOS .pkg installer for Teleport, which includes the
tctlandtshclients:curl -O https://cdn.teleport.dev/teleport-${TELEPORT_VERSION?}.pkgIn Finder double-click the
pkgfile to begin installation.dangerUsing Homebrew to install Teleport is not supported. The Teleport package in Homebrew is not maintained by Teleport and we can't guarantee its reliability or security.
curl.exe -O https://cdn.teleport.dev/teleport-v$TELEPORT_VERSION-windows-amd64-bin.zipUnzip the archive and move the `tctl` and `tsh` clients to your %PATH%
NOTE: Do not place the `tctl` and `tsh` clients in the System32 directory, as this can cause issues when using WinSCP.
Use %SystemRoot% (C:\Windows) or %USERPROFILE% (C:\Users\<username>) instead.
All of the Teleport binaries in Linux installations include the
tctlandtshclients. For more options (including RPM/DEB packages and downloads for i386/ARM/ARM64) see our installation page.curl -O https://cdn.teleport.dev/teleport-v${TELEPORT_VERSION?}-linux-amd64-bin.tar.gztar -xzf teleport-v${TELEPORT_VERSION?}-linux-amd64-bin.tar.gzcd teleportsudo ./installTeleport binaries have been copied to /usr/local/bin
Connecting with TLS routing disabled
This guide's commands assume your Teleport cluster uses TLS routing (
proxy_listener_mode: multiplex), where thetctlandtshclients reach every Teleport service through the Proxy Service's web address on port443. If you're not sure whether this applies to your cluster, check with whoever manages it.If your cluster uses separate listener ports instead, adjust ports as follows:
-
tshcommands (e.g.,tsh login --proxy=...): continue using the Proxy Service web address on port3080(or443if behind a load balancer). Do not change these to port3025. -
Direct
tctlor Auth Service API commands: use port3025for the Auth Service gRPC listener:tctl status --auth-server=teleport.example.com:3025
-
-
A Linux host running an X11-compatible desktop environment with session definitions in
/usr/share/xsessions. -
Xvfb installed on the Linux host. Xvfb provides the virtual framebuffer that Teleport uses to render the desktop. Install it with your distribution's package manager:
- Debian/Ubuntu
- Fedora/RHEL/CentOS/Amazon Linux
sudo apt-get install xvfbsudo dnf install xorg-x11-server-XvfbVerify that
Xvfbis available inPATH:sudo -i which Xvfb -
Check that you can connect to your Teleport cluster and verify that you can run
tctlandtshcommands using your current credentials.-
Assign teleport.example.com to the domain name of the Teleport Proxy Service in your cluster and [email protected] to your Teleport username.
-
Authenticate to your Teleport cluster. This depends on whether your shell is interactive or not.
In an interactive shell: Run the following command. By default, this triggers a multi-factor authentication prompt:
tsh login --proxy=teleport.example.com --user=[email protected]tctl statusCluster teleport.example.com
Version 19.0.0-dev
CA pin sha256:abdc1245efgh5678abdc1245efgh5678abdc1245efgh5678abdc1245efgh5678
On non-interactive environments: If you are running
tshandtctlas an AI agent, in a CI/CD environment, or similar, make sure theTELEPORT_IDENTITY_FILEenvironment variable is assigned to a valid file path with credentials for your cluster.tshandtctlread the file path from the environment variable and do not require a separate authentication step. If there is no identity file available, we recommend that you set up Machine ID to provision one automatically.When executing
tctlcommands with an identity file, you must pass the--auth-serverflag to provide the Teleport Auth Service address, which is not included in the identity file. If you provide the Proxy Service address,tctlconnects to the Proxy Service, which forwards traffic to and from the Teleport Auth Service. Update 443 to3025if you are contacting the Auth Service directly withtctl:tctl status --auth-server=teleport.example.com:443For
tshcommands that read an identity file, you must pass the--proxyflag, which pointstshto the address of the Teleport Proxy Service:tsh status --proxy=teleport.example.comEnsure client commands can access your identity file. Replace path/to/identity/file with the path to your identity file:
export TELEPORT_IDENTITY_FILE="${TELEPORT_IDENTITY_FILE:-path/to/identity/file}"Add the
--auth-serveror--proxyflags to all subsequenttctlandtshcommands.
If you can connect to the cluster and run the
tctl statuscommand, you can use your current credentials to run subsequenttctlcommands from your workstation. If you host your own Teleport cluster, you can also runtctlcommands on the computer that hosts the Teleport Auth Service for full permissions. -
Step 1/3. Configure the Linux Desktop Service
The Linux Desktop Service runs on the Linux host that users will connect to.
To configure the Linux Desktop Service:
-
Sign in to the Teleport cluster from your administrative workstation.
-
Generate an invitation token for the Linux Desktop Service:
tctl tokens add --type=linux_desktop --format=text > /tmp/tokenCopy
/tmp/tokento the target Linux host -
Verify that Teleport is installed on the Linux host:
teleport versionIf Teleport isn't installed, follow the appropriate Installation instructions for your environment.
-
Configure
/etc/teleport.yamlon the Linux host:version: v3 teleport: nodename: linux-desktop.example.com proxy_server: teleport.example.com:443 auth_token: "/tmp/token" linux_desktop_service: enabled: true auth_service: enabled: false proxy_service: enabled: false ssh_service: enabled: falseSet
proxy_serverto the address of your Teleport cluster. -
(Optional) Add labels to the Linux Desktop Service. Labels are used to control which users can connect to this host.
version: v3 teleport: nodename: linux-desktop.example.com proxy_server: teleport.example.com:443 auth_token: "/tmp/token" linux_desktop_service: enabled: true + labels: + datacenter: us-east + env: production -
(Optional) Filter the desktop sessions available to users. Teleport discovers available session types from
.desktopfiles in/usr/share/xsessions. You can restrict which sessions are offered using regular expressions matched against the session name (the filename without the.desktopextension):linux_desktop_service: enabled: true + xsessions: + # Only expose GNOME, KDE, and XFCE sessions. + included: "^(gnome|kde|xfce4)$" + # Exclude classic or fallback variants. + excluded: ".*-classic$"The
includedpattern is applied first. If set, only sessions whose name matches the pattern are offered. Theexcludedpattern is applied next and removes sessions whose name matches it. -
Start the Teleport Linux Desktop Service. The instructions depend on how you installed the Teleport Linux Desktop Service and whether your system supports systemd:
- Package Manager
- TAR Archive
- No systemd
Configure the Teleport Linux Desktop Service to start automatically when the host boots up by creating a systemd service for it. On the host where you will run the Teleport Linux Desktop Service, enable and start Teleport:
sudo systemctl enable teleportsudo systemctl start teleportYou can check the status of the Teleport Linux Desktop Service with
systemctl status teleportand view its logs withjournalctl -fu teleport.Configure the Teleport Linux Desktop Service to start automatically when the host boots up by creating a systemd service for it. On the host where you will run the Teleport Linux Desktop Service, create a systemd service configuration for Teleport, enable the Teleport service, and start Teleport:
sudo teleport install systemd -o /etc/systemd/system/teleport.servicesudo systemctl enable teleportsudo systemctl start teleportYou can check the status of the Teleport Linux Desktop Service with
systemctl status teleportand view its logs withjournalctl -fu teleport.On the host where you will run the Teleport Linux Desktop Service, start Teleport:
sudo teleport start --config=/etc/teleport.yamlTeleport runs in the foreground and outputs logs for the services it is running.
Checkpoint: Verify the Linux Desktop Service is running
Confirm that the Teleport Linux Desktop Service has started and connected to your cluster.
Here are some troubleshooting tips:
-
Check the service status:
systemctl status teleport -
Review logs for connection errors:
sudo journalctl -u teleport -
Verify that
Xvfbis available inPATH:sudo -i which XvfbIf the command returns no output, Xvfb is not installed. See the Prerequisites section above for installation instructions.
-
Confirm that at least one
.desktopfile exists in/usr/share/xsessions:ls /usr/share/xsessions/ -
Ensure the token hasn't expired (tokens are valid for 60 minutes by default).
You can reach out to our Slack community or customer support for help.
Step 2/3. Configure a role for Linux desktop access
To access a Linux desktop, a Teleport user must have a role that grants the appropriate permissions.
To configure a role for Linux desktop access:
-
Sign in to the Teleport cluster from your administrative workstation.
-
Create a
linux-desktop-admins.yamlfile to define a new role:kind: role version: v6 metadata: name: linux-desktop-admins spec: allow: linux_desktop_labels: "*": "*" linux_desktop_logins: ["alice"]In this file:
- Set
linux_desktop_labelsto specify which Linux desktops users assigned to this role can access. Use"*": "*"to allow access to all desktops, or specify labels to restrict access to desktops with matching labels. - Set
linux_desktop_loginsto the Linux user accounts that members of this role can connect as. The specified user must already exist on the Linux host.
- Set
-
Apply the new role to your cluster:
tctl create -f linux-desktop-admins.yamltipYou can also create and edit roles using the Web UI. Go to Access -> Roles and click Create New Role or pick an existing role to edit.
-
Assign the
linux-desktop-adminsrole to your Teleport user. The commands to run depend on how you authenticate to Teleport, that is, whether you have a local Teleport user, a single sign-on authentication connector, or a non-interactive user:- Local User
- GitHub
- SAML
- OIDC
- Non-Interactive
-
Retrieve your local user's roles as a comma-separated list:
ROLES=$(tsh status -f json | jq -r '.active.roles | join(",")') -
Edit your local user to add the new role:
tctl users update $(tsh status -f json | jq -r '.active.username') \ --set-roles "${ROLES?},linux-desktop-admins" -
Sign out of the Teleport cluster and sign in again to assume the new role.
-
Open your
githubauthentication connector in a text editor:tctl edit github/github -
Edit the
githubconnector, addinglinux-desktop-adminsto theteams_to_rolessection.The team you should map to this role depends on how you have designed your organization's role-based access controls (RBAC). However, the team must include your user account and should be the smallest team possible within your organization.
Here is an example:
teams_to_roles: - organization: octocats team: admins roles: - access + - linux-desktop-admins -
Apply your changes by saving and closing the file in your editor.
-
Sign out of the Teleport cluster and sign in again to assume the new role.
-
Retrieve your
samlconfiguration resource:tctl get --with-secrets saml/mysaml > saml.yamlNote that the
--with-secretsflag adds the value ofspec.signing_key_pair.private_keyto thesaml.yamlfile. Because this key contains a sensitive value, you should remove the saml.yaml file immediately after updating the resource. -
Edit
saml.yaml, addinglinux-desktop-adminsto theattributes_to_rolessection.The attribute you should map to this role depends on how you have designed your organization's role-based access controls (RBAC). However, the group must include your user account and should be the smallest group possible within your organization.
Here is an example:
attributes_to_roles: - name: "groups" value: "my-group" roles: - access + - linux-desktop-admins -
Apply your changes:
tctl create -f saml.yaml -
Sign out of the Teleport cluster and sign in again to assume the new role.
-
Retrieve your
oidcconfiguration resource:tctl get oidc/myoidc --with-secrets > oidc.yamlNote that the
--with-secretsflag adds the value ofspec.signing_key_pair.private_keyto theoidc.yamlfile. Because this key contains a sensitive value, you should remove the oidc.yaml file immediately after updating the resource. -
Edit
oidc.yaml, addinglinux-desktop-adminsto theclaims_to_rolessection.The claim you should map to this role depends on how you have designed your organization's role-based access controls (RBAC). However, the group must include your user account and should be the smallest group possible within your organization.
Here is an example:
claims_to_roles: - name: "groups" value: "my-group" roles: - access + - linux-desktop-admins -
Apply your changes:
tctl create -f oidc.yaml -
Sign out of the Teleport cluster and sign in again to assume the new role.
For non-interactive users such as AI agents and CI/CD runners, follow these steps.
If you are using Machine ID to issue identity files to your user:
-
Add the new role to your bot. Assign mybot to the name of the Machine ID bot that issues your certificate:
tctl bots update mybot --add-roles linux-desktop-admins -
Force
tbotto regenerate the certificate:pkill -HUP tbotThe bot will also generate a certificate with the new role on its next renewal.
Otherwise, update your user and regenerate your identity file:
-
Retrieve your local user's roles as a comma-separated list. Make sure username is the Teleport user you want to assign the new role to.
ROLES=$(tctl get user/username --format=json | jq -r '.[].spec.roles | join(",")') -
Edit your local user to add the new role:
tctl users update username \ --set-roles "${ROLES?},linux-desktop-admins" -
Regenerate the identity file. Make sure path/to/identity/file corresponds to the correct output path:
tctl auth sign \ --user=username \ --out=path/to/identity/file \ --overwrite
Step 3/3. Connect
Now that the Linux Desktop Service is running and a role has been configured, you can connect to the Linux desktop from the Teleport Web UI or Teleport Connect.
To connect to a Linux desktop:
-
Sign in to the Teleport cluster using an account assigned the
linux-desktop-adminsrole. -
Select Resources.
-
Click Type, then select Desktops.
-
Click Connect for the Linux desktop you want to access, then select the Linux user account to use for the connection.
Teleport opens a remote desktop connection and starts recording the desktop session. When you are finished, click the More items menu, then click Disconnect.
To view the recording, select Audit in the Teleport Web UI, then click Session Recordings.
Checkpoint: Verify Linux desktop access
Confirm that you can connect to the Linux desktop and see the desktop environment.
Here are some troubleshooting tips:
-
Ensure your Teleport user is assigned the
linux-desktop-adminsrole (or an equivalent role with Linux desktop permissions). -
Verify that the Linux user account you selected exists on the host.
-
Confirm that Xvfb is installed and in
PATHon the Linux host. -
Check that at least one session type is available after applying your
xsessionsfilters: review/usr/share/xsessions/and compare against theincluded/excludedpatterns in your configuration. -
If the connection fails, review the Linux Desktop Service logs on the host:
sudo journalctl -u teleport
You can reach out to our Slack community or customer support for help.
Next steps
- To learn more about controlling who can access which desktops, see Role-Based Access Control for Desktops.
- To configure session recording options, see Session Recording and Playback.
- For a full list of
linux_desktop_serviceconfiguration options, see the Desktop Access Configuration Reference.