Sicher mit VM-Instanzen verbinden

Bei der Entwicklung von Projekten in Compute Engine gibt es verschiedene Szenarien, in denen Sie verhindern möchten, dass Instanzen aus dem öffentlichen Internet aufgerufen werden können:

  • Webdienste sind noch in der Entwicklung und noch nicht bereit, um externen Nutzern zugänglich gemacht zu werden, da ihre Funktionen noch nicht ausgereift sind oder noch nicht mit HTTPS konfiguriert wurden.
  • Die Instanz stellt unter Umständen Dienste zur Verfügung, die nur für den Gebrauch durch andere Instanzen in dem Projekt vorgesehen sind.
  • Instanzen sollten nur über Optionen mit Dedicated Interconnect für Firmenbüros oder Rechenzentren zugänglich sein.

Auch wenn ein Dienst absichtlich mit dem Internet verbunden ist, ist es wichtig, dass die Kommunikation mit dem Dienst auf die Zielnutzergruppen beschränkt ist und über sichere Kanäle wie SSH oder HTTPS erfolgt, um vertrauliche Informationen zu schützen.

Dieser Artikel veranschaulicht verschiedene Methoden zur Sicherung der Kommunikation mit Compute Engine-Instanzen mit oder ohne externen IP-Adressen.

Dienste auf Geräten mit externen IP-Adressen schützen

Mit Instanzen ohne externe IP-Adressen verbinden

Dienste auf Geräten mit externen IP-Adressen schützen

Wenn Instanzen eine öffentliche IP-Adresse haben, ist es wichtig, dass nur die Dienste und der Traffic, der zugänglich gemacht werden soll, erreichbar sind, und auf den zugänglich gemachten Elementen alle vertraulichen Informationen während der Übermittlung gesichert sind.

Firewalls

Ihre erste Verteidigungslinie besteht darin, den Zugang auf die Instanz mithilfe von Firewalls zu beschränken. Mithilfe von Firewallregeln können Sie den gesamten Traffic zu einem Netzwerk oder zu Zielgeräten mit einem bestimmten Satz von Ports auf bestimmte Quell-IP-Adressen beschränken.

Firewalls sind keine eigenständige Lösung. Die Beschränkung des Traffics auf bestimmte Quell-IPs bietet keinen Schutz für vertrauliche Informationen wie Anmeldedaten, Befehle zum Erstellen oder Vernichten von Ressourcen oder Dateien oder Logs. Wenn Sie einen Webdienst auf einem öffentlich zugänglichen Rechner ausführen, wie z. B. einer Compute Engine-Instanz mit externer IP, müssen Sie die gesamte Kommunikation zwischen Ihrem Host und der bereitgestellten Instanz verschlüsseln, um einen angemessenen Schutz zu gewährleisten.

Darüber hinaus sind Firewalls nicht immer die geeignetste Lösung. Firewalls eignen sich zum Beispiel nicht für Entwicklungsumgebungen, die keine statischen IP-Adressen haben, wie z. B. Roaming-Laptops.

HTTPS und SSL

Für Produktionswebsysteme sollten Sie HTTPS/SSL konfigurieren. HTTPS/SSL kann entweder durch Einrichtung einer Instanz zum Beenden von HTTPS oder durch Konfiguration eines HTTPS-Lastenausgleichs eingerichtet werden. HTTPS/SSL weist eine gewisse Komplexität auf. Aus diesem Grund müssen Sie zur Einrichtung folgende Aufgaben ausführen:

  • Registrieren Sie einen Domainnamen.
  • Erwerben Sie ein SSL-Zertifikat von einer Zertifizierungsstelle.
  • Registrieren Sie das Zertifikat mit Ihrem HTTPS-Load-Balancer und den damit verbundenen Instanzen oder konfigurieren Sie einen SSL-terminierten Webserver oder Proxy auf einer oder mehreren Compute Engine-Instanzen.

Wenn Sie bereits zuvor SSL-Serving-Domains eingerichtet haben, sollte es Ihnen nicht schwerfallen, dies ebenfalls mit Compute Engine zu tun. Ansonsten ist es unter Umständen einfacher, eine andere Sicherungsmethode zu verwenden, z. B. eine Portweiterleitung oder einen SOCKS-Proxy.

Portweiterleitung über SSH

Mit dem gcloud-Befehlszeilentool können Sie einen Server auf einem bestimmten lokalen Port starten, der den gesamten Traffic über eine SSH-Verbindung an einen Remotehost weiterleitet.

Notieren Sie sich zuerst die Instanz und den Port, die den Dienst bereitstellen soll und zu dem Sie eine gesicherte Verbindung herstellen möchten. Als Nächstes führen Sie folgenden Befehl aus:

gcloud compute ssh example-instance \
    --project my-project \
    --zone us-central1-a \
    -- -L 2222:localhost:8888

