Featured image of post Sicherer Zugriff auf deine Hybrid-Cloud: Alles über SSH-Tunneling

Sicherer Zugriff auf deine Hybrid-Cloud: Alles über SSH-Tunneling

Dieser Beitrag behandelt die Implementierung von SSH-Tunneling in hybriden Cloud-Umgebungen. Erfahre, wie du mit SSH-Tunneling deine Dienste sicher und effizient verbinden kannst, und entdecke bewährte Methoden, um deine Homelab-Umgebung zu optimieren.

Die Hybrid-Cloud-Serie für dein Homelab bietet eine umfassende Anleitung zur Einrichtung einer sicheren, flexiblen und skalierbaren Homelab-Umgebung. Jeder Beitrag behandelt einen spezifischen Schritt, von der Hardware-Auswahl über Automatisierung und Containerisierung bis hin zu Bereitstellung von Applikationen wie Nextcloud oder Home-Assistant.

  1. Hybrid Cloud: Die ideale Kombination aus Flexibilität, Sicherheit und Skalierbarkeit für dein Homelab
  2. Ansible in der Hybrid-Cloud: Der Weg zur effizienten Automatisierung
  3. Containerisierung mit Docker: Die ideale Grundlage für dein Homelab
  4. Caddy als Reverse Proxy: Sichere deine Hybrid-Cloud
  5. Authentik in der Hybrid-Cloud: Zentrale Authentifizierung leicht gemacht
  6. Sicherer Zugriff auf deine Hybrid-Cloud: Alles über SSH-Tunneling

Sicherer Zugriff auf deine Hybrid-Cloud: Alles über SSH-Tunneling

SSH (Secure Shell) ist ein kryptographisches Netzwerkprotokoll, das sichere Kommunikation über unsichere Netzwerke ermöglicht. Es wird häufig verwendet, um sicheres Remote-Login, Dateiübertragungen und verschlüsselte Verbindungen für verschiedenste Anwendungen bereitzustellen. Die Stärke von SSH liegt in der Authentifizierung durch Schlüsselpaare und der Verschlüsselung des Datenverkehrs, was es zu einer unverzichtbaren Technologie für sichere Verbindungen macht. SSH ist nicht nur vielseitig, sondern auch leicht anpassbar, was es zu einer bevorzugten Lösung für viele sicherheitskritische Anwendungen macht. Im letzten Beitrag Authentik in der Hybrid-Cloud: Zentrale Authentifizierung leicht gemacht haben wir bereits gezeigt, wie zentrale Authentifizierung und Zugriffskontrolle in hybriden Cloud-Umgebungen gestaltet werden können. Dieser Artikel knüpft daran an, indem er zeigt, wie SSH-Tunneling zur sicheren Verbindung von Diensten eingesetzt werden kann.

Die zunehmende Digitalisierung und Verlagerung von Diensten in hybride Cloud-Umgebungen stellt Unternehmen und Privatpersonen vor neue Herausforderungen. Insbesondere die sichere und effiziente Verbindung zwischen lokalen Netzwerken und Cloud-Ressourcen ist dabei essenziell. Hier bietet SSH-Tunneling eine pragmatische und zugleich effektive Lösung. Es verbindet die Sicherheit und Flexibilität von SSH mit der Notwendigkeit, spezifische Dienste oder Anwendungen über Netzwerkgrenzen hinweg bereitzustellen.

Darüber hinaus zeichnet sich SSH-Tunneling durch seine einfache Implementierung aus. Im Gegensatz zu komplexen VPN-Lösungen oder cloud-nativen Diensten ist für die Einrichtung von SSH-Tunneln meist nur ein grundlegendes Verständnis von SSH erforderlich. Dies macht es zu einer zugänglichen Option, selbst für kleinere Teams oder Einzelpersonen, die keine umfangreiche Infrastruktur verwalten möchten.

