Soluciona problemas de Cloud Run con SSH

SSH te permite establecer una conexión de shell interactiva y segura con tus instancias de contenedor en ejecución. Esto proporciona acceso directo al sistema de archivos y al entorno de ejecución del contenedor, lo que te permite inspeccionar los recursos del sistema, verificar las configuraciones y solucionar problemas.

SSH para Cloud Run agrega automáticamente los archivos binarios sshd necesarios al sistema de archivos de tu contenedor. Solo se puede acceder a estos archivos binarios durante la sesión de SSH y se quitan cuando finaliza la sesión. Cloud Run SSH ignora las configuraciones de SSH existentes, incluidas las entradas /etc/passwd, en favor de las configuraciones administradas por Google.

Los avisos de derechos de autor de código abierto de terceros para las dependencias de SSH administradas por Google se activan dentro de tu contenedor cuando se establece una sesión de SSH en la siguiente ruta de acceso: /usr/share/licenses/google_ssh/THIRD_PARTY_NOTICES.

Limitaciones

Se aplican las siguientes limitaciones a SSH:

  • SSH solo está disponible para los servicios que se ejecutan en el entorno de segunda generación de Cloud Run y las instancias de Cloud Run.
  • 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 la instancia del servicio.
  • Windows: PuTTY no es compatible. Usa el cliente de OpenSSH.
  • Se debe tener especial cuidado para proteger el contenedor cuando se usa SSH. Ten en cuenta las prácticas recomendadas de seguridad, como ejecutar el código de la aplicación como un usuario no raíz.

Antes de comenzar

  1. Accede a tu cuenta de Google Cloud . Si es la primera vez que usas Google Cloud, crea una cuenta para evaluar el rendimiento de nuestros productos en situaciones reales. Los clientes nuevos también obtienen $300 en créditos gratuitos para ejecutar, probar y, además, implementar cargas de trabajo.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  5. Verify that billing is enabled for your Google Cloud project.

  6. Habilita la API de Cloud Run Admin, Cloud Resource Manager, Identity-Aware Proxy y Cloud OS Login:
      gcloud services enable run.googleapis.com \
          iap.googleapis.com \
          oslogin.googleapis.com
      
  7. Instala e inicializa gcloud CLI.
  8. Actualiza los componentes, como se indica a continuación:
    gcloud components update
  9. Windows: Asegúrate de que el cliente de OpenSSH esté instalado.

    Por lo general, el cliente de OpenSSH se instala de forma predeterminada en Windows 10 y versiones posteriores. Si no está instalado, puedes instalarlo ejecutando el siguiente comando en PowerShell como administrador:

    Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0

    Para obtener más información, consulta Instala OpenSSH.

  10. Revisa la página de precios de Cloud Run. Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios. SSH factura los bytes de salida de red.
  11. Si tu proyecto usa Controles del servicio de VPC (VPC-SC), ten en cuenta que el proceso de tunelización verifica iaptunnel.googleapis.com como el nombre del servicio, en lugar de run.googleapis.com.

Roles obligatorios

Si quieres obtener los permisos que necesitas para completar estos pasos, 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 a través de roles personalizados o cualquier otro rol predefinido.

Si no eres miembro de la organización a la que pertenece el proyecto, Cloud Run bloqueará el acceso SSH. Para obtener acceso por SSH, agrega el rol roles/compute.osLoginExternalUser o usa un rol personalizado con el permiso compute.oslogin.updateExternalUser.

Puedes otorgar el rol de usuario de túnel protegido con IAP a nivel del proyecto. Para restringir este rol a un servicio o instancia específicos de Cloud Run, ejecuta el siguiente comando:

Para un servicio específico

gcloud beta iap tcp add-iam-policy-binding \
    --resource-type=cloud-run \
    --service=SERVICE \
    --region=REGION \
    --member=MEMBER \
    --role=roles/iap.tunnelResourceAccessor

Reemplaza lo siguiente:

  • SERVICE: El nombre de tu servicio.
  • REGION: Es la región en la que se implementa tu servicio.
  • MEMBER: Es la identidad a la que se otorgará acceso.

Para una instancia específica

gcloud beta iap tcp add-iam-policy-binding \
    --resource-type=cloud-run \
    --instance=INSTANCE \
    --region=REGION \
    --member=MEMBER \
    --role=roles/iap.tunnelResourceAccessor