Die Parameter im vorherigen Befehl sind so definiert:

  • example-instance ist der Name der Instanz, zu der Sie eine Verbindung herstellen möchten.
  • my-project ist Ihre GCP-Projekt-ID (Google Cloud Platform).
  • us-central1-a ist die Zone, in der die Instanz läuft.
  • 2222 ist der lokale Port, über den die Instanz läuft.
  • 8888 ist der Remoteport, mit dem Sie sich verbinden.

Wenn Sie http://localhost:2222/ in Ihrem Browser öffnen, erfolgt die HTTP-Verbindung mit diesen beispielhaften Einstellungen über den SSH-Tunnel, den Sie soeben erstellt haben, zu Ihrem Remotehost, dann über SSH zur angegebenen Instanz und anschließend zum Port 8888 auf dem gleichen Gerät, jedoch über eine verschlüsselte, gesicherte SSH-Verbindung.

Der gcloud-Befehl erstellt eine SSH-Verbindung und erhält diese aufrecht. Dies funktioniert nur, solange die SSH-Sitzung aktiv ist. Sobald Sie die von gcloud erstellte SSH-Sitzung verlassen, wird auch die Portweiterleitung über http://localhost:2222/ eingestellt.

Wenn Sie mehr als eine Portweiterleitungsregel festlegen möchten, können Sie mehrere Regeln mit einem einzelnen Befehl angeben, indem Sie die Flags wiederholen:

gcloud compute ssh example-instance \
    --project my-project \
    --zone us-central1-a \
    -- -L 2222:localhost:8888 -L 2299:localhost:8000

Alternativ dazu können Sie jedes Mal einen neuen gcloud-Befehl ausführen, um einen separaten Tunnel zu erzeugen. Beachten Sie, dass Sie keine Portweiterleitung von einer vorhandenen Verbindung hinzufügen oder entfernen können, ohne die Verbindung zu trennen und erneut herzustellen.

SOCKS-Proxy über SSH

Wenn Sie eine Verbindung mit einer Reihe von verschiedenen Hosts in Ihrer Cloud-Bereitstellung herstellen möchten, ändern Sie hierfür am besten Ihren Browser, um auf diese direkt aus Ihrem Netzwerk zugreifen zu können. Mit diesem Ansatz können Sie den Kurznamen der Hosts verwenden, anstatt die IP-Adresse jedes einzelnen Hosts aufrufen, Ports für jeden Dienst öffnen oder einen SSH-Tunnel für jeden Host/jedes Portpaar erstellen zu müssen.

Vorgehensweise:

  1. Richten Sie einen einzelnen SSH-Tunnel auf einem der Hosts im Netzwerk ein und erstellen Sie einen SOCKS-Proxy auf diesem Host.
  2. Ändern Sie die Browserkonfiguration, sodass alle Lookups über diesen SOCKS-Proxyhost erfolgen.

Da Sie den gesamten Traffic über diesen Host tunneln, sollten Sie das Internet nicht generell über diesen Browser oder dieses spezifische Profil nutzen, da Sie die Bandbreite Ihres Clouddienstes dafür verwenden würden. Sie sollten dafür ein separates Browserprofil verwenden und es bei Bedarf wechseln.

Starten Sie den SOCKS-Proxy

Um den SOCKS-Proxy zu starten, führen Sie folgenden Befehl aus:

gcloud compute ssh example-instance \
    --project my-project \
    --zone us-central1-a \
    --ssh-flag="-D" \
    --ssh-flag="1080" \
    --ssh-flag="-N"

Die Parameter im vorherigen Befehl sind so definiert:

  • example-instance ist der Name der Instanz, zu der Sie eine Verbindung herstellen möchten.
  • my-project ist die GCP-Projekt-ID.
  • us-central1-a ist die Zone, in der die Instanz läuft.
  • 1080 ist der lokale Port, über den die Instanz läuft.

Beachten Sie, dass in diesem Fall kein Remoteport angegeben werden muss. Da sich ein SOCKS-Proxy nicht mit einem bestimmten Remoteport verbindet, wird jede Verbindung, die Sie über den SOCKS-Proxy herstellen, relativ zum Host aufgelöst, zu dem Sie eine Verbindung herstellen.

Durch die Nutzung eines SOCKS-Proxys können Sie eine Verbindung zu jeder Instanz herstellen, die sich im selben Compute Engine-Netzwerk wie Ihre Proxy-Instanz befindet, indem Sie den Kurznamen der Instanz verwenden. Darüber hinaus können Sie eine Verbindung zu einem beliebigen Port auf einer bestimmten Instanz herstellen.

Dieser Ansatz ist viel flexibler als die einfache Portweiterleitungsmethode, erfordert aber auch die Änderung der Einstellungen Ihres Webbrowsers, um den Proxy nutzen zu können.

