SSH für Cloud Run verwenden

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

Wenn Sie Ihre SSH-Verbindungen mit IAP schützen, 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 2. Generation ausgeführt wird und alle Debugging-Tools enthält, die Sie zum Ausführen von Befehlen nach der Verbindung benötigen. Weitere Informationen finden Sie unter Ausführungsumgebungen.
  2. Führen Sie den folgenden Befehl aus, um sicherzustellen, dass Sie die neueste 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 APIs 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.
  • Bei Verwendung von SSH 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. OpenSSH-Client verwenden

IAP-Autorisierungsrichtlinien konfigurieren

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

Sie können Richtlinien für die folgenden Cloud Identity API-Kennungen 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 \
    --ssh

Ersetzen Sie SERVICE_NAME durch den Namen Ihres Cloud Run-Dienstes. Sie können einen Cloud Run-Dienst 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 Prinzipal-ID des Nutzers, z. B. user:user@example.com oder den Prinzipal der Mitarbeiteridentitätsföderation.

REST API

Senden Sie eine POST-Anfrage an den Endpunkt für Projektrichtlinien:

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 Haupt-ID des Nutzers.
  • PROJECT_NUMBER: die Google CloudProjektnummer, unter der 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 Standorteebene 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 Haupt-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 Haupt-ID des Nutzers
  • PROJECT_NUMBER: die Google Cloud Projektnummer
  • 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 Haupt-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 für Dienstrichtlinien:

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 Haupt-ID des Nutzers
  • PROJECT_NUMBER: die Google Cloud Projektnummer
  • 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.

Verbindung zu einem Dienst herstellen

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 Google Cloud-Projekts

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 starten 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 sich der Installationspfad von gcloud unterscheidet, aktualisieren Sie das Präfix im Pfad ProxyCommand.

    Ersetzen Sie Folgendes:

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

    ssh cloud-run-ssh