Skip to main content

Configure Access for Linux Desktops

Report an Issue

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 tctl and tsh clients.

    Installing tctl and tsh clients
    1. Determine the version of your Teleport cluster. The tctl and tsh clients must be at most one major version behind your Teleport cluster version. Send a GET request to the Proxy Service at /v1/webapi/find and use a JSON query tool to obtain your cluster version. Replace teleport.example.com:443 with the web address of your Teleport Proxy Service:

      TELEPORT_DOMAIN=teleport.example.com:443
      TELEPORT_VERSION="$(curl -s https://$TELEPORT_DOMAIN/v1/webapi/find | jq -r '.server_version')"
    2. Follow the instructions for your platform to install tctl and tsh clients:

      Download the signed macOS .pkg installer for Teleport, which includes the tctl and tsh clients:

      curl -O https://cdn.teleport.dev/teleport-${TELEPORT_VERSION?}.pkg

      In Finder double-click the pkg file to begin installation.

      danger

      Using 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.

    Connecting with TLS routing disabled

    This guide's commands assume your Teleport cluster uses TLS routing (proxy_listener_mode: multiplex), where the tctl and tsh clients reach every Teleport service through the Proxy Service's web address on port 443. 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:

    • tsh commands (e.g., tsh login --proxy=...): continue using the Proxy Service web address on port 3080 (or 443 if behind a load balancer). Do not change these to port 3025.

    • Direct tctl or Auth Service API commands: use port 3025 for 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:

    sudo apt-get install xvfb

    Verify that Xvfb is available in PATH:

    sudo -i which Xvfb
  • Check that you can connect to your Teleport cluster and verify that you can run tctl and tsh commands using your current credentials.

    1. Assign teleport.example.com to the domain name of the Teleport Proxy Service in your cluster and [email protected] to your Teleport username.

    2. 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 status

      Cluster teleport.example.com

      Version 19.0.0-dev

      CA pin sha256:abdc1245efgh5678abdc1245efgh5678abdc1245efgh5678abdc1245efgh5678

      On non-interactive environments: If you are running tsh and tctl as an AI agent, in a CI/CD environment, or similar, make sure the TELEPORT_IDENTITY_FILE environment variable is assigned to a valid file path with credentials for your cluster. tsh and tctl read 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 tctl commands with an identity file, you must pass the --auth-server flag to provide the Teleport Auth Service address, which is not included in the identity file. If you provide the Proxy Service address, tctl connects to the Proxy Service, which forwards traffic to and from the Teleport Auth Service. Update 443 to 3025 if you are contacting the Auth Service directly with tctl:

      tctl status --auth-server=teleport.example.com:443

      For tsh commands that read an identity file, you must pass the --proxy flag, which points tsh to the address of the Teleport Proxy Service:

      tsh status --proxy=teleport.example.com

      Ensure 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-server or --proxy flags to all subsequent tctl and tsh commands.

    If you can connect to the cluster and run the tctl status command, you can use your current credentials to run subsequent tctl commands from your workstation. If you host your own Teleport cluster, you can also run tctl commands 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:

  1. Sign in to the Teleport cluster from your administrative workstation.

  2. Generate an invitation token for the Linux Desktop Service:

    tctl tokens add --type=linux_desktop --format=text > /tmp/token

    Copy /tmp/token to the target Linux host

  3. Verify that Teleport is installed on the Linux host:

    teleport version

    If Teleport isn't installed, follow the appropriate Installation instructions for your environment.

  4. Configure /etc/teleport.yaml on 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: false
    

    Set proxy_server to the address of your Teleport cluster.

  5. (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
    
  6. (Optional) Filter the desktop sessions available to users. Teleport discovers available session types from .desktop files in /usr/share/xsessions. You can restrict which sessions are offered using regular expressions matched against the session name (the filename without the .desktop extension):

    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 included pattern is applied first. If set, only sessions whose name matches the pattern are offered. The excluded pattern is applied next and removes sessions whose name matches it.

  7. Start the Teleport Linux Desktop Service. The instructions depend on how you installed the Teleport Linux Desktop Service and whether your system supports 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 teleport
    sudo systemctl start teleport

    You can check the status of the Teleport Linux Desktop Service with systemctl status teleport and view its logs with journalctl -fu teleport.

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 Xvfb is available in PATH:

    sudo -i which Xvfb

    If the command returns no output, Xvfb is not installed. See the Prerequisites section above for installation instructions.

  • Confirm that at least one .desktop file 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:

  1. Sign in to the Teleport cluster from your administrative workstation.

  2. Create a linux-desktop-admins.yaml file 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_labels to 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_logins to the Linux user accounts that members of this role can connect as. The specified user must already exist on the Linux host.
  3. Apply the new role to your cluster:

    tctl create -f linux-desktop-admins.yaml
    tip

    You 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.

  4. Assign the linux-desktop-admins role 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:

    1. Retrieve your local user's roles as a comma-separated list:

      ROLES=$(tsh status -f json | jq -r '.active.roles | join(",")')
    2. 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"
    3. Sign out of the Teleport cluster and sign in again to assume the new role.

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:

  1. Sign in to the Teleport cluster using an account assigned the linux-desktop-admins role.

  2. Select Resources.

  3. Click Type, then select Desktops.

  4. 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-admins role (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 PATH on the Linux host.

  • Check that at least one session type is available after applying your xsessions filters: review /usr/share/xsessions/ and compare against the included/excluded patterns 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