Konfigurieren Sie als Nächstes entweder Chrome oder Firefox, um den Proxy zu verwenden.

Chrome

Chrome verwendet standardmäßig systemweite Proxy-Einstellungen, sodass Sie einen anderen Proxy mit Befehlszeilen-Flags angeben müssen. Wenn Chrome gestartet wird, wird standardmäßig eine Instanz eines bereits laufenden Profils erstellt. Damit Sie also mehrere Kopien von Chrome gleichzeitig ausführen können, darunter eine, die den Proxy verwendet, und andere, die den Proxy nicht verwenden, benötigen Sie ein neues Profil.

Starten Sie Chrome mit einem neuen Profil. Es wird automatisch erstellt, wenn keines vorhanden ist.

Linux:

"/usr/bin/google-chrome \
    --user-data-dir="$HOME/chrome-proxy-profile" \
    --proxy-server="socks5://localhost:1080"

macOS:

"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \
    --user-data-dir="$HOME/chrome-proxy-profile" \
    --proxy-server="socks5://localhost:1080"

Windows:

"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" ^
    --user-data-dir="%USERPROFILE%\chrome-proxy-profile" ^
    --proxy-server="socks5://localhost:1080"

Achten Sie darauf, den Localhost-Port auf denselben Wert zu setzen, den Sie zuvor im Befehl von gcloud verwendet haben (in unserem Beispiel 1080).

Firefox

Bevor Sie diese Einstellungen ändern, sollten Sie ein neues Firefox-Profil erstellen. Andernfalls betrifft die Nutzung dieses Hosts als Proxy alle Instanzen von Firefox, was Sie wahrscheinlich nicht möchten.

Nachdem Sie Firefox mit einem separaten Profil ausgeführt haben, können Sie den SOCKS-Proxy einrichten:

  1. Öffnen Sie Einstellungen.
  2. Klicken Sie auf Erweitert > Netzwerke > Einstellungen, um das Dialogfenster Verbindungseinstellungen zu öffnen.
  3. Wählen Sie die Option Manuelle Proxykonfiguration.
    1. Geben Sie im Abschnitt SOCKS-Host localhost als Host und den Port an, den Sie im zuvor ausgeführten Befehl von gcloud ausgewählt haben.
    2. Wählen Sie SOCKS v5.
    3. Markieren Sie das Feld Remote DNS.
    4. Lassen Sie alle anderen Felder leer.
  4. Klicken Sie auf OK und schließen Sie das Dialogfenster Einstellungen.

Mit Instanzen ohne externe IP-Adressen verbinden

Wenn Instanzen keine externen IP-Adressen haben, können sie nur von anderen Instanzen im Netzwerk, der TCP-Weiterleitungsfunktion von Cloud Identity-Aware Proxy oder über ein verwaltetes VPN-Gateway erreicht werden. Sie können Instanzen in Ihrem Netzwerk als vertrauenswürdige Relais für eingehende Verbindungen (Bastion Hosts) oder ausgehende Netzwerkverbindungen (NAT-Gateways) bereitstellen. Für eine transparentere Konnektivität können Sie, ohne eine solche Verbindung herstellen zu müssen, eine verwaltete VPN-Gateway-Ressource verwenden.

Bastion Hosts

Bastion Hosts stellen einen Zugangspunkt von außen in ein Netzwerk mit privaten Netzwerkinstanzen dar. In folgendem Diagramm ist die Kommunikation aus dem Internet dargestellt.

Die Architektur von Bastion Hosts stellt einen nach außen gerichteten Einstiegspunkt für ein Netzwerk privater Instanzen dar.

Dieser Host kann als ein einziger Verteidigungs- oder Prüfpunkt dienen und gestartet und gestoppt werden, um die eingehende SSH-Kommunikation aus dem Internet zu aktivieren oder zu deaktivieren. Durch die Nutzung eines Bastion Hosts können Sie eine Verbindung zu einer Instanz herstellen, die keine externe IP-Adresse hat. So können Sie beispielsweise eine Verbindung zu einer Entwicklungsumgebung herstellen oder die Datenbankinstanz für Ihre externe Anwendung verwalten, ohne zusätzliche Firewallregeln zu konfigurieren.

Die vollständige Härtung eines Bastion Hosts kann dieser Artikel nicht darstellen, erste Schritte könnten jedoch folgende sein:

  • Einschränkung des CIDR-Bereichs der Quell-IPs, die mit dem Bastion-Host kommunizieren können.
  • Konfiguration von Firewallregeln, um SSH-Traffic auf private Instanzen zu ermöglichen, die lediglich vom Bastion-Host stammen.

