Soluciona problemas de acceso al SO


En este documento, se describe cómo solucionar problemas de Acceso al SO mediante el servidor de metadatos. Para obtener información sobre la configuración de Acceso al SO o si quieres obtener instrucciones paso a paso, consulta Configura Acceso al SO.

Puedes consultar el servidor de metadatos desde una instancia de máquina virtual (VM). Para obtener más información, consulta la sección sobre cómo almacenar y recuperar metadatos de instancias.

Antes de comenzar

  • Si aún no lo hiciste, configura la autenticación. La autenticación es el proceso mediante el cual se verifica tu identidad para acceder a los servicios y las API de Google Cloud. Para ejecutar código o muestras desde un entorno de desarrollo local, puedes autenticarte en Compute Engine seleccionando una de las siguientes opciones:

    Select the tab for how you plan to use the samples on this page:

    Console

    When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    gcloud

    1. Install the Google Cloud CLI, then initialize it by running the following command:

      gcloud init
    2. Set a default region and zone.
    3. REST

      Para usar las muestras de la API de REST en esta página en un entorno de desarrollo local, debes usar las credenciales que proporcionas a la CLI de gcloud.

        Install the Google Cloud CLI, then initialize it by running the following command:

        gcloud init

      Si deseas obtener más información, consulta Autentica para usar REST en la documentación de autenticación de Google Cloud.

Mensajes de error comunes:

Los siguientes son ejemplos de errores comunes que pueden surgir cuando usas Acceso al SO.

No se puede encontrar el nombre del grupo

En algunas instancias que usan Acceso al SO, es posible que recibas el siguiente mensaje de error después de establecer la conexión:

/usr/bin/id: cannot find name for group ID 123456789

Ignora este mensaje de error. Este error no afecta tus VMs.

Error en la obtención de grupos

Es posible que veas registros similares a los siguientes cuando crees VMs:

Dec 10 22:31:05 instance-1 google_oslogin_nss_cache[381]: oslogin_cache_refresh[381]: Refreshing group entry cache
Dec 10 22:31:05 instance-1 google_oslogin_nss_cache[381]: oslogin_cache_refresh[381]: Failure getting groups, quitting

Estos registros indican que tu organización no tiene configurados grupos de Linux de Acceso al SO. Ignora estos mensajes.

Precondición con errores

Es posible que veas un error similar al siguiente cuando te conectes a la VM mediante SSH:

ERROR: (gcloud.compute.ssh) FAILED_PRECONDITION: The specified username or UID is not unique within given system ID.

Este error se produce cuando el Acceso al SO intenta generar un nombre de usuario que ya existe dentro de una organización. Esto es común cuando se borra una cuenta de usuario y se crea un usuario nuevo con la misma dirección de correo electrónico poco después. Cuando se borra una cuenta de usuario, pueden pasar hasta 48 horas para que se quite la información POSIX del usuario.

Para solucionar este problema, realiza una de las siguientes acciones:

Argumento no válido

Es posible que veas errores similares al siguiente cuando te conectes a una VM con SSH o uses SCP para transferir archivos:

ERROR: (gcloud.compute.ssh) INVALID_ARGUMENT: Login profile size exceeds 32 KiB. Delete profile values to make additional space.
ERROR: (gcloud.compute.scp) INVALID_ARGUMENT: Login profile size exceeds 32 KiB. Delete profile values to make additional space.

Para resolver estos errores, haz lo siguiente:

  1. Ejecuta el comando gcloud compute os-login describe-profile para ver tu perfil de Acceso al SO:

    gcloud compute os-login describe-profile
    

    El resultado es similar al siguiente:

    name: '00000000000000'
    posixAccounts:
    ...
    sshPublicKeys:
     ...:
       fingerprint: ...
       key: |
         ssh-rsa AAAAB3NzaC1yc2...
       name: ...
     ...
    
  2. Revisa el resultado para identificar las claves SSH que no se usen.

  3. Quita las claves sin usar del resultado con el comando gcloud compute os-login ssh-keys remove:

    gcloud compute os-login ssh-keys remove --key=KEY
    

    Reemplaza KEY por la huella digital de las claves o la cadena de claves.

Para evitar que este problema ocurra en el futuro, agrega una hora de vencimiento para las claves SSH. Las claves vencidas se quitan automáticamente de tu perfil de acceso 48 horas después de su vencimiento o cuando agregas una clave nueva a tu perfil.

Código de respuesta HTTP: 503

Es posible que veas el siguiente error cuando intentes conectarte a una VM mediante SSH:

Failed to validate organization user USERNAME has login permission, got HTTP response code: 503

Este problema se debe al límite de frecuencia del servidor de metadatos de 100 consultas por segundo por instancia de máquina virtual. Este límite no se puede ajustar. Para resolver este problema, espera unos segundos y, luego, vuelve a intentar la conexión.

