Verbindung zu einer VM herstellen

Google Distributed Cloud (GDC) Air-Gapped verwendet die schlüsselbasierte SSH-Authentifizierung, um Verbindungen zu Linux-VM-Instanzen herzustellen. Standardmäßig sind Passwörter für lokale Nutzer auf Linux-VMs nicht konfiguriert.

Hinweise

Bevor Sie eine Verbindung zu einer VM herstellen können, müssen die folgenden Voraussetzungen erfüllt sein:

  • Zugriffsverwaltung aktivieren Sie können nicht fortfahren, wenn die Zugriffsverwaltung in der Gastumgebung nicht aktiviert ist. Die Zugriffsverwaltung ist auf neuen VMs standardmäßig aktiviert.
  • Aktivieren Sie den externen VM-Zugriff für alle Peers über den TCP-Port 22 (Transmission Control Protocol).
    • Aktivieren Sie für Windows-VMs den externen VM-Zugriff auf Port 3389.
  • Richten Sie eine benutzerdefinierte ProjectNetworkPolicy-Ressource (PNP) in dem Projekt ein, in dem sich die VM befindet.
    • Wenn Sie ein PNP im Projekt einrichten, können Sie auf die VM außerhalb des Projekts oder der Organisation zugreifen.
    • Wenn Sie nicht sicher sind, ob Sie eine PNP haben, fragen Sie Ihren Infrastruktur-Operator (IO).
  • Anmeldezugriff auf den Cluster. Folgen Sie der CLI-Anleitung unter Anmelden, um sich im Cluster anzumelden.
Wenn Sie Befehle der gdcloud-Befehlszeile (Command-Line Interface, CLI) verwenden möchten, müssen Sie die gdcloud-CLI heruntergeladen, installiert und konfiguriert haben. Für alle Befehle für Distributed Cloud wird die CLI gdcloud oder kubectl verwendet. Außerdem ist eine Linux-Umgebung erforderlich.

Pfad der kubeconfig-Datei abrufen

Damit Sie Befehle für den Management API-Server ausführen können, benötigen Sie die folgenden Ressourcen:

  1. Melden Sie sich an und generieren Sie die kubeconfig-Datei für den Management API-Server, falls Sie noch keine haben.

  2. Verwenden Sie den Pfad zur kubeconfig-Datei des Management API-Servers, um MANAGEMENT_API_SERVER in dieser Anleitung zu ersetzen.

Berechtigungen und Zugriff anfordern

Zum Ausführen der auf dieser Seite aufgeführten Aufgaben benötigen Sie die Rolle „ProjectVirtualMachine Admin“. Prüfen Sie, ob Sie die Rolle „Project VirtualMachine Admin“ (project-vm-admin) im Namespace des Projekts haben, in dem sich die VM befindet.

Wenn Sie VM-Vorgänge über die GDC-Konsole oder die gdcloud-CLI ausführen möchten, bitten Sie Ihren Projekt-IAM-Administrator, Ihnen die Rolle „Project VirtualMachine Admin“ und die Rolle „Project Viewer“ (project-viewer) zuzuweisen.

VM-Verbindung herstellen

In diesem Abschnitt wird beschrieben, wie Sie eine Verbindung zu Linux- und Windows-VMs herstellen.

Verbindung zu einer Linux-VM herstellen

Verwenden Sie die GDC-Konsole, die gdcloud CLI oder die Virtual Machine Manager API, um eine Verbindung zu einer Linux-VM herzustellen.

Console

  1. Klicken Sie im Navigationsmenü auf Virtuelle Maschinen > Instanzen.

  2. Suchen Sie in der Liste der VMs nach der Zeile für die laufende VM, mit der Sie eine Verbindung herstellen möchten. Klicken Sie in der Spalte Verbinden auf SSH.

  3. Ein SSH-Browserterminal wird geöffnet. Geben Sie einen beliebigen Befehl in die Shell ein oder klicken Sie auf FTP, um die Dateistruktur aufzurufen und Dateien hochzuladen.

gdcloud

Mit SSH eine Verbindung zu einer VM herstellen, indem Sie den Befehl gdcloud compute ssh ausführen

gdcloud compute ssh VM_NAME \
  --project=PROJECT_ID

Ersetzen Sie die folgenden Variablen:

  • VM_NAME: der Name der VM.
  • PROJECT_ID: die ID des Projekts, das die VM enthält.

Wenn Sie Standardeigenschaften für die CLI festgelegt haben, können Sie das Flag --project bei diesem Befehl weglassen. Beispiel:

gdcloud compute ssh VM_NAME

API

So stellen Sie eine Verbindung zu einer VM her:

  • Öffnen Sie ein Terminalfenster.
  • Erstellen Sie ein SSH-Schlüsselpaar.
  • Laden Sie den öffentlichen Schlüssel und den Nutzernamen mit einem TTL-Wert (Time-to-Live) hoch.

GDC ruft den SSH-Schlüssel und den Nutzernamen ab und erstellt ein Nutzerkonto mit dem Nutzernamen. Auf Linux-VMs speichert GDC den öffentlichen Schlüssel in der Datei ~/.ssh/authorized_keys des Nutzers auf der VM.

Führen Sie die folgenden Schritte aus, um über die Befehlszeile eine Verbindung zu einer VM herzustellen:

  1. Erstellen Sie ein SSH-Schlüsselpaar und einen Nutzernamen.

    Verwenden Sie auf Linux- und macOS-Workstations das ssh-keygen-Dienstprogramm, um ein neues SSH-Schlüsselpaar zu erstellen. Im folgenden Codebeispiel wird ein RSA-Schlüsselpaar (Rivest–Shamir–Adleman) erstellt:

    ssh-keygen -t rsa \
      -f ~/.ssh/KEY_FILENAME \
      -C USERNAME \
      -b 2048
    

    Ersetzen Sie die Variablen durch die folgenden Definitionen.

    VariableDefinition
    KEY_FILENAME Der Name Ihrer SSH-Schlüsseldatei. Der Dateiname my-ssh-key erzeugt beispielsweise die private Schlüsseldatei my-ssh-key und die öffentliche Schlüsseldatei my-ssh-key.pub.
    USERNAME Ihr Nutzername auf der VM, z. B. testuser oder testuser_gmail_com.

    Das Dienstprogramm ssh-keygen speichert Ihre private Schlüsseldatei im Pfad ~/.ssh/KEY_FILENAME und Ihre öffentliche Schlüsseldatei im Pfad ~/.ssh/KEY_FILENAME.pub.

    Ein öffentlicher Schlüssel für den Nutzer testuser sieht in etwa so aus:

    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDAu5kKQCPF... testuser
    
  2. Laden Sie Ihren Schlüssel auf die VM hoch und erstellen Sie eine Kubernetes-Ressource mit Ihrem öffentlichen Schlüssel, Nutzernamen und TTL-Wert (Time to Live) für den Schlüssel.

    Im folgenden Beispiel wird eine access_request.yaml-Datei verwendet, um mit dem privaten Schlüssel KEY_FILENAME Zugriff auf die VM-Instanz zu gewähren. Der TTL-Wert beträgt zehn Minuten:

    apiVersion: virtualmachine.gdc.goog/v1
    kind: VirtualMachineAccessRequest
    metadata:
      namespace: VM_NAMESPACE
      name: AR_NAME
    spec:
      ssh:
        key: |
          ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDAu5kKQCPF... cloudysanfrancisco
        ttl: 10m
      user: USERNAME
      vm: VM_NAME
    

    Ersetzen Sie die Variablen anhand der folgenden Definitionen:

    VariableDefinition
    VM_NAMESPACE Der Namespace für die VM.
    AR_NAME Der Name der Zugriffsanfrage.
    USERNAME Ihr Nutzername auf der VM, z. B. testuser oder testuser_gmail_com.
    VM_NAME Der Name der VM-Instanz.
  3. Erstellen Sie den Schlüssel:

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      create -f access_request.yaml
    
  4. So prüfen Sie den Status Ihrer Zugriffsanfrage:

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      -n VM_NAMESPACE \
      get virtualmachineaccessrequests.virtualmachine.gdc.goog
    

    Ersetzen Sie VM_NAMESPACE durch den Namespace für die VM.

    Der Status configured gibt an, dass Sie eine Verbindung zur VM herstellen können.

  5. Stellen Sie eine Verbindung zur VM her.

    ssh -i PATH_TO_PRIVATE_KEY USERNAME@EXTERNAL_IP
    

    Ersetzen Sie die folgenden Werte:

    • PATH_TO_PRIVATE_KEY mit dem Pfad zur privaten SSH-Schlüsseldatei, die dem öffentlichen Schlüssel entspricht, den Sie der VM hinzugefügt haben.
    • USERNAME mit dem Nutzernamen, den Sie beim Erstellen des SSH-Schlüssels angegeben haben. Beispiel: cloudysanfrancisco_example_com oder cloudysanfrancisco.
    • EXTERNAL_IP durch die externe Ingress-IP-Adresse der VM.