SSH ist auf Instanzen standardmäßig so konfiguriert, dass private Schlüssel für die Authentifizierung verwendet werden können. Bei Verwendung eines Bastion Hosts melden Sie sich zuerst beim Bastion Host und dann bei der privaten Ziel-VM an. Aufgrund dieser zweistufigen Anmeldung, aus der sich auch die Bezeichnung "Jump-Server" für Bastion Hosts ableitet, sollten Sie die ssh-Weiterleitung verwenden, anstatt den privaten Schlüssel des Zielcomputers auf dem Bastion Host zu speichern, um den Zielcomputer zu erreichen. Dies ist auch erforderlich, wenn Sie das gleiche Schlüsselpaar sowohl für den Bastion Host als auch für die Zielinstanzen verwenden, da der Bastion Host lediglich zur öffentlichen Hälfte des Schlüsselpaares direkten Zugang hat.

Informationen dazu, wie Sie eine als Bastion Host fungierende Instanz verwenden, um eine Verbindung zu anderen Instanzen in Ihrem GCP-Netzwerk herzustellen, und wie Sie die ssh-Weiterleitung verwenden, finden Sie unter Verbindung zu Instanzen herstellen, die keine externen IP-Adressen haben.

Cloud IAP für TCP-Weiterleitung

Wenn Sie SSH mit der TCP-Weiterleitungsfunktion von Cloud IAP verwenden, wird eine SSH-Verbindung in HTTPS eingebunden. Die TCP-Weiterleitungsfunktion von Cloud IAP sendet sie dann an die Remoteinstanz.

Informationen dazu, wie Sie eine Verbindung zu einer Remoteinstanz mit Cloud IAP herstellen, finden Sie unter Cloud IAP für TCP-Weiterleitung verwenden.

VPN

Cloud VPN ermöglicht es Ihnen, Ihr bestehendes Netzwerk über eine IPsec-Verbindung zu einem VPN-Gateway mit Ihrem GCP-Netzwerk zu verbinden. So wird das direkte Routing Ihres lokalen Traffics zu den privaten IP-Schnittstellen von Compute Engine-Instanzen ermöglicht. Der Traffic wird verschlüsselt, während er über öffentliche Links an Google weitergeleitet wird.

Ausführliche Informationen zum Einrichten, Konfigurieren und Verwenden von VPN mit Compute Engine finden Sie in der Cloud VPN-Dokumentation.

Informationen zum Herstellen einer Verbindung mit Instanzen in Ihrem GCP-Netzwerk über ein vorhandenes VPN statt über externe IP-Adressen der Instanzen finden Sie unter Verbindung zu Instanzen herstellen, die keine externen IP-Adressen haben.

Ausgehender Traffic mithilfe von NAT-Gateways

Wenn eine Instanz keine externe IP-Adresse hat, kann sie keine direkten Verbindungen zu externen Diensten, einschließlich anderer GCP-Dienste, herstellen. Damit diese Instanzen Dienste im öffentlichen Internet erreichen können, können Sie ein NAT-Gateway einrichten und so konfigurieren, dass der Traffic im Auftrag einer beliebigen Instanz im Netzwerk weitergeleitet wird. Eine einzelne Instanz kann aber nicht als hochverfügbar angesehen werden und für mehrere Instanzen wird kein hoher Trafficdurchsatz unterstützt.

Interaktiver serieller Konsolenzugriff

Wenn eine Instanz keine externe IP-Adresse hat, müssen Sie zur Fehlersuche oder zu Wartungszwecken möglicherweise weiterhin mit der Instanz interagieren. Die Einrichtung eines Bastion Hosts, wie oben ausgeführt, ist eine Option, erfordert aber möglicherweise eine umfassendere Einrichtung, als für Ihren Bedarf sinnvoll wäre. Wenn Sie Fehler auf einer Instanz ohne externe IP-Adresse beheben möchten, sollten Sie den interaktiven Zugriff auf die serielle Konsole aktivieren. Hierdurch können Sie mithilfe von SSH mit der seriellen Konsole einer Instanz interagieren und Befehle über die serielle Konsole ausführen.

Weitere Informationen finden Sie unter Mit der seriellen Konsole interagieren.

HTTPS- und SSL-Proxy-Load-Balancer

Instanzen, die Back-Ends für HTTPS- und SSL-Proxy-Load-Balancer sind, müssen für den Zugriff durch den Load-Balancer keine externen IP-Adressen haben. Für den direkten Zugriff auf diese Ressourcen müssen die unter Mit Instanzen ohne externe IP-Adressen verbinden aufgeführten Methoden verwendet werden.

Weitere Informationen finden Sie in der Dokumentation zu Load-Balancing.

Weitere Google Cloud Platform-Funktionen testen: Anleitungen ansehen

Hat Ihnen diese Seite weitergeholfen? Teilen Sie uns Ihr Feedback mit:

Feedback geben zu...

Compute Engine-Dokumentation