Conéctate a una VM

Google Distributed Cloud (GDC) air-gapped usa la autenticación SSH basada en claves para establecer conexiones con instancias de máquina virtual (VM) de Linux. De forma predeterminada, las contraseñas no están configuradas para los usuarios locales en las VMs de Linux.

Antes de comenzar

Antes de conectarte a una VM, debes cumplir con los siguientes requisitos previos:

  • Habilita la administración de acceso. No puedes continuar sin que se habilite la administración de acceso en el entorno de invitado. De forma predeterminada, la administración de acceso está habilitada en las VMs nuevas.
  • Habilita el acceso externo a la VM para cualquier par en el puerto 22 del Protocolo de control de transmisión (TCP).
    • En el caso de las VMs de Windows, habilita el acceso externo a la VM en el puerto 3389.
  • Configura un recurso personalizado ProjectNetworkPolicy (PNP) en el proyecto en el que reside la VM.
    • Si configuras un PNP en el proyecto, puedes acceder a la VM fuera del proyecto o la organización.
    • Para diagnosticar si no tienes un PNP, consulta con tu operador de infraestructura (IO).
  • Acceso de inicio de sesión al clúster Sigue los pasos de la CLI en Accede para acceder al clúster.
Para usar los comandos de la interfaz de línea de comandos (CLI) de gdcloud, asegúrate de haber descargado, instalado y configurado la CLI de gdcloud. Todos los comandos de Distributed Cloud usan las CLI de gdcloud o kubectl, y requieren un entorno de Linux.

Obtén la ruta de acceso del archivo kubeconfig

Para ejecutar comandos en el servidor de la API de Management, asegúrate de tener los siguientes recursos:

  1. Accede y genera el archivo kubeconfig para el servidor de la API de Management si no tienes uno.

  2. Usa la ruta de acceso al archivo kubeconfig del servidor de la API de administración para reemplazar MANAGEMENT_API_SERVER en estas instrucciones.

Solicita permisos y acceso

Para realizar las tareas que se indican en esta página, debes tener el rol de administrador de la VM del proyecto. Sigue los pasos para verificar que tienes el rol de administrador de máquinas virtuales del proyecto (project-vm-admin) en el espacio de nombres del proyecto en el que reside la VM.

Para las operaciones de VM con la consola de GDC o la CLI de gdcloud, solicita a tu administrador de IAM del proyecto que te asigne el rol de administrador de máquinas virtuales del proyecto y el rol de visualizador del proyecto (project-viewer).

Establece una conexión a la VM

En esta sección, se describe cómo establecer una conexión con VMs de Linux y Windows.

Conéctate a una VM de Linux

Para establecer una conexión con una VM de Linux, usa la consola de GDC, la CLI de gdcloud o la API de Virtual Machine Manager.

Console

  1. En el menú de navegación, haz clic en Virtual Machines > Instances.

  2. En la lista de VMs, busca la fila de la VM en ejecución a la que deseas conectarte. En la columna Conectar, haz clic en SSH.

  3. Se abrirá una terminal del navegador SSH. Ingresa cualquier comando en la shell o haz clic en FTP para navegar por la estructura de archivos y subir archivos.

gdcloud

Conéctate a una VM con SSH ejecutando el comando gdcloud compute ssh.

gdcloud compute ssh VM_NAME \
  --project=PROJECT_ID

Reemplaza las siguientes variables:

  • VM_NAME: el nombre de la VM.
  • PROJECT_ID: Es el ID del proyecto que contiene la VM.

Si estableciste propiedades predeterminadas para la CLI, puedes omitir la marca --project de este comando. Por ejemplo:

gdcloud compute ssh VM_NAME

API

Conéctate a una VM:

  • Abre una terminal.
  • Crea un par de claves SSH.
  • Sube la clave pública y el nombre de usuario con un valor de tiempo de actividad (TTL).

GDC recupera la clave SSH y el nombre de usuario, y crea una cuenta de usuario con el nombre de usuario. En las VMs de Linux, GDC almacena la clave pública en el archivo ~/.ssh/authorized_keys del usuario en la VM.

