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 contenedores individuales en un entorno seguro.

Antes de comenzar

  1. Asegúrate de que tu servicio de Cloud Run se ejecute en un entorno de ejecución de segunda generación y que incluya las herramientas de depuración que necesites para ejecutar comandos una vez que te conectes. Para obtener más información, consulta entornos de ejecución.
  2. Para asegurarte de que usas 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, Cloud OS Login 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 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 los servicios y las instancias de Cloud Run.
  • En el caso de 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 en la imagen. Las claves permanecen sobrescritas después de que finaliza la sesión de SSH, hasta que se reinicia el servicio.
  • Windows: No se admite PuTTY. Usa el cliente de OpenSSH.

Configura políticas de autorización de IAP

Puedes administrar el acceso a los recursos de Cloud Run a nivel del proyecto, la región o el 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 existente de Cloud Run

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

gcloud beta run services update \
    SERVICE_NAME \
    --ssh

Reemplaza SERVICE_NAME por el nombre de tu servicio de Cloud Run. 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 políticas 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 Google Clouden 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 políticas 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: La región 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 Google Cloud
  • LOCATION: La Google Cloud región

Otorga acceso a un servicio específico de Cloud Run

Para restringir el acceso a un solo servicio con nombre en tu proyecto, aplica la vinculación de políticas 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 se conectará.
  • LOCATION: Es la Google Cloud región 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 Google Cloud
  • LOCATION: La Google Cloud región
  • SERVICE_NAME: 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: La Google Cloud región en la que reside el servicio
  • PROJECT_ID: Es el ID de tu proyecto de Google Cloud.

Cómo salir de la sesión

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

Las modificaciones que realices en el contenedor solo persistirán mientras el contenedor se mantenga activo. Salir de tu sesión no detiene ni reinicia el contenedor automáticamente.

Usa un cliente 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: el nombre del servicio
    • LOCATION: La Google Cloud región
    • PROJECT_ID: ID de tu 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_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
    

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

    Reemplaza lo siguiente:

    • PROJECT_ID: ID del proyecto de Google Cloud
    • LOCATION: La Google Cloud región
    • SERVICE_NAME: el nombre del servicio
    • PROJECT_NUMBER: Es el número de tu proyecto de Google Cloud .
  3. Conéctate al servicio con OpenSSH:

    ssh cloud-run-ssh