So einfach holst du dir dein Homelab in den Browser | Teleport

So einfach holst du dir dein Homelab in den Browser | Teleport

Übersicht

Wer schon einmal versucht hat, sein Homelab von unterwegs zu erreichen oder zu administrieren, kennt die typischen Hürden: VPN-Zugänge einrichten, Ports freigeben oder zusätzliche Tools installieren. Mit Teleport gibt es jedoch eine elegante Lösung, die genau hier ansetzt. Das Tool ermöglicht einen sicheren und unkomplizierten Zugriff auf Server, Container oder ganze Infrastrukturen, direkt über den Browser. In diesem Artikel schauen wir uns an, wie wir Teleport selbst hosten, um jederzeit flexibel und ortsunabhängig mit unserem Homelab arbeiten zu können.

Das Video zum Beitrag findet ihr hier: https://youtu.be/8PsiEvMY-Bk


Installation

Docker

Da wir Teleport mit Docker betreiben möchten, installieren wir als Erstes natürlich Docker selbst, falls noch nicht geschehen. Das können wir ganz einfach mit dem offiziellen Convenience Script von Docker machen.

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

Verzeichnis

Bevor wir fortfahren, müssen wir uns ein geeignetes Verzeichnis erstellen, wo wir Teleport später laufen lassen wollen. Ich habe meine Docker Compose Stacks immer gerne unter /opt. Darunter erstelle ich einen neuen Ordner für Teleport und die darin benötigten Unterordner mit folgendem Befehl:

sudo mkdir -p ./teleport ./teleport/config ./teleport/data && cd ./teleport

Docker Compose

Als Nächstes benötigen wir das Docker Compose File für Teleport. Dafür habe ich ein Template vorbereitet, das gerne übernommen werden kann. Es gibt verschiedene Varianten, wie Teleport deployed werden kann.

In diesem Fall zeige ich euch das Setup mit Caddy als Reverse Proxy, da dieses Setup in den meisten Fällen angewendet werden kann.

name: teleport
services:
  teleport:
    image: public.ecr.aws/gravitational/teleport-distroless:18.2.0
    hostname: teleport.juseclab.de # beliebiger Hostname
    container_name: teleport
    ports:
      - "3023:3023" # Teleport Connect Client
      - "3024:3024" # SSH Clients
    volumes:
          - ./config:/etc/teleport
          - ./data:/var/lib/teleport
    restart: unless-stopped
  
  caddy:
    build: .
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - ./caddy_data:/data
      - ./caddy_config:/config
    restart: unless-stopped

Dockerfile

Da ich in dem Setup keinen Server habe, der von 443/80 erreichbar ist, benötige ich noch ein Dockerfile für die DNS-Challenge mit Caddy.

FROM caddy:2-builder AS builder

RUN xcaddy build \
    --with github.com/caddy-dns/cloudflare # Gebt hier eure Repository für den Anbieter ein

FROM caddy:2

COPY --from=builder /usr/bin/caddy /usr/bin/caddy

Anschließend bauen wir Caddy mit dem DNS-Addon. Mehr Infos dazu hier.

sudo docker build -t caddy-dns .

Caddyfile

Als Nächstes erstellen wir unser Caddyfile und geben die Domain an, die wir gerne für Teleport verwenden möchten. Wichtig ist hierbei, dass wir für den Eintrag die TLS-Verifizierung ausschalten, da Teleport ein Self-Signed-Zertifikat ausstrahlt.

{
  acme_dns cloudflare <api key>
}

*.juseclab.de {
  reverse_proxy https://teleport:3080 {
    transport http {
      tls_insecure_skip_verify  # muss gemacht werden, weil Teleport selber ein self-signed cert ausstrahlt
    }
  }
}

Teleport Konfigurationsdatei

Als Letztes fehlt uns nur noch die Konfigurationsdatei für Teleport selber. Hier setzen wir alle wichtigen Einstellungen für Teleport. Eine Übersicht über alle Settings, die verwendet werden können, findet ihr hier.

Die Konfigurationsdatei speichern wir unter /teleport/config.

teleport:
  nodename: teleport
  data_dir: /var/lib/teleport
  log:
    output: stderr
    severity: INFO

