{"token_count": 4987}

# Configure Access for Linux Desktops

This guide demonstrates how to configure Teleport to provide secure, audited access to Linux desktops running X11 desktop environments.

Linux desktop access is available for Teleport v18.11.0 and later.

## 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](https://www.x.org/releases/X11R7.6/doc/man/man1/Xvfb.1.xhtml) (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](https://goteleport.com/signup) for a free trial or [set up a demo environment](https://goteleport.com/docs/get-started/deploy-community.md).

- 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:

     **Mac/Linux**

     ```
     $ TELEPORT_DOMAIN=teleport.example.com:443
     $ TELEPORT_VERSION="$(curl -s https://$TELEPORT_DOMAIN/v1/webapi/find | jq -r '.server_version')"
     ```

     **Windows - Powershell**

     ```
     $ $TELEPORT_DOMAIN = "teleport.example.com:443"
     $ $TELEPORT_VERSION = (Invoke-RestMethod -Uri "https://${TELEPORT_DOMAIN}/v1/webapi/find").server_version
     ```

  2. Follow the instructions for your platform to install `tctl` and `tsh` clients:

     **Mac**

     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.

     ---

     **Windows - Powershell**

     ```
     $ curl.exe -O https://cdn.teleport.dev/teleport-v$TELEPORT_VERSION-windows-amd64-bin.zip
     Unzip 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.
     ```

     **Linux**

     All of the Teleport binaries in Linux installations include the `tctl` and `tsh` clients. For more options (including RPM/DEB packages and downloads for i386/ARM/ARM64) see our [installation page](https://goteleport.com/docs/installation/single-machine.md).

     ```
     $ curl -O https://cdn.teleport.dev/teleport-v${TELEPORT_VERSION?}-linux-amd64-bin.tar.gz
     $ tar -xzf teleport-v${TELEPORT_VERSION?}-linux-amd64-bin.tar.gz
     $ cd teleport
     $ sudo ./install
     Teleport 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 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:

  **Debian/Ubuntu**

  ```
  $ sudo apt-get install xvfb
  ```

  **Fedora/RHEL/CentOS/Amazon Linux**

  ```
  $ sudo dnf install xorg-x11-server-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\@example.com 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@example.com
     $ tctl status
     Cluster  teleport.example.com
     Version  18.11.0
     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](https://goteleport.com/docs/machine-workload-identity/getting-started.md) 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](https://goteleport.com/docs/installation/single-machine/linux.md) 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:

   **Package Manager**

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

   **TAR Archive**

   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.service
   $ 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`.

   **No systemd**

   On the host where you will run the Teleport Linux Desktop Service, start Teleport:

   ```
   $ sudo teleport start --config=/etc/teleport.yaml
   ```

   Teleport runs in the foreground and outputs logs for the services it is running.

---

**CHECKPOINT: Verify the Linux Desktop Service is running**

Before proceeding, verify: Confirm that the Teleport Linux Desktop Service has started and connected to your cluster.

If the check fails, troubleshoot:

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

---

## 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:

   **Local 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.

   **GitHub**

   1. Open your `github` authentication connector in a text editor:

      ```
      $ tctl edit github/github
      ```

   2. Edit the `github` connector, adding `linux-desktop-admins` to the `teams_to_roles` section.

      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

      ```

   3. Apply your changes by saving and closing the file in your editor.

   4. Sign out of the Teleport cluster and sign in again to assume the new role.

   **SAML**

   1. Retrieve your `saml` configuration resource:

      ```
      $ tctl get --with-secrets saml/mysaml > saml.yaml
      ```

      Note that the `--with-secrets` flag adds the value of `spec.signing_key_pair.private_key` to the `saml.yaml` file. Because this key contains a sensitive value, you should remove the saml.yaml file immediately after updating the resource.

   2. Edit `saml.yaml`, adding `linux-desktop-admins` to the `attributes_to_roles` section.

      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

      ```

   3. Apply your changes:

      ```
      $ tctl create -f saml.yaml
      ```

   4. Sign out of the Teleport cluster and sign in again to assume the new role.

   **OIDC**

   1. Retrieve your `oidc` configuration resource:

      ```
      $ tctl get oidc/myoidc --with-secrets > oidc.yaml
      ```

      Note that the `--with-secrets` flag adds the value of `spec.signing_key_pair.private_key` to the `oidc.yaml` file. Because this key contains a sensitive value, you should remove the oidc.yaml file immediately after updating the resource.

   2. Edit `oidc.yaml`, adding `linux-desktop-admins` to the `claims_to_roles` section.

      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

      ```

   3. Apply your changes:

      ```
      $ tctl create -f oidc.yaml
      ```

   4. Sign out of the Teleport cluster and sign in again to assume the new role.

   **Non-Interactive**

   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:

   1. 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
      ```

   2. Force `tbot` to regenerate the certificate:

      ```
      $ pkill -HUP tbot
      ```

      The bot will also generate a certificate with the new role on its next renewal.

   Otherwise, update your user and regenerate your identity file:

   1. 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(",")')
      ```

   2. Edit your local user to add the new role:

      ```
      $ tctl users update username \
        --set-roles "${ROLES?},linux-desktop-admins"
      ```

   3. 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:

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**

Before proceeding, verify: Confirm that you can connect to the Linux desktop and see the desktop environment.

If the check fails, troubleshoot:

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
  ```

---

## Next steps

- To learn more about controlling who can access which desktops, see [Role-Based Access Control for Desktops](https://goteleport.com/docs/enroll-resources/desktop-access/rbac.md).
- To configure session recording options, see [Session Recording and Playback](https://goteleport.com/docs/enroll-resources/desktop-access/reference/sessions.md).
- For a full list of `linux_desktop_service` configuration options, see the [Desktop Access Configuration Reference](https://goteleport.com/docs/enroll-resources/desktop-access/reference/configuration.md).