Fehlerbehebung

In diesem Abschnitt wird beschrieben, wie Sie Probleme beheben, die beim Herstellen einer Verbindung zu einer VM-Instanz nach dem Erstellen der Zugriffsanfrage auftreten können.

Führen Sie die folgenden Schritte aus, um mögliche Probleme zu identifizieren:

  1. Prüfen Sie, ob die VM ausgeführt wird. Ersetzen Sie die bearbeitbaren Variablen im folgenden Befehl durch Ihre Werte:

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      -n VM_NAMESPACE \
      get virtualmachines.virtualmachine.gdc.goog VM_NAME
    

    Wenn die VM nicht ausgeführt wird, können Sie keine Verbindung herstellen oder neue Anfragen konfigurieren.

  2. Prüfen Sie, ob die VM seit einigen Minuten ausgeführt wird. Wenn die VM gerade erst gestartet wurde, werden die für den SSH-Zugriff erforderlichen Dienste möglicherweise noch nicht ausgeführt. Normalerweise werden sie innerhalb von fünf Minuten nach dem Start ausgeführt.

  3. Prüfen Sie, ob Sie den TTL-Wert in der Zugriffsanfrage überschritten haben. Der Schlüssel wird entfernt, sobald die Zeit den TTL-Wert erreicht.

  4. Wenn für Ihr VirtualMachineAccessRequest der Status configured angezeigt wird, prüfen Sie, ob die folgenden Anforderungen erfüllt sind:

    1. Sie haben die Datenübertragung auf Port 22 für Ihre VM aktiviert.
    2. Ihr Computer leitet Anfragen an die VM weiter. Mit dem Befehl
      curl -vso /dev/null --connect-timeout 5 EXTERNAL_IP:22 können Sie beispielsweise das Routing prüfen.
  5. Wenn für Ihr VirtualMachineAccessRequest der Status failed angezeigt wird, rufen Sie den vollständigen Status auf und sehen Sie sich die Fehlermeldung an, die angibt, warum die Anfrage fehlgeschlagen ist:

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      -n VM_NAMESPACE \
      describe virtualmachineaccessrequest.virtualmachine.gdc.goog AR_NAME
    

    Ersetzen Sie die bearbeitbaren Variablen im vorherigen Befehl durch Ihre eigenen Werte.

  6. Wenn der Status Ihrer VirtualMachineAccessRequest leer ist, wird die Gastumgebung möglicherweise nicht ausgeführt.

Verbindung zu einer Windows-VM herstellen

Für die Verbindung zu einer Windows-VM ist das Remote Desktop Protocol (RDP) über eine Remote-Desktop-Anwendung erforderlich. Um über RDP auf die VM zuzugreifen, benötigen Sie ein Passwort, das Sie über die GDC-Konsole oder die benutzerdefinierte Ressource VirtualMachinePasswordResetRequest aus der Virtual Machine Manager API abrufen können.

Bevor Sie fortfahren, müssen Sie zuerst den Remotedesktopclient installieren. Über den folgenden Link können Sie die Schritte für Ihr Betriebssystem aufrufen. Für den Zugriff auf den Link ist eine Internetverbindung erforderlich.

https://remmina.org/how-to-install-remmina/

Führen Sie die folgenden Schritte aus, um eine Verbindung zu einer Windows-VM herzustellen:

Console

  1. Klicken Sie im Navigationsmenü auf Virtuelle Maschinen > Instanzen.
  2. Suchen Sie in der Liste der VMs nach der laufenden Windows-VM, zu der Sie eine Verbindung herstellen möchten.
  3. Klicken Sie in der Spalte Aktionen auf Passwort zurücksetzen. Das Dialogfeld Neues Windows-Passwort festlegen wird angezeigt.
  4. Geben Sie im Feld Nutzername Ihren Nutzernamen ein.
  5. Klicken Sie auf Festlegen. Das Dialogfeld Neues Windows-Passwort wird mit einem zufällig generierten Passwort angezeigt. Dieses Passwort enthält sowohl alphanumerische als auch nicht alphanumerische Zeichen.
  6. Klicken Sie auf  Kopieren.
  7. Rufen Sie Ihren Remote-Desktop-Client auf und wählen Sie Ihren Nutzernamen aus.
  8. Geben Sie im Eingabefeld Passwort Ihr Passwort ein.
  9. Drücken Sie die Eingabetaste oder die Returntaste.