auth_service:
  enabled: true
  cluster_name: jusec-teleport
  authentication:
    type: local
    second_factor: on  # Alternativen: webauthn, on, off
    # optional:
    webauthn:
      rp_id: teleport.juseclab.de

proxy_service:
  enabled: true
  web_listen_addr: 0.0.0.0:3080 # Web Access
  tunnel_listen_addr: 0.0.0.0:3024 # Für SSH Clients benötigt
  listen_addr: 0.0.0.0:3023 # Für Teleport Connect Client, wenn gewünscht
  public_addr: ["teleport.juseclab.de:443"] 

ssh_service:
  enabled: false

Start

Wir haben alles soweit konfiguriert und sind bereit für den ersten Start unserer neuen Teleport-Instanz.

sudo docker compose up -d

Erste Schritte

Nach kurzem Warten ist unser Compose Stack gestartet und wir sollten Teleport unter unserer gewünschten Domain erreichen.

Teleport Login

Benutzer erstellen

Damit wir uns anmelden können, müssen wir uns einen Benutzer erstellen. Dafür interagieren wir mit dem Teleport-Container und generieren uns einen Einladungslink für Teleport.

sudo docker exec -it teleport tctl users add jusec --roles=editor,access,auditor

Beim Link angekommen, können wir uns nun entweder ein Passwort hinterlegen oder via "Go Passwordless" direkt einen Passkey hinterlegen.


Ressourcen

Nachdem Teleport grundlegend eingerichtet ist, können wir unsere ersten Ressourcen hinzufügen, die wir dann später über Teleport bedienen können.

Ich zeige euch in diesem Abschnitt beispielhaft, wie ihr die gängigsten Ressourcen hinzufügen könnt. Es gibt aber für alle Ressourcen auch sehr gute Dokumentationen, falls andere Arten für euch ebenfalls interessant sind.

Windows

Starten wir mit Windows. Hier gibt es 2 Varianten, wie wir Geräte hinzufügen können. Entweder haben wir einzelne Computer im Netzwerk, die wir hinzufügen, oder ein Active Directory, in dem Computer & Server enthalten sind.

Wir schauen uns einmal die Einrichtung für lokale Windows-Geräte an, für das Active Directory erfordert das ein wenig mehr Konfiguration und wenige Leute haben ein aktives AD zuhause laufen.

Windows Computer/Server

Um ein Gerät hinzuzufügen, laden wir vom Teleport-Server das entsprechende Zertifikat herunter, das später für die Authentifizierung genutzt wird, und führen ein Tool aus, das die Einrichtung für uns übernimmt.

Auf der Dokumentationsseite können wir uns unsere benötigte URL generieren bzw. könnt ihr einfach die URL unten anpassen.

curl.exe -fo teleport.cer https://teleport.juseclab.de/webapi/auth/export?type=windows

Den Befehl führen wir im Terminal auf unserem Host, den wir hinzufügen wollen, aus.

Als Nächstes laden wir mit folgendem Befehl das Tool von Teleport herunter, das die komplette Einrichtung auf dem Host für uns übernimmt bzw. das Zertifikat an die richtige Stelle packt.

curl.exe -fo teleport-windows-auth-setup-v18.2.0-amd64.exe https://cdn.teleport.dev/teleport-windows-auth-setup-v18.2.0-amd64.exe

Um nun alles einzurichten, führen wir den folgenden zweiten Befehl aus. Dieser startet ein Setup-Programm, das unter anderem das Zertifikat an die richtige Stelle packt.

Das Zertifikat & die exe liegen nun in dem Verzeichnis, in dem wir es heruntergeladen haben, dort führen wir jetzt die exe aus.

Das Fenster, das sich öffnet, bestätigen wir mit OK.

Im geöffneten Explorer wählen wir jetzt das heruntergeladene Teleport-Zertifikat aus.

Anschließend werden wir noch darauf hingewiesen, dass das System neu gestartet werden muss, was wir mit OK bestätigen können, um den Rechner neu starten zu lassen.

Nach dem Restart ist auf dem Computer alles getan. Wir müssen jetzt nur noch die teleport.yaml anpassen.

teleport.yaml

Damit das Gerät nun in Teleport als Ressource angezeigt wird, müssen wir in der teleport.yaml eine weitere Sektion für Windows hinzufügen und den Host hinterlegen.

Wichtig ist, dass der Hostname exakt dem Hostnamen des Systems entsprechen muss!