In diesem Dokument widmen wir uns der Anwendung von SSH-Tunneling in hybriden Cloud-Szenarien, insbesondere im Kontext eines Homelabs und eines Reverse Proxies in der Cloud. Ziel ist es, eine umfassende Grundlage für die Nutzung von SSH-Tunneling zu legen und die Möglichkeiten, Grenzen sowie bewährte Vorgehensweisen aufzuzeigen.

Grundlagen: SSH zu SSH-Tunneling

SSH-Tunneling ist eine Erweiterung von SSH, die es ermöglicht, Netzwerkdienste sicher durch verschlüsselte Verbindungen zu leiten. Diese Funktion erlaubt es, Dienste aus entfernten Netzwerken zugänglich zu machen, ohne deren Sicherheit zu gefährden. Durch SSH-Tunneling können Verbindungen gezielt für einzelne Dienste erstellt werden, was es besonders effizient und ressourcenschonend macht. Es wird häufig verwendet, um Anwendungen wie Datenbanken oder Webdienste sicher zu übertragen, ohne dass zusätzliche komplexe Netzwerkkonfigurationen erforderlich sind.

In diesem Kapitel zeigen wir, wie SSH-Tunneling genutzt wird, um Dienste aus dem Homelab sicher mit einem Reverse Proxy in der Cloud zu verbinden. Dies ermöglicht geschützten Zugriff auf Anwendungen wie Nextcloud oder Home Assistant und vereinfacht die Integration in bestehende hybride Cloud-Umgebungen.

Alternativen zu SSH-Tunneling

Bevor wir auf die Vorteile von SSH-Tunneling eingehen, lohnt es sich, einige Alternativen zu betrachten, die in ähnlichen Szenarien eingesetzt werden können:

  • VPN (Virtual Private Network): VPNs verschlüsseln den gesamten Netzwerkverkehr und bieten umfassende Netzwerkintegration. Sie sind jedoch komplexer einzurichten und ressourcenintensiver. Für Umgebungen, in denen vollständige Netzwerktransparenz erforderlich ist, können sie eine geeignete Option sein.
  • Reverse Proxies: Tools wie Caddy oder Nginx können externe Anfragen an interne Dienste weiterleiten, bieten aber keine direkte Verschlüsselung zwischen zwei Endpunkten. Sie sind jedoch ideal, wenn Dienste öffentlich zugänglich gemacht werden müssen.
  • Cloud-native Dienste: Plattformen wie AWS oder Azure bieten Lösungen wie Application Gateways oder Private Links, die ähnliche Funktionalitäten bieten. Diese erfordern jedoch spezielles Wissen und sind oft mit höheren Kosten verbunden.

Warum SSH-Tunneling?

SSH-Tunneling bietet mehrere Vorteile, die es in vielen Szenarien zur bevorzugten Wahl machen:

  • Sicherheit: Der gesamte Datenverkehr wird durch die Verschlüsselung vor unbefugtem Zugriff geschützt. Dies stellt sicher, dass sensible Informationen wie Passwörter oder Geschäftsdaten geschützt bleiben.
  • Flexibilität: SSH-Tunneling ermöglicht gezielten Zugriff auf spezifische Dienste, ohne das gesamte Netzwerk freizugeben. Dies reduziert das Risiko von Angriffen erheblich.
  • Kein NAT oder Firewall-Anpassungen: Da die Verbindung vom SSH-Client initiiert wird, sind keine Änderungen an der Firewall oder NAT erforderlich. Dies vereinfacht die Konfiguration erheblich.
  • Einfache Einrichtung: Es ist schnell und unkompliziert im Vergleich zu komplexeren VPN-Lösungen. Selbst in großen Umgebungen kann SSH-Tunneling ohne großen Aufwand implementiert werden.
  • Ressourcenschonend: SSH-Tunnel benötigen weniger Ressourcen als vollständige VPN-Verbindungen. Sie sind daher ideal für ressourcenbeschränkte Umgebungen.

Typen von SSH-Tunneling

