SSH für Cloud Run verwenden

Auf dieser Seite wird beschrieben, wie Sie SSH verwenden, um über die TCP-Weiterleitung von Identity-Aware Proxy (IAP) eine Verbindung zu Cloud Run-Diensten herzustellen.

Wenn Sie Ihre SSH-Verbindungen mit IAP sichern, können Sie einzelne Containerinstanzen in einer sicheren Umgebung debuggen.

Hinweis

  1. Achten Sie darauf, dass Ihr Cloud Run-Dienst in einer Ausführungsumgebung der zweiten Generation ausgeführt wird und alle Debugging-Tools enthält, die Sie zum Ausführen von Befehlen nach dem Herstellen der Verbindung benötigen. Weitere Informationen finden Sie unter Ausführungsumgebungen.
  2. Führen Sie den folgenden Befehl aus, um sicherzustellen, dass Sie die aktuelle Version der Google Cloud CLI verwenden:

    gcloud components update
    
  3. Aktivieren Sie die Cloud Run API, die Cloud Resource Manager API, die Cloud OS Login API und die Identity-Aware Proxy API in Ihrem Projekt.

    Aktivieren Sie die APIs mit folgendem Befehl:

    gcloud services enable \
        cloudresourcemanager.googleapis.com \
        oslogin.googleapis.com \
        iap.googleapis.com \
        run.googleapis.com
    

Erforderliche Rollen

Bitten Sie Ihren Administrator, Ihnen die folgenden IAM-Rollen zuzuweisen, um die Berechtigungen zu erhalten, die Sie zum Konfigurieren von Richtlinien und zum Herstellen einer Verbindung zu Arbeitslasten benötigen:

Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff auf Projekte, Ordner und Organisationen verwalten.

Sie können die erforderlichen Berechtigungen auch über benutzerdefinierte Rollen oder andere vordefinierte Rollen erhalten.

Beschränkungen

Für SSH für Cloud Run gelten die folgenden Einschränkungen:

  • Es werden nur Cloud Run-Dienste und -Instanzen unterstützt.
  • Für Dienste wird nur die Ausführungsumgebung der zweiten Generation unterstützt.
  • Cloud Run-Jobs werden nicht unterstützt.
  • Worker-Pools werden nicht unterstützt.
  • Wenn Sie SSH verwenden, werden Hostschlüssel im Image überschrieben. Die Schlüssel bleiben nach dem Ende der SSH-Sitzung überschrieben, bis der Dienst neu gestartet wird.
  • Windows: PuTTY wird nicht unterstützt. Verwenden Sie den OpenSSH-Client.

IAP-Autorisierungsrichtlinien konfigurieren

Sie können den Zugriff auf Cloud Run-Ressourcen auf Projekt-, Regions- oder Dienstebene entweder mit der gcloud CLI oder der IAP REST API verwalten.

Sie können Richtlinien für die folgenden Cloud Identity API-IDs konfigurieren:

  • Cloud Identity: z. B. user:EMAIL@example.com
  • Workforce Identity-Föderation: Beispiel: principal://iam.googleapis.com/locations/global/workforcePools/ <var>POOL_ID</var>/subject/<var>SUBJECT_ATTRIBUTE_VALUE</var>

Weitere Informationen und Beispiele für Hauptkontotypen finden Sie in der Liste der Hauptkonto-IDs.

Vorhandenen Cloud Run-Dienst aktualisieren

Führen Sie den folgenden Befehl aus, um den Dienst zu aktualisieren und SSH zu aktivieren:

gcloud beta run services update \
    SERVICE_NAME \
    --region=LOCATION \
    --ssh

Ersetzen Sie Folgendes:

  • SERVICE_NAME: der Name Ihres Cloud Run-Dienstes.
  • LOCATION: die Google Cloud -Region, in der der Dienst bereitgestellt wird (z. B. us-central1).

Sie können einen Cloud Run-Dienst auch bereitstellen, indem Sie --ssh zu gcloud beta run deploy hinzufügen.

Zugriff auf alle Cloud Run-Ressourcen in einem Projekt gewähren

Wenn Sie den Zugriff für alle Ressourcen in einem Projekt verwalten möchten, wenden Sie die IAM-Richtlinienbindung auf Projektebene an.

gcloud

Führen Sie dazu diesen Befehl aus:

gcloud beta iap tcp add-iam-policy-binding \
    --member='USER' \
    --role='roles/iap.tunnelResourceAccessor' \
    --resource-type=cloud-run

Ersetzen Sie USER durch die Hauptkonto-ID des Nutzers, z. B. user:user@example.com oder das Hauptkonto der Mitarbeiteridentitätsföderation.

REST API

Senden Sie eine POST-Anfrage an den Endpunkt der Projektrichtlinie:

curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    -d '{
      "policy": {
        "bindings": [
          {
            "role": "roles/iap.tunnelResourceAccessor",
            "members": ["USER"]
          }
        ]
      }
    }' \
    "https://iap.googleapis.com/v1/projects/\
PROJECT_NUMBER/iap_tunnel/cloudRun:setIamPolicy"

Ersetzen Sie Folgendes:

  • USER: die Hauptkonto-ID des Nutzers.
  • PROJECT_NUMBER: die Projektnummer von Google Cloud, in dem die Ressourcen gehostet werden.

Zugriff auf alle Cloud Run-Ressourcen an einem bestimmten Standort gewähren

Wenn Sie den Zugriff auf alle Ressourcen in einer bestimmten Region (z. B. us-central1) einschränken möchten, wenden Sie die Richtlinienbindung auf Standortebene an.

gcloud

Führen Sie dazu diesen Befehl aus:

gcloud beta iap tcp add-iam-policy-binding \
    --member='USER' \
    --role='roles/iap.tunnelResourceAccessor' \
    --resource-type=cloud-run \
    --region=LOCATION