windows_desktop_service:
  enabled: true
  listen_addr: 0.0.0.0:3028
  static_hosts:
  - name: jusec-Server001
    ad: false
    addr: 10.30.40.2

Anschließend starten wir Teleport einmal neu.

sudo docker compose down && sudo docker compose up -d

Jetzt sehen wir die Ressource schon mal in Teleport. Allerdings haben wir noch keinen Benutzer, den wir für die Anmeldung verwenden können. Dafür muss erst eine Rolle erstellt werden.

Berechtigungsrolle

Damit wir uns via Teleport auf die Ressource verbinden können, müssen wir in Teleport selber noch eine entsprechende Rolle erstellen & unseren Benutzer damit versehen.

Als Erstes vergeben wir einen Namen, eine Beschreibung und geben die Label an, die damit abgedeckt werden sollen. Da ich keine verwende, nehme ich *, was für alle steht.

Bei dem Reiter Resources fügen wir Windows Desktop Access hinzu, wählen nochmal unsere Label, mit denen wir die Rolle auf verschiedene Ressourcen aufteilen könnten, und geben die Logins ein, die wir auf den Windows-Systemen verwenden möchten.

Bei den Logins nehmt ihr lokale Benutzer, die auf den Systemen sind, und tragt einfach den Namen ein.

Die restlichen Reiter können beim Standard belassen werden.

Jetzt weisen wir die Rolle unserem Benutzer zu.

Nachdem wir das gemacht haben, loggen wir uns einmal aus und wieder ein und sehen dann die Benutzer zur Auswahl.

Verbinden

Klicken wir auf einen Benutzernamen, werden wir mit dem System über unseren Browser verbunden.


Linux

Eine Linux-Ressource hinzuzufügen, benötigt weniger Schritte und es gibt ein "geführtes" Setup dafür. Wir gehen zuerst auf "Enroll New Resource" und suchen, in meinem Fall, Ubuntu.

Im ersten Schritt können wir auch hier Label hinzufügen, ich überspringe das in dem Fall aber einfach.

Im 2. Schritt erhalten wir einen Befehl, den wir auf dem System, das wir hinzufügen wollen, ausführen müssen. Nach dem Ausführen meldet sich das System dann bei Teleport und wir können mit der Einrichtung fortfahren.

Jetzt geben wir auch hier Benutzer an, die es auf dem System gibt und mit denen wir uns dort anmelden wollen.

Verbinden

Die Ressource wird in der Übersicht angezeigt und wir können unseren gewünschten User auswählen.

Klicken wir auf den Benutzer, öffnen wir eine neue Session und können auf das System via CLI zugreifen. Außerdem haben wir eine Download- & Upload-Funktion.


Web App

Natürlich haben wir auch die Möglichkeit, ein Webinterface über Teleport erreichbar zu machen. Das können wir bspw. nutzen, um an ein OPNSense-Interface zu kommen oder bspw. auf unser Proxmox-Cluster zuzugreifen.

Um das hinzuzufügen, müssen wir einfach nur in der teleport.yaml eine weitere Sektion hinzufügen und die gewünschten URLs hinterlegen.

Als Beispiel hinterlegen wir das Webinterface von Proxmox. Die Variable insecure_skip_verify: true ist wichtig, da Proxmox ein Self-Signed Cert nutzt, welches Teleport nicht vertraut.

app_service:
  enabled: true
  apps:
  - name: pve
    uri: "https://10.30.0.2:8006"
    public_addr: "pve.juseclab.de"
    insecure_skip_verify: true
    labels:
      env: "web"

Nachdem wir den Block hinzugefügt haben, starten wir Teleport einmal neu.

sudo docker compose down && sudo docker compose up -d

Wir sehen in den Ressourcen jetzt auch unser Proxmox und können eine Session starten.


Teleport Connect

Als Letztes noch ein kleiner Tipp bzw. Hinweis. Als Alternative zum Browser bietet Teleport einen Client, den ihr bspw. auf eurem Laptop installieren könnt. Dieser ermöglicht euch dieselben Funktionen wie im Browser, nur über ein extra Programm. Außerdem habt ihr hier noch ein paar extra Features durch das Aufbauen von Tunneln.

Den Client findet ihr für alle Plattformen zum Download hier.

Client in Aktion