Ligue-se a uma VM

O Google Distributed Cloud (GDC) air-gapped usa a autenticação SSH baseada em chaves para estabelecer ligações a instâncias de máquinas virtuais (VMs) do Linux. Por predefinição, as palavras-passe não estão configuradas para utilizadores locais em VMs Linux.

Antes de começar

Antes de estabelecer ligação a uma VM, tem de cumprir os seguintes pré-requisitos:

  • Ative a gestão de acesso. Não pode continuar sem a gestão de acesso ativada no ambiente de convidado. Por predefinição, a gestão de acesso está ativada em novas VMs.
  • Ative o acesso externo da VM para qualquer par na porta 22 do Protocolo de controlo de transmissão (TCP).
    • Para VMs do Windows, ative o acesso externo da VM na porta 3389.
  • Configure um recurso personalizado ProjectNetworkPolicy (PNP) no projeto onde a VM reside.
    • Ao configurar um PNP no projeto, pode aceder à VM fora do projeto ou da organização.
    • Para diagnosticar se não tem um PNP, pergunte ao seu operador de infraestrutura (IO).
  • Acesso de início de sessão ao cluster. Siga os passos da CLI em Iniciar sessão para iniciar sessão no cluster.
Para usar os comandos da interface de linhas de comando (CLI) gdcloud, certifique-se de que transferiu, instalou e configurou a CLI gdcloud. Todos os comandos para a nuvem distribuída usam a CLI gdcloud ou kubectl e requerem um ambiente Linux.

Obtenha o caminho do ficheiro kubeconfig

Para executar comandos no servidor da API Management, certifique-se de que tem os seguintes recursos:

  1. Inicie sessão e gere o ficheiro kubeconfig para o servidor da API Management, se não tiver um.

  2. Use o caminho para o ficheiro kubeconfig do servidor da API de gestão para substituir MANAGEMENT_API_SERVER nestas instruções.

Peça autorizações e acesso

Para realizar as tarefas indicadas nesta página, tem de ter a função de administrador da máquina virtual do projeto. Siga os passos para validar que tem a função de administrador de máquinas virtuais do projeto (project-vm-admin) no espaço de nomes do projeto onde a VM reside.

Para operações de VM que usam a consola do GDC ou a CLI gdcloud, peça ao administrador de IAM do projeto para lhe atribuir a função de administrador de máquinas virtuais do projeto e a função de visualizador do projeto (project-viewer).

Estabeleça uma ligação de VM

Esta secção descreve como estabelecer uma ligação a VMs do Linux e Windows.

Estabeleça ligação a uma VM do Linux

Para estabelecer uma ligação a uma VM do Linux, use a consola do GDC, a CLI gdcloud ou a API Virtual Machine Manager.

Consola

  1. No menu de navegação, clique em Máquinas virtuais > Instâncias.

  2. Na lista de VMs, encontre a linha da VM em execução à qual quer estabelecer ligação. Na coluna Ligar, clique em SSH.

  3. É aberto um terminal do navegador SSH. Introduza qualquer comando na shell ou clique em FTP para navegar na estrutura de ficheiros e carregar ficheiros.

gdcloud

Estabeleça ligação a uma VM através de SSH executando o comando gdcloud compute ssh

gdcloud compute ssh VM_NAME \
  --project=PROJECT_ID

Substitua as seguintes variáveis:

  • VM_NAME: o nome da VM.
  • PROJECT_ID: o ID do projeto que contém a VM.

Se tiver definido propriedades predefinidas para a CLI, pode omitir a flag --project deste comando. Por exemplo:

gdcloud compute ssh VM_NAME

API

Ligue-se a uma VM:

  • Abra um terminal.
  • Crie um par de chaves SSH.
  • Carregue a chave pública e o nome de utilizador com um valor de tempo de vida (TTL).

O GDC obtém a chave SSH e o nome de utilizador e cria uma conta de utilizador com o nome de utilizador. Nas VMs Linux, o GDC armazena a chave pública no ficheiro ~/.ssh/authorized_keys do utilizador na VM.