Para evitar este problema en el futuro, prueba lo siguiente:

  • Implementa un mecanismo de reintento en el código de la aplicación. Para obtener más información, consulta
  • Reutilizar las conexiones SSH existentes.
  • Envía comandos por lotes para reducir las conexiones SSH y las consultas de metadatos de Acceso al SO.

Entradas de metadatos predeterminados de Acceso al SO

Compute Engine define un conjunto de entradas de metadatos predeterminados que proporcionan información sobre el Acceso al SO. El servidor siempre define y establece los metadatos predeterminados. Las claves de metadatos predeterminadas distinguen entre mayúsculas y minúsculas.

En la siguiente tabla, se describen las entradas que puedes consultar.

Relativo a http://metadata.google.internal/computeMetadata/v1/
Entrada de metadatos Descripción
project/attributes/enable-oslogin Comprueba si el Acceso al SO está habilitado en el proyecto actual de Google Cloud.
instance/attributes/enable-oslogin Comprueba si el Acceso al SO está habilitado en la VM actual.
oslogin/users/ Recupera información de perfil para los usuarios del Acceso al SO. Puedes pasar parámetros de consulta como username, uid, pagesize y pagetoken.
oslogin/authorize/

Recupera la configuración de permisos de nivel administrativo o de acceso para un usuario del Acceso al SO.

Para verificar un permiso, debes especificar el parámetro de consulta policy. El valor del parámetro de política debe establecerse en login (para verificar el permiso de acceso) o adminLogin (para verificar el acceso sudo).

Comprueba si el Acceso al SO está configurado

Usa la consola de Google Cloud o la CLI de Google Cloud para consultar los metadatos a fin de determinar si el Acceso al SO está habilitado. El Acceso al SO se habilita cuando la clave de metadatos enable-oslogin se configura como TRUE en los metadatos del proyecto o la instancia. Si se configuran los metadatos de la instancia y del proyecto, el valor establecido en los metadatos de la instancia tiene prioridad.

Visualiza los usuarios del Acceso al SO

Para ver la información del perfil de varios usuarios, debes especificar los parámetros pagesize y pagetoken. Reemplaza pagesize y pagetoken por el valor numérico requerido.

curl "http://metadata.google.internal/computeMetadata/v1/oslogin/users?pagesize=PAGE_SIZE&
pagetoken=PAGE_TOKEN" -H "Metadata-Flavor: Google"

Por ejemplo, para configurar pagesize en 1 y pagetoken en 0, ejecuta el siguiente comando:

curl "http://metadata.google.internal/computeMetadata/v1/oslogin/users?pagesize=1&pagetoken=0" -H "Metadata-Flavor: Google"

En la mayoría de las distribuciones, también puedes ejecutar el comando getent passwd de Unix para recuperar las entradas de contraseña de los usuarios de la organización.

Visualiza un usuario específico del Acceso al SO

Para ver la información de perfil de un usuario específico en tu VM, ejecuta el siguiente comando:

curl "http://metadata.google.internal/computeMetadata/v1/oslogin/users?username=USERNAME" -H "Metadata-Flavor: Google"

Reemplaza USERNAME por el nombre de usuario del usuario que deseas consultar.

Por ejemplo, puedes realizar una solicitud para buscar el usuario user_example_com. El siguiente comando y el resultado muestran el formato agregado para mejorar la legibilidad.

curl "http://metadata.google.internal/computeMetadata/v1/oslogin/users?username=user_example_com" -H "Metadata-Flavor: Google"

El resultado es similar al siguiente:

{
    "loginProfiles": [{
        "name": "12345678912345",
        "posixAccounts": [{
            "primary": true,
            "username": "user_example_com",
            "uid": "123451",
            "gid": "123451",
            "homeDirectory": "/home/user_example_com",
            "operatingSystemType": "LINUX"
        }],
        "sshPublicKeys": {
            "204c4b4fb...": {
                "key": "ssh-rsa AAAAB3Nz...",
                "fingerprint": "204c4b4fb..."
            }
        }
    }]
}

En la mayoría de las distribuciones, también puedes ejecutar comandos de Unix como getent passwd username o getent passwd uid para recuperar la información de perfil.

Para recuperar las claves SSH de un usuario, también puedes ejecutar /usr/bin/google_authorized_keys USERNAME. Si no se muestran claves, es posible que el usuario no tenga los permisos necesarios para acceder a la VM.

Comprueba los permisos de acceso

Para ver los permisos de nivel administrativo y de acceso, debes proporcionar los parámetros de consulta policy=login&email=LOGIN_NAME.

  1. Consulta el perfil del usuario para obtener el valor del campo name:

    curl "http://metadata.google.internal/computeMetadata/v1/oslogin/users?username=user_example_com" -H "Metadata-Flavor: Google"
  2. En el resultado, toma nota del name.

  3. Ejecuta el siguiente comando de login con el valor de name:

    curl "http://metadata.google.internal/computeMetadata/v1/oslogin/authorize?policy=login&email=LOGIN_NAME" -H "Metadata-Flavor: Google"
    

