Usa SSH para Cloud Run

En esta página, se describe cómo usar SSH para conectarse a los servicios de Cloud Run a través del reenvío de TCP de Identity-Aware Proxy (IAP).

Si proteges tus conexiones SSH con IAP, puedes depurar instancias de contenedor individuales en un entorno seguro.

Antes de comenzar

  1. Asegúrate de que el servicio de Cloud Run se ejecute en un entorno de ejecución de segunda generación y de que incluya las herramientas de depuración que necesitas para ejecutar comandos una vez que te conectes. Para obtener más información, consulta entornos de ejecución.

  2. Para asegurarte de usar la versión más reciente de Google Cloud CLI, ejecuta el siguiente comando:

    gcloud components update
    
  3. Habilita las APIs de Cloud Run, Cloud Resource Manager, Acceso al SO de Cloud y Identity-Aware Proxy en tu proyecto.

    Para habilitar las APIs, ejecuta el siguiente comando:

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

Roles obligatorios

Para obtener los permisos que necesitas para configurar políticas y conectarte a las cargas de trabajo, pídele a tu administrador que te otorgue los siguientes roles de IAM:

Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.

También puedes obtener los permisos necesarios mediante roles personalizados o cualquier otro rol predefinido.

Limitaciones

SSH para Cloud Run tiene las siguientes limitaciones:

  • Solo se admiten instancias y servicios de Cloud Run.

  • Para los servicios, solo se admite el entorno de ejecución de segunda generación.

  • No se admiten los trabajos de Cloud Run.

  • No se admiten los grupos de trabajadores.

  • Cuando se usa SSH, se reemplazan las claves de host de la imagen. Las claves permanecen reemplazadas después de que finaliza la sesión de SSH, hasta que se reinicia el servicio.

  • Windows: PuTTY no es compatible. Usa el cliente de OpenSSH.

Configura las políticas de autorización de IAP

Puedes administrar el acceso a los recursos de Cloud Run a nivel de proyecto, región o servicio con gcloud CLI o la API de REST de IAP.

Puedes configurar políticas para los siguientes identificadores de la API de Cloud Identity:

  • Cloud Identity: por ejemplo, user:EMAIL@example.com

  • Federación de identidades de personal: por ejemplo: principal://iam.googleapis.com/locations/global/workforcePools/ <var>POOL_ID</var>/subject/<var>SUBJECT_ATTRIBUTE_VALUE</var>

Para obtener más información y ejemplos de tipos de principales, consulta la lista de identificadores de principales.

Actualiza un servicio de Cloud Run existente

Para actualizar el servicio y habilitar SSH, ejecuta el siguiente comando:

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

Reemplaza lo siguiente:

  • SERVICE_NAME: El nombre de tu servicio de Cloud Run.

  • LOCATION: Es la región de Google Cloud en la que se implementa el servicio (por ejemplo, us-central1).

También puedes implementar un servicio de Cloud Run agregando --ssh a gcloud beta run deploy.

Otorga acceso a todos los recursos de Cloud Run en un proyecto

Para administrar el acceso a todos los recursos de un proyecto, aplica la vinculación de la política de IAM a nivel del proyecto.

gcloud

Ejecuta el comando siguiente:

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

Reemplaza USER por el identificador principal del usuario, por ejemplo, user:user@example.com o la principal de la federación de identidades de personal.

API de REST

Envía una solicitud POST al extremo de la política del proyecto:

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"

Reemplaza lo siguiente:

  • USER: Es el identificador principal del usuario.

  • PROJECT_NUMBER: Es el número del proyecto de Google Cloud en el que se alojan los recursos.

Otorga acceso a todos los recursos de Cloud Run en una ubicación específica

Para restringir el acceso a todos los recursos dentro de una región específica (por ejemplo, us-central1), aplica la vinculación de la política a nivel de la ubicación.

gcloud

Ejecuta el siguiente comando:

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

Reemplaza lo siguiente:

  • USER: Es el identificador principal del usuario.

  • LOCATION: Es la región de Google Cloud en la que se implementan los recursos (por ejemplo, us-central1).

API de REST

Envía una solicitud POST al extremo de la política de ubicación:

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"

Reemplaza lo siguiente:

  • USER: Es el identificador principal del usuario.

  • PROJECT_NUMBER: el número del proyecto de Google Cloud

  • LOCATION: La región Google Cloud

Otorga acceso a un servicio de Cloud Run específico

Para restringir el acceso a un solo servicio con nombre en tu proyecto, aplica la vinculación de la política a nivel del servicio.

gcloud

Ejecuta el siguiente comando:

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

Reemplaza lo siguiente:

  • USER: Es el identificador principal del usuario.

  • SERVICE_NAME: Es el nombre de la lógica de servicio a la que te conectarás.

  • LOCATION: Es la región de Google Cloud en la que se implementa el servicio.

API de REST

Envía una solicitud POST al extremo de la política de servicio:

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"

Reemplaza lo siguiente:

  • USER: Es el identificador principal del usuario.

  • PROJECT_NUMBER: el número del proyecto de Google Cloud

  • LOCATION: La región Google Cloud

  • SERVICE_NAME: Es el nombre del servicio.

Conectarse mediante SSH

Para establecer un túnel SSH a un recurso de Cloud Run, debes usar la CLI de gcloud.

Conéctate a un servicio

Ejecuta el comando siguiente:

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

Reemplaza lo siguiente:

  • SERVICE_NAME: el nombre del servicio al que se conectará

  • LOCATION: Es la región de Google Cloud en la que reside el servicio.

  • PROJECT_ID: Es el ID de tu proyecto de Google Cloud.

Sal de la sesión.

Para finalizar la sesión de SSH, escribe exit.

Cualquier modificación que realices en el contenedor persistirá solo mientras este se mantenga activo. Salir de la sesión no detiene ni reinicia el contenedor automáticamente.

Usa un cliente de OpenSSH local

Para usar un cliente de OpenSSH local para las conexiones, haz lo siguiente:

  1. Para iniciar el túnel SSH y generar el certificado necesario, ejecuta el siguiente comando:

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

    Reemplaza lo siguiente:

    • SERVICE_NAME: Es el nombre del servicio.

    • LOCATION: La región Google Cloud

    • PROJECT_ID: Es el ID del proyecto de Google Cloud .

  2. Agrega el siguiente código de configuración a tu archivo ~/.ssh/config local:

    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_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/revisions/REVISION --region=LOCATION --iap-tunnel-url-override=wss://LOCATION.ssh.run.app/v4
    

    Si la ruta de instalación de gcloud es diferente, actualiza el prefijo en la ruta de acceso de ProxyCommand.

    Reemplaza lo siguiente:

    • PROJECT_ID: Es el ID del proyecto de Google Cloud .

    • LOCATION: La región Google Cloud

    • SERVICE_NAME: Es el nombre del servicio.

    • REVISION: el nombre de la revisión

    • PROJECT_NUMBER: Es el número del proyecto de Google Cloud .

  3. Conéctate al servicio con OpenSSH:

    ssh cloud-run-ssh