In unserer Hybrid-Cloud-Architektur, bestehend aus einem Homelab mit internen Diensten und einem Cloud-Server für öffentlich zugängliche Dienste, kommen zwei Haupttypen von SSH-Tunneling zum Einsatz:

  1. Lokales Port-Forwarding:

    • Der SSH-Client initiiert die Verbindung zum SSH-Server und leitet einen Port des Remote-Servers auf den lokalen Rechner weiter. So wird der Dienst des Remote-Servers lokal verfügbar gemacht, was besonders nützlich für die Verwaltung von internen Diensten ist.
    • Beispiel: Zugriff auf eine interne MySQL-Datenbank im Homelab. Der SSH-Tunnel leitet den Port 3306 des Homelab-Servers auf den lokalen Rechner, sodass auf die Datenbank mit localhost:3306 zugegriffen werden kann. Keine Änderungen an NAT- oder Firewall-Regeln sind notwendig.
  2. Remote Port-Forwarding:

    • Der SSH-Client leitet einen lokalen Dienst über den SSH-Server bereit. Dies macht interne Homelab-Dienste aus dem Internet zugänglich und ist ideal für Anwendungen, die von extern erreichbar sein müssen.
    • Beispiel: Bereitstellung eines Nextcloud-Servers im Homelab. Der Homelab-Server initiiert die Verbindung, und der Cloud-Server leitet Anfragen aus dem Internet an den internen Nextcloud-Dienst weiter.

In unserer Hybrid-Cloud-Umgebung setzen wir primär auf Remote Port Forwarding, um Dienste aus dem Homelab über den Cloud-Server bereitzustellen. Diese Dienste werden zusätzlich durch Caddy und Authentik abgesichert. Alternativ kann Lokales Port Forwarding genutzt werden, um ausgewählte Cloud-Dienste ins Homelab zu spiegeln und sicher aus dem internen Netzwerk zu verwalten.

Erzeugung von SSH-Schlüsselpaaren

SSH-Schlüsselpaare sind der Kern einer sicheren und passwortlosen Authentifizierung in SSH. Ein Schlüsselpaar besteht aus einem privaten und einem öffentlichen Schlüssel:

  • Privater Schlüssel: Wird geheim gehalten und dient zum Nachweis der Identität.
  • Öffentlicher Schlüssel: Wird auf dem Zielserver hinterlegt und dient zur Authentifizierung des privaten Schüssels.

Warum Schlüsselpaare verwenden?

Schlüsselpaare bieten mehrere Vorteile:

  • Erhöhte Sicherheit: Im Gegensatz zu Passwörtern, die durch Brute-Force-Angriffe kompromittiert werden können, sind Schlüsselpaare aufgrund ihrer Länge und Kryptographie robuster.
  • Bequemlichkeit: Nach der Einrichtung sind keine Passworteingaben mehr erforderlich, was die Nutzung erleichtert.

Schlüssel generieren

Die Erstellung eines SSH-Schlüsselpaars erfolgt in der Regel mit dem Befehl ssh-keygen:

  1. Befehl ausführen:

    1
    
    ssh-keygen -t ed25519 -C "your_email@example.com"
    
    • -t ed25519: Gibt den Schüsseltyp an (empfohlen, da Ed25519 schneller und sicherer ist).
    • -C: Ein Kommentar, um den Schlüssel zu identifizieren (z. B. Ihre E-Mail-Adresse).
  2. Pfad wählen: Standardmäßig werden Schlüssel unter ~/.ssh/id_ed25519 gespeichert. Sie können jedoch einen eigenen Pfad angeben.

  3. Passphrase setzen: Sie können eine Passphrase eingeben, um den privaten Schlüssel zusätzlich zu sichern. Dies ist besonders nützlich, falls der Schlüssel kompromittiert wird.

Schlüssel übertragen