Por ejemplo, puedes consultar los permisos de acceso para el usuario user_example_com que se vio en la sección anterior.

curl "http://metadata.google.internal/computeMetadata/v1/oslogin/authorize?policy=login&email=12345678912345" -H "Metadata-Flavor: Google"

El resultado del comando indica que el usuario está autorizado para acceder a la VM:

{"success":true}

Comprueba si tu VM tiene una cuenta de servicio

Puedes consultar el servidor de metadatos para encontrar la cuenta de servicio asociada con tu VM. En tu VM, ejecuta el siguiente comando:

curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/" -H "Metadata-Flavor: Google"

El resultado es similar al siguiente:

12345-sa@developer.gserviceaccount.com/
default/

Si no se encuentra una cuenta de servicio, el resultado está en blanco.

Cómo depurar problemas de acceso al SO con gcpdiag

gcpdiag es una herramienta de código abierto. No es un producto de Google Cloud compatible oficialmente. Puedes usar la herramienta gcpdiag para identificar y corregir problemas del proyecto de Google Cloud. Para obtener más información, consulta el proyecto en GitHub.

En este runbook de gcpdiag, se investigan las posibles causas de los problemas de acceso SSH en las VMs de Windows y Linux en Google Cloud. Se enfoca en lo siguiente:
  • Estado de la VM: Verifica si la VM se está ejecutando y si tiene recursos suficientes (CPU, memoria y disco).
  • Permisos: Se asegura de que tengas los permisos de IAM correctos para configurar claves SSH.
  • Configuración de la VM: Verifica que las claves SSH y otros metadatos estén configurados correctamente.
  • Reglas de red: Revisa las reglas de firewall para confirmar que se permite el tráfico SSH.
  • SO invitado: Busca problemas internos del SO que puedan bloquear SSH.

Consola de Google Cloud

  1. Completa y, luego, copia el siguiente comando.
  2. gcpdiag runbook gce/ssh \
        --parameter project_id=PROJECT_ID \
        --parameter name=VM_NAME \
        --parameter zone=ZONE \
        --parameter principal=PRINCIPAL \
        --parameter tunnel_through_iap=IAP_ENABLED \
        --parameter local_user=LOCAL_USER \
        --parameter check_os_login=CHECK_OS_LOGIN \
        --parameter check_ssh_in_browser=CHECK_SSH_IN_BROWSER
  3. Abre la consola de Google Cloud y activa Cloud Shell.
  4. Abre la consola de Cloud
  5. Pega el comando copiado.
  6. Ejecuta el comando gcpdiag, que descarga la imagen de Docker gcpdiag y, luego, realiza verificaciones de diagnóstico. Si corresponde, sigue las instrucciones de salida para corregir las verificaciones que fallaron.

Docker

Puedes ejecutar gcpdiag con un wrapper que inicie gcpdiag en un contenedor de Docker. Se debe instalar Docker o Podman.

  1. Copia y ejecuta el siguiente comando en tu estación de trabajo local.
    curl https://gcpdiag.dev/gcpdiag.sh >gcpdiag && chmod +x gcpdiag
  2. Ejecuta el comando gcpdiag.
    ./gcpdiag runbook gce/ssh \
        --parameter project_id=PROJECT_ID \
        --parameter name=VM_NAME \
        --parameter zone=ZONE \
        --parameter principal=PRINCIPAL \
        --parameter tunnel_through_iap=IAP_ENABLED \
        --parameter local_user=LOCAL_USER \
        --parameter check_os_login=CHECK_OS_LOGIN \
        --parameter check_ssh_in_browser=CHECK_SSH_IN_BROWSER

Consulta los parámetros disponibles para este runbook.

Reemplaza lo siguiente:

  • PROJECT_ID: Es el ID del proyecto que contiene el recurso.
  • VM_NAME: Es el nombre de la VM de destino dentro de tu proyecto.
  • ZONE: Es la zona en la que se encuentra la VM de destino.
  • PRINCIPAL: El principal de la cuenta de servicio o de usuario que inicia la conexión SSH. Para la autenticación basada en claves, usa el usuario que autenticó la herramienta de línea de comandos de Cloud Shell o accediste a la consola de Google Cloud. Para la identidad temporal como cuenta de servicio, usa el correo electrónico de la cuenta de servicio.
  • IAP_ENABLED: Es un valor booleano (verdadero o falso) que indica si se usa Identity-Aware Proxy para establecer la conexión SSH. Predeterminada: true
  • LOCAL_USER:Es el usuario Posix en la VM.
  • CHECK_OS_LOGIN: Es un valor booleano (verdadero o falso) que indica si se debe usar el Acceso al SO para la autenticación de SSH.
  • CHECK_SSH_IN_BROWSER:Un valor booleano para verificar que SSH en el navegador sea factible.

Marcas útiles:

Para obtener una lista y una descripción de todas las marcas de la herramienta gcpdiag, consulta las instrucciones de uso de gcpdiag.

¿Qué sigue?