Completa los siguientes pasos para conectarte a una VM desde la línea de comandos:

  1. Crea un par de claves SSH y un nombre de usuario.

    En estaciones de trabajo de Linux y macOS, usa la utilidad ssh-keygen para crear un nuevo par de claves SSH. En la siguiente muestra de código, se crea un par de claves RSA (Rivest-Shamir-Adleman):

    ssh-keygen -t rsa \
      -f ~/.ssh/KEY_FILENAME \
      -C USERNAME \
      -b 2048
    

    Reemplaza las variables con las siguientes definiciones.

    VariableDefinición
    KEY_FILENAME El nombre de tu archivo de claves SSH. Por ejemplo, el nombre de archivo my-ssh-key genera un archivo de clave privada llamado my-ssh-key y un archivo de clave pública llamado my-ssh-key.pub.
    USERNAME Tu nombre de usuario en la VM, como testuser o testuser_gmail_com.

    La utilidad ssh-keygen guarda el archivo de claves privadas en la ruta de acceso ~/.ssh/KEY_FILENAME y el archivo de claves públicas en la ruta de acceso ~/.ssh/KEY_FILENAME.pub.

    Una clave pública para el usuario, testuser, es similar al siguiente ejemplo:

    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDAu5kKQCPF... testuser
    
  2. Sube tu clave a la VM y crea un recurso de Kubernetes con tu clave pública, nombre de usuario y valor de tiempo de actividad (TTL) para la clave.

    En el siguiente ejemplo, se usa un archivo access_request.yaml para otorgar acceso a la instancia de VM con la clave privada KEY_FILENAME y un valor de TTL de diez minutos:

    apiVersion: virtualmachine.gdc.goog/v1
    kind: VirtualMachineAccessRequest
    metadata:
      namespace: VM_NAMESPACE
      name: AR_NAME
    spec:
      ssh:
        key: |
          ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDAu5kKQCPF... cloudysanfrancisco
        ttl: 10m
      user: USERNAME
      vm: VM_NAME
    

    Reemplaza las variables con las siguientes definiciones:

    VariableDefinición
    VM_NAMESPACE Es el espacio de nombres de la VM.
    AR_NAME Es el nombre de la solicitud de acceso.
    USERNAME Tu nombre de usuario en la VM, como testuser o testuser_gmail_com.
    VM_NAME Es el nombre de la instancia de VM.
  3. Crea la clave:

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      create -f access_request.yaml
    
  4. Sigue estos pasos para verificar el estado de tu solicitud de acceso:

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      -n VM_NAMESPACE \
      get virtualmachineaccessrequests.virtualmachine.gdc.goog
    

    Reemplaza VM_NAMESPACE por el espacio de nombres de la VM.

    El estado configured indica que puedes conectarte a la VM.

  5. Conéctate a la VM.

    ssh -i PATH_TO_PRIVATE_KEY USERNAME@EXTERNAL_IP
    

    Reemplaza los siguientes valores:

    • PATH_TO_PRIVATE_KEY con la ruta de acceso al archivo de clave SSH privada que corresponde a la clave pública que agregaste a la VM.
    • USERNAME por el nombre de usuario que especificaste cuando creaste la llave SSH. Por ejemplo, cloudysanfrancisco_example_com o cloudysanfrancisco.
    • EXTERNAL_IP con la dirección IP externa del Ingress de la VM.

Soluciona problemas

En esta sección, se describe cómo solucionar los problemas que pueden ocurrir cuando te conectas a una instancia de VM después de crear la solicitud de acceso.

Sigue estos pasos para identificar posibles problemas:

  1. Verifica que la VM se esté ejecutando. Reemplaza las variables editables por tus valores en el siguiente comando:

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      -n VM_NAMESPACE \
      get virtualmachines.virtualmachine.gdc.goog VM_NAME
    

    Si la VM no está en ejecución, no podrás conectarte ni configurar solicitudes nuevas.

  2. Verifica que la VM se haya ejecutado durante unos minutos. Si la VM acaba de iniciarse, es posible que los servicios necesarios para el acceso SSH aún no se estén ejecutando. Por lo general, se ejecutan dentro de los cinco minutos posteriores al inicio.

  3. Verifica que no hayas superado el valor de TTL en la solicitud de acceso. La clave se quita después de que el tiempo alcanza el valor de TTL.

  4. Si tu VirtualMachineAccessRequest muestra el estado configured, verifica los siguientes requisitos:

    1. Habilitaste la transferencia de datos en tu VM en el puerto 22.
    2. Tu máquina se enruta a la VM. Por ejemplo, puedes usar el comando
      curl -vso /dev/null --connect-timeout 5 EXTERNAL_IP:22 para verificar el enrutamiento.
  5. Si tu VirtualMachineAccessRequest muestra el estado failed, consulta el estado completo y revisa el mensaje de error que indica qué causó la falla de la solicitud:

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      -n VM_NAMESPACE \
      describe virtualmachineaccessrequest.virtualmachine.gdc.goog AR_NAME
    

    Reemplaza las variables editables en el comando anterior por tus propios valores.

  6. Si el estado de tu VirtualMachineAccessRequest está en blanco, es posible que el entorno invitado no se esté ejecutando.

Conéctate a una VM de Windows

Para conectarte a una VM de Windows, debes usar el protocolo de escritorio remoto (RDP) a través de una aplicación de escritorio remoto. Para acceder a la VM a través de RDP, necesitas una contraseña que puedes recuperar de la consola de GDC o del recurso personalizado VirtualMachinePasswordResetRequest de la API de Virtual Machine Manager.

Antes de continuar, primero debes instalar el cliente de escritorio remoto. Usa el siguiente vínculo para completar los pasos según tu SO específico. Para acceder al vínculo, necesitas una conexión a Internet.

https://remmina.org/how-to-install-remmina/

Para establecer una conexión a una VM de Windows, sigue estos pasos:

Console

  1. En el menú de navegación, haz clic en Virtual machines > Instances.
  2. En la lista de VMs, busca la VM de Windows en ejecución a la que deseas conectarte.
  3. En la columna Acciones, haz clic en Restablecer contraseña. Aparecerá el cuadro de diálogo Configurar nueva contraseña de Windows.
  4. En el campo Nombre de usuario, ingresa tu nombre de usuario.
  5. Haz clic en Configurar. Aparecerá el cuadro de diálogo Nueva contraseña de Windows con una contraseña generada de forma aleatoria. Esta contraseña contiene caracteres alfanuméricos y no alfanuméricos.
  6. Haz clic en Copiar.
  7. Navega hasta tu cliente de escritorio remoto y selecciona tu nombre de usuario.
  8. En el campo de entrada Contraseña, ingresa tu contraseña.
  9. Presiona INTRO o RETORNO.

API

  1. Genera una clave RSA. Necesitas esta clave para recuperar la contraseña del recurso VirtualMachinePasswordResetRequest.

    openssl genrsa -out private-key.pem 2048
    # Get the RSA public key
    openssl rsa -in private-key.pem -outform PEM -pubout
    
  2. Crea un archivo YAML.

  3. Sube la clave RSA que generaste, el nombre de la VM y un nombre de usuario que le asignes para acceder al cliente de escritorio remoto:

    apiVersion: virtualmachine.gdc.goog/v1
    kind: VirtualMachinePasswordResetRequest
    metadata:
      namespace: VM_NAMESPACE
      name: PRR_NAME
    spec:
      vmName: VM_NAME
      user: USERNAME
      publicKey: PUBLIC_KEY
    

    Reemplaza las variables con las siguientes definiciones:

    Variable Definición
    VM_NAMESPACE Es el nombre del espacio de nombres en el que reside la VM.
    PRR_NAME Es el nombre que le asignas a la solicitud para restablecer la contraseña. Por ejemplo, vmprr2.
    VM_NAME El nombre de la VM Por ejemplo, vm-test.
    USERNAME Nombre de usuario que proporcionas para acceder a la VM con el cliente de escritorio remoto. Por ejemplo, test-user.
    PUBLIC_KEY La clave RSA que generaste en el paso 2 Debes darle formato a PUBLIC_KEY en varias líneas.

    En el siguiente ejemplo, se muestra un archivo YAML con los valores y el formato necesarios para realizar una solicitud de restablecimiento de contraseña:

    apiVersion: virtualmachine.gdc.goog/v1
    kind: VirtualMachinePasswordResetRequest
    metadata:
      namespace: test-namespace
      name: vmprr2
    spec:
      vmName: vm2
      user: test-user
      publicKey: |-
       -----BEGIN PUBLIC KEY-----
    
       # Input the RSA key data in multi-line format.
    
       -----END PUBLIC KEY-----
    
  4. Aplica el contenido del archivo:

    kubectl --kubeconfig=MANAGEMENT_API_SERVER \
      apply -f FILENAME
    

    Reemplaza FILENAME por el nombre del archivo de la solicitud de restablecimiento de contraseña.

  5. Consulta el estado del recurso VirtualMachinePasswordResetRequest. Siempre que la VM esté en estado Running, el recurso generará la contraseña en un minuto o menos.

    kubectl --kubeconfig=MANAGEMENT_API_SERVER \
      -n VM_NAMESPACE \
      describe virtualmachinepasswordresetrequest.virtualmachine.gdc.goog PRR_NAME
    

    Ubica el campo status.encryptedPassword que contiene la contraseña generada.

  6. Copia el valor en status.encryptedPassword y desencripta la contraseña generada:

    echo ENCRYPTED_PASSWORD | base64 -d > PASSWORD_FILENAME
    openssl pkeyutl -decrypt -in PASSWORD_FILENAME -inkey private-key.pem \
      -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha512 -pkeyopt rsa_mgf1_md:sha512
    

    Reemplaza lo siguiente:

    • ENCRYPTED_PASSWORD: Es la contraseña generada del campo status.encryptedPassword.
    • PASSWORD_FILENAME: Es un archivo temporal para almacenar la contraseña decodificada en Base64.

    Luego, verás la contraseña descifrada como resultado para conectarte a la VM a través de RDP.

  7. Abre el cliente de escritorio remoto y haz clic en Remote Connection Profile. Verás un diálogo de conexión.

  8. En la pestaña Básico, ingresa tus valores en los siguientes campos:

    • Servidor: Es la dirección IP de entrada del estado de acceso externo de la VM con el número de puerto de acceso externo de la VM anexado. Para recuperar la dirección IP de entrada, consulta Ingress.
    • Nombre de usuario: Es el nombre de usuario que especificaste en la solicitud de restablecimiento de contraseña. Por ejemplo, test-user
    • Contraseña: La contraseña generada que descifraste del estado de la solicitud para restablecer la contraseña.
  9. Haz clic en Guardar y conectar.