Der öffentliche Schlüssel muss auf dem Zielserver hinterlegt werden, um eine reibungslose Authentifizierung zu gewährleisten. Dies kann manuell oder automatisiert erfolgen:

  1. Manuelle Übertragung: Kopieren Sie den Inhalt der Datei id_ed25519.pub und fügen Sie ihn in die Datei ~/.ssh/authorized_keys des Zielservers ein. Dies erfordert, dass Sie direkten Zugriff auf den Server haben.

    1
    
    cat ~/.ssh/id_ed25519.pub | ssh user@remote_host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
    

    Dieser Einzeiler sorgt dafür, dass die Berechtigungen der Datei korrekt gesetzt werden.

  2. Automatisierte Übertragung mit ssh-copy-id: Dieses Werkzeug vereinfacht die Übertragung erheblich:

    1
    
    ssh-copy-id user@remote_host
    

    Es prüft, ob der Schlüssel korrekt übertragen wurde und setzt die notwendigen Berechtigungen.

In dieser Beitragsreihe werden wir darüber hinaus erkunden, wie wir mithilfe von Ansible das Schlüsselpaar sicher verwahren und beiden Teilnehmern der Kommunikation bereitstellen können. Ansible ermöglicht dabei eine zentrale Verwaltung und Automatisierung der Schlüsselbereitstellung, was besonders in größeren Umgebungen von Vorteil ist.

Implementierung eines SSH-Servers mit Ansible und Docker Compose

SSH-Tunnel in Hybrid Cloud

In hybriden Cloud-Umgebungen spielt der SSH-Server eine zentrale Rolle, um sichere und kontrollierte Verbindungen zwischen verschiedenen Systemen zu ermöglichen. Insbesondere für Homelab-Umgebungen bietet er eine effiziente Möglichkeit, Dienste sicher bereitzustellen und Verbindungen über Public-Key-Authentifizierung zu sichern.

Das Ziel dieses Beitrags ist es, eine umfassende Anleitung zur Implementierung eines SSH-Servers mithilfe von Ansible und Docker Compose bereitzustellen. Diese Methode ermöglicht eine einfache Bereitstellung, zentrale Verwaltung und sichere Konfiguration. Wir werden sowohl die Einrichtung des Servers als auch die Integration von Remote Port-Forwarding und Reverse Proxy behandeln, um eine nahtlose Verbindung zwischen internen und externen Netzwerken zu schaffen.

Am Ende dieses Beitrags wirst du in der Lage sein:

  • Einen sicheren SSH-Server zu implementieren.
  • Public-Key-Authentifizierung für maximalen Schutz einzurichten.
  • Den SSH-Server in eine hybride Cloud-Architektur zu integrieren.

Verzeichnisstruktur und Organisation

Die Verzeichnisstruktur einer Ansible-Rolle kann effizient mit dem Befehl ansible-galaxy init erstellt werden. Dieser Befehl generiert automatisch die standardisierte Struktur für Rollen, einschließlich der Verzeichnisse defaults, files, meta, und tasks. Durch diese Automatisierung wird sichergestellt, dass die Rolle von Anfang an den Best Practices entspricht und leicht erweiterbar bleibt.

Im Kontext dieser Rolle nutzen wir die folgende Struktur:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
roles/
└── ssh-server/
    ├── defaults/
    │   └── main.yml
    ├── files/
    │   ├── public_keys/
    │   │   ├── key1
    │   │   └── key2
    │   └── docker-compose.yml
    ├── meta/
    │   └── main.yml
    └── tasks/
        └── main.yml

Die Verzeichnisstruktur der Rolle sorgt für eine klare Trennung zwischen Konfiguration, Aufgaben und statischen Dateien. Dies erleichtert die Erweiterbarkeit und Wiederverwendbarkeit.

Variablen: Zentrale Steuerung der Rolle

Die Datei defaults/main.yml enthält die zentralen Variablen:

1
ssh_server_directory: "{{ services_directory }}/ssh-server"
  • ssh_server_directory: Definiert das zentrale Verzeichnis für die Rolle, in dem alle relevanten Dateien wie Konfigurationsdateien und Schlüssel abgelegt werden.

Konfigurationsdateien und Public-Key-Management