API

  1. Generieren Sie einen RSA-Schlüssel. Sie benötigen diesen Schlüssel, um das Passwort aus der VirtualMachinePasswordResetRequest-Ressource abzurufen.

    openssl genrsa -out private-key.pem 2048
    # Get the RSA public key
    openssl rsa -in private-key.pem -outform PEM -pubout
    
  2. Erstellen Sie eine YAML-Datei.

  3. Laden Sie den von Ihnen generierten RSA-Schlüssel, den VM-Namen und einen Nutzernamen hoch, den Sie für den Zugriff auf den Remote-Desktop-Client angeben:

    apiVersion: virtualmachine.gdc.goog/v1
    kind: VirtualMachinePasswordResetRequest
    metadata:
      namespace: VM_NAMESPACE
      name: PRR_NAME
    spec:
      vmName: VM_NAME
      user: USERNAME
      publicKey: PUBLIC_KEY
    

    Ersetzen Sie die Variablen anhand der folgenden Definitionen:

    Variable Definition
    VM_NAMESPACE Der Name des Namespace, in dem sich die VM befindet.
    PRR_NAME Der Name, den Sie der Anfrage zum Zurücksetzen des Passworts geben. Beispiel: vmprr2.
    VM_NAME Der Name der VM. Beispiel: vm-test.
    USERNAME Der Nutzername, den Sie für die Anmeldung bei der VM mit dem Remote Desktop-Client angeben. Beispiel: test-user.
    PUBLIC_KEY Der RSA-Schlüssel, den Sie in Schritt 2 generiert haben. Sie müssen PUBLIC_KEY mehrzeilig formatieren.

    Das folgende Beispiel zeigt eine YAML-Datei mit den Werten und der Formatierung, die für eine Anfrage zum Zurücksetzen des Passworts erforderlich sind:

    apiVersion: virtualmachine.gdc.goog/v1
    kind: VirtualMachinePasswordResetRequest
    metadata:
      namespace: test-namespace
      name: vmprr2
    spec:
      vmName: vm2
      user: test-user
      publicKey: |-
       -----BEGIN PUBLIC KEY-----
    
       # Input the RSA key data in multi-line format.
    
       -----END PUBLIC KEY-----
    
  4. Wenden Sie den Inhalt der Datei an:

    kubectl --kubeconfig=MANAGEMENT_API_SERVER \
      apply -f FILENAME
    

    Ersetzen Sie FILENAME durch den Namen der Datei für die Anfrage zum Zurücksetzen des Passworts.

  5. Rufen Sie den Status der VirtualMachinePasswordResetRequest-Ressource auf. Vorausgesetzt, die VM hat den Status Running, wird das Passwort innerhalb von einer Minute generiert.

    kubectl --kubeconfig=MANAGEMENT_API_SERVER \
      -n VM_NAMESPACE \
      describe virtualmachinepasswordresetrequest.virtualmachine.gdc.goog PRR_NAME
    

    Suchen Sie das Feld status.encryptedPassword, das das generierte Passwort enthält.

  6. Kopieren Sie den Wert in status.encryptedPassword und entschlüsseln Sie das generierte Passwort:

    echo ENCRYPTED_PASSWORD | base64 -d > PASSWORD_FILENAME
    openssl pkeyutl -decrypt -in PASSWORD_FILENAME -inkey private-key.pem \
      -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha512 -pkeyopt rsa_mgf1_md:sha512
    

    Ersetzen Sie Folgendes:

    • ENCRYPTED_PASSWORD: Das generierte Passwort aus dem Feld status.encryptedPassword.
    • PASSWORD_FILENAME: Eine temporäre Datei zum Speichern des base64-decodierten Passworts.

    Anschließend wird das entschlüsselte Passwort als Ausgabe angezeigt, mit dem Sie über RDP eine Verbindung zur VM herstellen können.

  7. Öffnen Sie den Remotedesktopclient und klicken Sie auf Remoteverbindungsprofil. Ein Verbindungsdialogfeld wird angezeigt.

  8. Geben Sie auf dem Tab Basic (Einfach) Werte für die folgenden Felder ein:

    • Server: Die Ingress-IP-Adresse des VM-Status für externen Zugriff mit angehängter Portnummer für externen VM-Zugriff. Informationen zum Abrufen der Ingress-IP-Adresse finden Sie unter Ingress.
    • Nutzername: Der Nutzername, den Sie in der Anfrage zum Zurücksetzen des Passworts angegeben haben. Beispiel: test-user.
    • Passwort: Das generierte Passwort, das Sie aus dem Status der Anfrage zum Zurücksetzen des Passworts entschlüsselt haben.
  9. Klicken Sie auf Speichern und verbinden.