Reemplaza lo siguiente:

  • INSTANCE: el nombre de tu instancia
  • REGION: Es la región en la que se implementa tu servicio.
  • MEMBER: Es la identidad a la que se otorgará acceso.

Para otorgar el permiso roles/iap.tunnelResourceAccessor a nivel del proyecto y la región, consulta Configura políticas de acceso de IAP.

Usa SSH con los servicios de Cloud Run

Configura el acceso SSH a nivel de servicio y conéctate al servicio con SSH.

Configura el acceso SSH a nivel de servicio

Puedes permitir el acceso de inspección en un servicio específico con gcloud CLI o YAML:

gcloud

Para habilitar el acceso en un servicio existente, usa el siguiente comando:

gcloud beta run services update SERVICE --ssh

También puedes permitir el acceso de inspección a un servicio con la marca --ssh cuando implementes el servicio.

YAML

  1. Si creas un servicio nuevo, omite este paso. Si actualizas un servicio existente, descarga su configuración de YAML:

    gcloud run services describe SERVICE --format export > service.yaml
  2. El siguiente ejemplo contiene la configuración de YAML:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
      labels:
        cloud.googleapis.com/location: REGION
      annotations:
        run.googleapis.com/ssh-enabled: "true"
        run.googleapis.com/launch-stage: BETA
    spec:
      template:
        spec:
          containers:
            image: IMAGE_URL
    

    Reemplaza lo siguiente:

    • SERVICE: El nombre de tu servicio de Cloud Run.
    • REGION: La región Google Cloud , por ejemplo, us-central1
    • IMAGE_URL: Es una referencia a la imagen del contenedor, por ejemplo, us-docker.pkg.dev/cloudrun/container/hello:latest. Si usas Artifact Registry, el repositorio REPO_NAME debe estar creado. La URL sigue el formato de LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG.
  3. Crea o actualiza el servicio con el siguiente comando:

    gcloud run services replace service.yaml

    El comando gcloud run services replace usa de forma predeterminada el archivo service.yaml si está presente.

Puedes inhabilitar el acceso por SSH para cada servicio con gcloud CLI o YAML:

gcloud

Para inhabilitar el acceso al servicio, usa el siguiente comando:

gcloud beta run services update SERVICE --no-ssh

YAML

  1. Si creas un servicio nuevo, omite este paso. Si actualizas un servicio existente, descarga su configuración de YAML:

    gcloud run services describe SERVICE --format export > service.yaml
  2. El siguiente ejemplo contiene la configuración de YAML:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
      labels:
        cloud.googleapis.com/location: REGION
      annotations:
        run.googleapis.com/ssh-enabled: "false"
        run.googleapis.com/launch-stage: BETA
    spec:
      template:
        spec:
          containers:
            image: IMAGE_URL
    

    Reemplaza lo siguiente:

    • SERVICE: El nombre de tu servicio de Cloud Run.
    • REGION: La región Google Cloud , por ejemplo, us-central1
    • IMAGE_URL: Es una referencia a la imagen del contenedor, por ejemplo, us-docker.pkg.dev/cloudrun/container/hello:latest. Si usas Artifact Registry, el repositorio REPO_NAME debe estar creado. La URL sigue el formato de LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG.
  3. Crea o actualiza el servicio con el siguiente comando:

    gcloud run services replace service.yaml

    El comando gcloud run services replace usa de forma predeterminada el archivo service.yaml si está presente.

Conéctate al servicio con SSH

Para conectarte a un servicio con SSH, usa gcloud CLI:

Para conectarte a un servicio con SSH, usa el siguiente comando de Google Cloud CLI:

  gcloud beta run services ssh SERVICE --region=REGION --project=PROJECT_ID

Reemplaza lo siguiente:

  • SERVICE: El nombre de tu servicio.
  • REGION: Es la región en la que se implementa tu servicio.
  • PROJECT_ID: Es el ID del proyecto de Google Cloud .

    Si se te solicita que ingreses una frase de contraseña para la clave SSH, puedes dejarla en blanco. Sin embargo, si ingresas una frase de contraseña, asegúrate de usar la misma para las sesiones de SSH posteriores desde el mismo espacio de trabajo.

    Cuando la sesión de SSH se completa correctamente, Cloud Run muestra el siguiente mensaje:

    Project: my-project
    Region: REGION
    Service: busybox
    Revision: busybox-REVISION
    Instance:
    INSTANCE-ID
    Container: busybox-1
    Image: IMAGE
    

    Para finalizar la sesión de SSH, escribe exit. Los cambios que realices en el contenedor persistirán mientras el contenedor esté activo. Salir de la sesión no reinicia ni detiene el contenedor.