Conclua os passos seguintes para estabelecer ligação a uma VM a partir da linha de comandos:

  1. Crie um par de chaves SSH e um nome de utilizador.

    Em estações de trabalho Linux e macOS, use o utilitário ssh-keygen para criar um novo par de chaves SSH. O exemplo de código seguinte cria um par de chaves RSA (Rivest–Shamir–Adleman):

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

    Substitua as variáveis usando as seguintes definições.

    VariávelDefinição
    KEY_FILENAME O nome do ficheiro da chave SSH. Por exemplo, o nome do ficheiro my-ssh-key gera um ficheiro de chave privada denominado my-ssh-key e um ficheiro de chave pública denominado my-ssh-key.pub.
    USERNAME O seu nome de utilizador na VM, como testuser ou testuser_gmail_com.

    O utilitário ssh-keygen guarda o ficheiro de chave privada no caminho ~/.ssh/KEY_FILENAME e o ficheiro de chave pública no caminho ~/.ssh/KEY_FILENAME.pub.

    Uma chave pública para o utilizador, testuser, é semelhante ao seguinte exemplo:

    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDAu5kKQCPF... testuser
    
  2. Carregue a chave para a VM e crie um recurso do Kubernetes com a chave pública, o nome de utilizador e o valor de tempo de vida (TTL) da chave.

    O exemplo seguinte usa um ficheiro access_request.yaml para conceder acesso à instância de VM com a chave privada KEY_FILENAME e um valor de TTL de dez 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
    

    Substitua as variáveis com as seguintes definições:

    VariávelDefinição
    VM_NAMESPACE O espaço de nomes da VM.
    AR_NAME O nome do pedido de acesso.
    USERNAME O seu nome de utilizador na VM, como testuser ou testuser_gmail_com.
    VM_NAME O nome da instância de VM.
  3. Crie a chave:

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      create -f access_request.yaml
    
  4. Verifique o estado do seu pedido de acesso:

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

    Substitua VM_NAMESPACE pelo espaço de nomes da VM.

    Um estado configured indica que pode estabelecer ligação à VM.

  5. Estabeleça ligação à VM:

    ssh -i PATH_TO_PRIVATE_KEY USERNAME@EXTERNAL_IP
    

    Substitua os seguintes valores:

    • PATH_TO_PRIVATE_KEY com o caminho para o ficheiro de chave SSH privada que corresponde à chave pública que adicionou à VM.
    • USERNAME com o nome de utilizador que especificou quando criou a chave SSH. Por exemplo, cloudysanfrancisco_example_com ou cloudysanfrancisco.
    • EXTERNAL_IP com o endereço IP de entrada externo da VM.

Resolução de problemas

Esta secção descreve como resolver problemas que podem ocorrer ao estabelecer ligação a uma instância de VM após a criação do pedido de acesso.

Siga os passos seguintes para identificar possíveis problemas:

  1. Verifique se a VM está em execução. Substitua as variáveis editáveis pelos seus valores no seguinte comando:

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

    Se a VM não estiver em execução, não pode estabelecer ligação nem configurar novos pedidos.

  2. Verifique se a VM está em execução há alguns minutos. Se a VM tiver sido iniciada recentemente, os serviços necessários para o acesso SSH podem ainda não estar em execução. Normalmente, são executados no prazo de cinco minutos após o arranque.

  3. Verifique se não excedeu o valor de TTL no pedido de acesso. A chave é removida quando o tempo atinge o valor TTL.

  4. Se o ícone VirtualMachineAccessRequest apresentar o estado configured, verifique os seguintes requisitos:

    1. Ativou a transferência de dados para a sua VM na porta 22.
    2. A sua máquina encaminha para a MV. Por exemplo, pode usar o comando
      curl -vso /dev/null --connect-timeout 5 EXTERNAL_IP:22 para verificar o encaminhamento.
  5. Se o seu VirtualMachineAccessRequest apresentar o estado failed, veja o estado completo e reveja a mensagem de erro que indica o que causou a falha do pedido:

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

    Substitua as variáveis editáveis no comando anterior pelos seus próprios valores.

  6. Se o estado do VirtualMachineAccessRequest estiver em branco, o ambiente de convidado pode não estar em execução.

Estabeleça ligação a uma VM do Windows

A ligação a uma VM do Windows requer a utilização do protocolo de ambiente de trabalho remoto (RDP) através de uma aplicação de ambiente de trabalho remoto. Para aceder à VM através do RDP, precisa de uma palavra-passe que pode obter na consola do GDC ou no recurso personalizado VirtualMachinePasswordResetRequest da API Virtual Machine Manager.

