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