Especifica una instancia de servicio

Para conectarte a una instancia de servicio específica con SSH, usa Google Cloud CLI.

Para conectarte a una instancia de servicio de Cloud Run con SSH, usa el siguiente comando de Google Cloud CLI:

  gcloud beta run services ssh SERVICE --region=REGION --project=PROJECT_ID --instance=INSTANCE_ID

Reemplaza lo siguiente:

  • SERVICE: El nombre de tu servicio.
  • REGION: Es la región en la que se implementa tu servicio.
  • PROJECT_ID: Es el ID del proyecto de Google Cloud .
  • INSTANCE_ID: El ID de la instancia. Para encontrar el ID de la instancia de servicio, ve a la página Registros en la sección Observabilidad. El ID de instancia se encuentra en el campo labels de una entrada de registro. No podrás encontrar el ID de la instancia si la finalizas antes de conectarte a ella.

Cómo especificar una revisión

Para conectarte a una revisión específica con SSH, usa Google Cloud CLI.

Para conectarte a una revisión del servicio de Cloud Run con SSH, usa el siguiente comando de Google Cloud CLI:

  gcloud beta run services ssh SERVICE --region=REGION --project=PROJECT_ID --revision=REVISION

Reemplaza lo siguiente:

  • SERVICE: El nombre de tu servicio.
  • REGION: Es la región en la que se implementa tu servicio.
  • PROJECT_ID: Es el ID del proyecto de Google Cloud .
  • REVISION: Es el nombre de la revisión.

Usa SSH con instancias de Cloud Run

Configurar el acceso SSH a nivel de la instancia y conectarse a ella con SSH

Configura el acceso SSH a nivel de la instancia

SSH está habilitado de forma predeterminada para las instancias.

Puedes inhabilitar el acceso por SSH en cada instancia con gcloud CLI o YAML:

gcloud

Para inhabilitar el acceso en la instancia, usa el siguiente comando:

gcloud beta run instances update INSTANCE --no-ssh

YAML

  1. Si creas una instancia nueva, omite este paso. Si actualizas una instancia existente, descarga su configuración de YAML:

    gcloud beta run instances describe INSTANCE --format export > instance.yaml
  2. El siguiente ejemplo contiene la configuración de YAML:

    apiVersion: run.googleapis.com/v1
    kind: Instance
    metadata:
      name: INSTANCE
      labels:
        cloud.googleapis.com/location: REGION
      annotations:
        run.googleapis.com/ssh-enabled: "false"
        run.googleapis.com/launch-stage: BETA
    spec:
      containers:
        image: IMAGE_URL
    

    Reemplaza lo siguiente:

    • INSTANCE: Es el nombre de tu instancia de Cloud Run.
    • REGION: La región Google Cloud , por ejemplo, us-central1
    • IMAGE_URL: Es una referencia a la imagen del contenedor, como us-docker.pkg.dev/cloudrun/container/hello:latest.
  3. Crea o actualiza la instancia con el siguiente comando:

    gcloud beta run instances replace instance.yaml

Puedes permitir el acceso de inspección en una instancia específica con gcloud CLI o YAML.

gcloud

Para habilitar el acceso en una instancia existente, usa el siguiente comando:

gcloud beta run instances update INSTANCE --ssh

También puedes permitir el acceso de inspección en una instancia con la marca --ssh cuando implementas la instancia.

YAML

  1. Si creas una instancia nueva, omite este paso. Si actualizas una instancia existente, descarga su configuración de YAML:

    gcloud beta run instances describe INSTANCE --format export > instance.yaml
  2. El siguiente ejemplo contiene la configuración de YAML:

    apiVersion: run.googleapis.com/v1
    kind: Instance
    metadata:
      name: INSTANCE
      labels:
        cloud.googleapis.com/location: REGION
      annotations:
        run.googleapis.com/ssh-enabled: "true"
        run.googleapis.com/launch-stage: BETA
    spec:
      containers:
        image: IMAGE_URL
    

    Reemplaza lo siguiente:

    • INSTANCE: Es el nombre de tu instancia de Cloud Run.
    • REGION: La región Google Cloud , por ejemplo, us-central1
    • IMAGE_URL: Es una referencia a la imagen del contenedor, como us-docker.pkg.dev/cloudrun/container/hello:latest.
  3. Crea o actualiza la instancia con el siguiente comando:

    gcloud beta run instances replace instance.yaml