Ersetzen Sie Folgendes:

  • USER: die Hauptkonto-ID des Nutzers.
  • LOCATION: die Google Cloud -Region, in der die Ressourcen bereitgestellt werden (z. B. us-central1).

REST API

Senden Sie eine POST-Anfrage an den Endpunkt der Standortrichtlinie:

curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    -d '{
      "policy": {
        "bindings": [
          {
            "role": "roles/iap.tunnelResourceAccessor",
            "members": ["USER"]
          }
        ]
      }
    }' \
    "https://iap.googleapis.com/v1/projects/\
PROJECT_NUMBER/iap_tunnel/cloudRun/locations/\
LOCATION:setIamPolicy"

Ersetzen Sie Folgendes:

  • USER: die Hauptkonto-ID des Nutzers
  • PROJECT_NUMBER: die Projektnummer von Google Cloud
  • LOCATION: die Google Cloud -Region

Zugriff auf einen bestimmten Cloud Run-Dienst gewähren

Wenn Sie den Zugriff auf einen einzelnen benannten Dienst in Ihrem Projekt einschränken möchten, wenden Sie die Richtlinienbindung auf Dienstebene an.

gcloud

Führen Sie dazu diesen Befehl aus:

gcloud beta iap tcp add-iam-policy-binding \
    --member='USER' \
    --role='roles/iap.tunnelResourceAccessor' \
    --resource-type=cloud-run \
    --service=SERVICE_NAME \
    --region=LOCATION

Ersetzen Sie Folgendes:

  • USER: die Hauptkonto-ID des Nutzers
  • SERVICE_NAME: der Name der Dienstlogik, zu der eine Verbindung hergestellt werden soll
  • LOCATION: die Google Cloud -Region, in der der Dienst bereitgestellt wird

REST API

Senden Sie eine POST-Anfrage an den Endpunkt der Dienstrichtlinie:

curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    -d '{
      "policy": {
        "bindings": [
          {
            "role": "roles/iap.tunnelResourceAccessor",
            "members": ["USER"]
          }
        ]
      }
    }' \
    "https://iap.googleapis.com/v1/projects/\
    PROJECT_NUMBER/iap_tunnel/cloudRun/locations/\
    LOCATION/services/\
    SERVICE_NAME:setIamPolicy"

Ersetzen Sie Folgendes:

  • USER: die Hauptkonto-ID des Nutzers
  • PROJECT_NUMBER: die Projektnummer von Google Cloud
  • LOCATION: die Google Cloud -Region
  • SERVICE_NAME: der Name des Dienstes

Über SSH verbinden

Wenn Sie einen SSH-Tunnel zu einer Cloud Run-Ressource herstellen möchten, müssen Sie die gcloud CLI verwenden.

Mit einem Dienst verbinden

Führen Sie dazu diesen Befehl aus:

gcloud beta run services ssh SERVICE_NAME \
    --region=LOCATION \
    --project=PROJECT_ID

Ersetzen Sie Folgendes:

  • SERVICE_NAME: der Name des Dienstes, zu dem eine Verbindung hergestellt werden soll
  • LOCATION: die Google Cloud -Region, in der sich der Dienst befindet
  • PROJECT_ID: die ID Ihres Projekts in Google Cloud

Sitzung beenden

Geben Sie exit ein, um die SSH-Sitzung zu beenden.

Alle Änderungen, die Sie am Container vornehmen, bleiben nur so lange erhalten, wie der Container aktiv ist. Wenn Sie die Sitzung beenden, wird der Container nicht automatisch beendet oder neu gestartet.

Lokalen OpenSSH-Client verwenden

So verwenden Sie einen lokalen OpenSSH-Client für Verbindungen:

  1. Führen Sie den folgenden Befehl aus, um den SSH-Tunnel zu initiieren und das erforderliche Zertifikat zu generieren:

    gcloud beta run services ssh SERVICE_NAME \
        --region=LOCATION \
        --project=PROJECT_ID
    

    Ersetzen Sie Folgendes:

    • SERVICE_NAME: der Name des Dienstes
    • LOCATION: die Google Cloud -Region
    • PROJECT_ID: Ihre Google Cloud Projekt-ID
  2. Fügen Sie Ihrer lokalen ~/.ssh/config-Datei den folgenden Konfigurationscode hinzu:

    Host cloud-run-ssh
        HostName cloud-run-default
        User root
        IdentityFile ~/.ssh/google_compute_engine
        CertificateFile ~/.ssh/google_compute_engine_cert/PROJECT_ID_LOCATION_SERVICE_NAME-cert.pub
        CheckHostIP no
        HashKnownHosts no
        HostKeyAlias cloud-run-default
        IdentitiesOnly yes
        StrictHostKeyChecking no
        UserKnownHostsFile /dev/null
        ProxyUseFdpass no
        ProxyCommand /usr/local/bin/python3 -S ~/google-cloud-sdk/lib/gcloud.py beta run start-iap-tunnel --project_number=PROJECT_NUMBER --project_id=PROJECT_ID --workload_type=service --deployment_name=SERVICE_NAME --region=LOCATION
    

    Wenn Ihr gcloud-Installationspfad anders ist, aktualisieren Sie das Präfix im ProxyCommand-Pfad.

    Ersetzen Sie Folgendes:

    • PROJECT_ID: Ihre Projekt-ID in Google Cloud
    • LOCATION: die Google Cloud -Region
    • SERVICE_NAME: der Name des Dienstes
    • PROJECT_NUMBER: Ihre Google Cloud Projektnummer
  3. Stellen Sie über OpenSSH eine Verbindung zum Dienst her:

    ssh cloud-run-ssh