Im Verzeichnis files/ befinden sich alle statischen Dateien, die für die Rolle benötigt werden. Dazu gehört unter anderem die Datei docker-compose.yml:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
version: '3.8'
services:
  ssh-server:
    image: linuxserver/openssh-server
    container_name: ssh-tunnel
    restart: unless-stopped
    user: "${UID}:${GID}"
    environment:
      - PUID=${UID}
      - PGID=${GID}
      - TZ=Europe/Berlin
      - PUBLIC_KEY_DIR=/config/public_keys
      - SUDO_ACCESS=false
      - PASSWORD_ACCESS=false
      - USER_NAME=homelab_user
      - LOG_STDOUT=true
    ports:
      - "8324:2222"
    volumes:
      - ./public_keys:/config/public_keys
    networks:
      - internal_services
      - external

networks:
  external:
  nextcloud_services:
    internal: true

Die Konfiguration sorgt für eine sichere Einrichtung, indem nur Public-Key-Authentifizierung erlaubt wird.

Meta-Informationen und Abhängigkeiten

In der Datei meta/main.yml werden die Abhängigkeiten definiert:

1
2
dependencies:
  - role: docker

Die docker-Rolle sorgt dafür, dass Docker installiert ist, bevor der SSH-Server bereitgestellt wird.

Aufgaben: SSH-Server einrichten

Die Datei tasks/main.yml definiert die einzelnen Schritte zur Bereitstellung:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
- name: Ensure directory exists
  file:
    path: "{{ ssh_server_directory }}"
    state: directory

- name: Copy docker-compose file
  copy:
    src: files/docker-compose.yml
    dest: "{{ ssh_server_directory }}/docker-compose.yml"

- name: Deploy SSH Server with Docker Compose
  community.docker.docker_compose_v2:
    project_src: "{{ ssh_server_directory }}"
    remove_orphans: true
    state: present
  environment:
    UID: "{{uid}}"
    GID: "{{gid}}"

- name: Configure reverse proxy
  blockinfile:
    path: "{{ caddy_reverse }}"
    marker: "# {mark} SSH SERVER"
    block: |
      ssh.deinedomain.de {
        reverse_proxy ssh-tunnel:44512
      }      
  notify:
    - Reload Caddy

Diese Schritte stellen sicher, dass der SSH-Server korrekt konfiguriert wird und nahtlos in die Hybrid-Cloud integriert werden kann.

Integration in den Reverse Proxy

Durch die Integration des SSH-Servers in den Reverse Proxy über Caddy wird ein sicherer Zugang zu internen Diensten geschaffen. Dies mag im ersten Moment abstrakt wirken, doch mit der Einrichtung eines echten Dienstes wie Nextcloud wird deutlich, wie der Zusammenhang zwischen dem Tunnel und der Bereitstellung von Nextcloud über Caddy hergestellt wird. Zusätzlich ermöglicht der Handler “Reload Caddy” eine dynamische Aktualisierung der Konfiguration, wodurch Änderungen nahtlos übernommen werden können.

Fazit und Ausblick

Mit der hier beschriebenen Rolle kann ein sicherer SSH-Server effizient eingerichtet und verwaltet werden. Die Kombination aus Ansible und Docker Compose bietet eine flexible und skalierbare Lösung, die sowohl für Homelabs als auch für professionelle hybride Cloud-Umgebungen geeignet ist. Dieser Beitrag hat die Grundlagen gelegt, um sichere Verbindungen zwischen verschiedenen Standorten zu schaffen und eine robuste Infrastruktur für die Hybrid-Cloud aufzubauen.

Im nächsten Beiträgen der Serie werden wir diesen Ansatz weiterführen und die ersten Dienste, wie beispielsweise Nextcloud, mit der bisher implementierten Infrastruktur umsetzen. Dabei zeigen wir, wie diese Dienste nahtlos in die bestehende Architektur integriert werden können, um deren Funktionalität und Sicherheit zu maximieren.

Erstellt mit Hugo
Theme Stack gestaltet von Jimmy