Conéctate a la instancia con SSH

Para conectarte a una instancia con SSH, usa el siguiente comando de Google Cloud CLI:

  gcloud beta run instances ssh INSTANCE --region=REGION --project=PROJECT_ID

Reemplaza lo siguiente:

  • INSTANCE: el nombre de tu instancia
  • REGION: Es la región en la que se implementa tu servicio.
  • PROJECT_ID: Es el ID del proyecto de Google Cloud .

Si se te solicita que ingreses una frase de contraseña para la clave SSH, puedes dejarla en blanco. Sin embargo, si ingresas una frase de contraseña, asegúrate de usar la misma para las sesiones de SSH posteriores desde el mismo espacio de trabajo.

Cuando la sesión de SSH se completa correctamente, Cloud Run muestra el siguiente mensaje:

  Project: my-project
  Region: REGION
  Instance: INSTANCE
  Revision: REVISION
  Container: CONTAINER
  Image: IMAGE

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

Usa el cliente de OpenSSH para conectarte

Para usar tu cliente de OpenSSH para conectarte, haz lo siguiente:

  1. Ejecuta el comando gcloud beta run services ssh en el servicio de destino.
  2. Inicia el túnel SSH y genera el certificado.
  3. Agrega lo siguiente a tu configuración de SSH:

    Host cloud-run-ssh
        HostName cloud-run-default
        User root
        IdentityFile /Users/USER/.ssh/google_compute_engine
        CertificateFile /Users/USER/.ssh/google_compute_engine_cert/PROJECT_ID_REGION_SERVICE-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 /Users/USER/google-cloud-sdk/lib/gcloud.py alpha run start-iap-tunnel --project_number=PROJECT_NUMBER --project_id=PROJECT_ID --workload_type=service --deployment_name=SERVICE --region=REGION
    

    Reemplaza lo siguiente:

    • USER: Es el nombre de usuario en tu máquina local.
    • PROJECT_ID: Es el ID del proyecto de Google Cloud .
    • PROJECT_NUMBER: Es el número del proyecto de Google Cloud .
    • REGION: Es la región en la que se implementa tu servicio.
    • SERVICE: El nombre de tu servicio.

    Si la gcloud CLI está instalada en otra carpeta, es posible que debas actualizar la ubicación en la última línea.

  4. Ejecuta el comando siguiente:

    ssh cloud-run-ssh
    

Tu certificado SSH vence después de cinco minutos. Si intentas establecer una conexión SSH con tu servicio después de cinco minutos, debes volver a ejecutar gcloud beta run services ssh para volver a generar el certificado.

Registros de acceso SSH

Para capturar los registros de auditoría de la administración de claves SSH, debes habilitar los registros de auditoría de la API de Acceso al SO. Consulta Ver los registros de auditoría de Acceso al SO. Para acceder a los registros de SSH de los recursos de Cloud Run, debes tener acceso a los Registros de auditoría de Cloud de ese proyecto.

En el siguiente ejemplo, se consultan todos los servicios de Cloud Run del último día:

gcloud logging read '
  logName="projects/PROJECT_ID/logs/cloudaudit.googleapis.com%2Fdata_access" AND
  protoPayload.serviceName="oslogin.googleapis.com" AND
  protoPayload.request.instance:"run.googleapis.com"
' --project=PROJECT_ID \
  --freshness=1d \
  --format="table(timestamp, protoPayload.authenticationInfo.principalSubject:label=USER, protoPayload.request.instance:label=CLOUD_RUN_SERVICE)"

Acceso SSH seguro y controlado

Puedes controlar quién puede usar SSH y cómo se restringe en tu entorno.

Inhabilita el acceso SSH con políticas de la organización

Para establecer una política de la organización que inhabilite SSH, usa la restricción personalizada que limita la habilitación del acceso de depuración de SSH en los servicios de Cloud Run.

¿Qué sigue?