Antes de continuar, tem de instalar primeiro o cliente de Ambiente de Trabalho Remoto. Use o seguinte link para concluir os passos com base no seu SO específico. Para aceder ao link, precisa de uma ligação à Internet.

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

Para estabelecer uma ligação de VM do Windows, siga estes passos:

Consola

  1. No menu de navegação, clique em Máquinas virtuais > Instâncias.
  2. Na lista de VMs, pesquise a VM do Windows em execução à qual quer estabelecer ligação.
  3. Na coluna Ações, clique em Repor palavra-passe. É apresentada a caixa de diálogo Definir nova palavra-passe do Windows.
  4. No campo Nome de utilizador, introduza o seu nome de utilizador.
  5. Clique em Definir. É apresentada a caixa de diálogo Nova palavra-passe do Windows com uma palavra-passe gerada aleatoriamente. Esta palavra-passe contém carateres alfanuméricos e não alfanuméricos.
  6. Clique em Copiar.
  7. Navegue para o cliente de ambiente de trabalho remoto e selecione o seu nome de utilizador.
  8. No campo de introdução Palavra-passe, introduza a sua palavra-passe.
  9. Prima ENTER ou RETURN.

API

  1. Gere uma chave RSA. Precisa desta chave para obter a palavra-passe do recurso VirtualMachinePasswordResetRequest.

    openssl genrsa -out private-key.pem 2048
    # Get the RSA public key
    openssl rsa -in private-key.pem -outform PEM -pubout
    
  2. Crie um ficheiro YAML.

  3. Carregue a chave RSA que gerou, o nome da VM e um nome de utilizador que atribui para aceder ao cliente de ambiente de trabalho remoto:

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

    Substitua as variáveis com as seguintes definições:

    Variável Definição
    VM_NAMESPACE O nome do espaço de nomes onde reside a VM.
    PRR_NAME O nome que atribui ao pedido de reposição de palavra-passe. Por exemplo, vmprr2.
    VM_NAME O nome da VM. Por exemplo, vm-test.
    USERNAME O nome de utilizador que indica para iniciar sessão na VM com o cliente de ambiente de trabalho remoto. Por exemplo, test-user.
    PUBLIC_KEY A chave RSA que gerou no passo 2. Tem de formatar PUBLIC_KEY em várias linhas.

    O exemplo seguinte mostra um ficheiro YAML com os valores e a formatação necessários para fazer um pedido de reposição da palavra-passe:

    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. Aplique o conteúdo do ficheiro:

    kubectl --kubeconfig=MANAGEMENT_API_SERVER \
      apply -f FILENAME
    

    Substitua FILENAME pelo nome do ficheiro para o pedido de reposição da palavra-passe.

  5. Veja o estado do recurso VirtualMachinePasswordResetRequest. Desde que a VM esteja no estado Running, o recurso gera a palavra-passe em menos de um minuto.

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

    Localize o campo status.encryptedPassword que contém a palavra-passe gerada.

  6. Copie o valor em status.encryptedPassword e descifre a palavra-passe gerada:

    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
    

    Substitua o seguinte:

    • ENCRYPTED_PASSWORD: a palavra-passe gerada a partir do campo status.encryptedPassword.
    • PASSWORD_FILENAME: um ficheiro temporário para armazenar a palavra-passe descodificada em base64.

    Posteriormente, vê a palavra-passe descifrada como resultado para estabelecer ligação à VM através do RDP.

  7. Abra o cliente do Ambiente de Trabalho Remoto e clique em Perfil de ligação remota. É apresentada uma caixa de diálogo de associação.

  8. No separador Básico, introduza os seus valores nos seguintes campos:

    • Servidor: o endereço IP de entrada do estado de acesso externo da VM com o número da porta de acesso externo da VM anexado. Para obter o endereço IP de entrada, consulte Entrada.
    • Nome de utilizador: o nome de utilizador que especificou no pedido de reposição da palavra-passe. Por exemplo, test-user.
    • Palavra-passe: a palavra-passe gerada que descifrou a partir do estado do pedido de reposição de palavra-passe.
  9. Clique em Guardar e associar.