Conectar-se a uma VM

O Google Distributed Cloud (GDC) isolado usa a autenticação SSH baseada em chave para estabelecer conexões com instâncias de máquina virtual (VM) do Linux. Por padrão, as senhas não são configuradas para usuários locais em VMs do Linux.

Antes de começar

Antes de se conectar a uma VM, é preciso atender aos seguintes pré-requisitos:

  • Ativar o gerenciamento de acesso. Não é possível continuar sem o gerenciamento de acesso ativado no ambiente de convidado. Por padrão, o gerenciamento de acesso é ativado em novas VMs.
  • Ative o acesso externo da VM para qualquer peer na porta 22 do protocolo TCP (TCP).
    • Para VMs do Windows, ative o acesso externo à VM na porta 3389.
  • Configure um recurso personalizado ProjectNetworkPolicy (PNP) no projeto em que a VM reside.
    • Ao configurar um PNP no projeto, é possível acessar a VM fora do projeto ou da organização.
    • Para diagnosticar se você não tem um PNP, pergunte ao operador de infraestrutura (IO).
  • Acesso de login ao cluster. Siga as etapas da CLI em Fazer login para fazer login no cluster.
Para usar os comandos da interface de linha de comando (CLI) gdcloud, verifique se você baixou, instalou e configurou a CLI gdcloud. Todos os comandos da Distributed Cloud usam a CLI gdcloud ou kubectl e exigem um ambiente Linux.

Extrair o caminho do arquivo kubeconfig

Para executar comandos no servidor da API Management, verifique se você tem os seguintes recursos:

  1. Faça login e gere o arquivo kubeconfig para o servidor da API Management se você não tiver um.

  2. Use o caminho para o arquivo kubeconfig do servidor da API Management para substituir MANAGEMENT_API_SERVER nestas instruções.

Solicitar permissões e acesso

Para executar as tarefas listadas nesta página, você precisa ter o papel de administrador de máquina virtual do projeto. Siga as etapas para verificar se você tem o papel de administrador de máquina virtual do projeto (project-vm-admin) no namespace do projeto em que a VM reside.

Para operações de VM usando o console do GDC ou a CLI gdcloud, peça ao administrador do IAM do projeto para atribuir a você os papéis de administrador de máquina virtual do projeto e leitor do projeto (project-viewer).

Estabelecer uma conexão de VM

Nesta seção, descrevemos como estabelecer uma conexão com VMs do Linux e do Windows.

Conectar-se a uma VM do Linux

Para estabelecer uma conexão com uma VM Linux, use o console do GDC, a CLI gdcloud ou a API Virtual Machine Manager.

Console

  1. No menu de navegação, clique em Virtual Machines > Instâncias.

  2. Na lista de VMs, encontre a linha da VM em execução a que você quer se conectar. Na coluna Conectar, clique em SSH.

  3. Um terminal do navegador SSH é aberto. Insira qualquer comando no shell ou clique em FTP para navegar pela estrutura de arquivos e fazer upload deles.

gdcloud

Conecte-se a uma VM usando 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 você tiver definido propriedades padrão para a CLI, poderá omitir a flag --project desse comando. Exemplo:

gdcloud compute ssh VM_NAME

API

Conecte-se a uma VM:

  • Abra um terminal.
  • Crie um par de chaves SSH.
  • Faça o upload da chave pública e do nome de usuário com um valor de time-to-live (TTL).

O GDC recupera a chave SSH e o nome de usuário e cria uma conta de usuário com o nome de usuário. Em VMs Linux, o GDC armazena a chave pública no arquivo ~/.ssh/authorized_keys do usuário na VM.

Conclua as etapas a seguir para se conectar a uma VM pela linha de comando:

  1. Crie um par de chaves SSH e um nome de usuário.

    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 a seguir 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 arquivo de chave SSH. Por exemplo, o nome de arquivo my-ssh-key gera um arquivo de chave privada chamado my-ssh-key e um arquivo de chave pública chamado my-ssh-key.pub.
    USERNAME Seu nome de usuário na VM, como testuser ou testuser_gmail_com.

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

    Uma chave pública para o usuário testuser é semelhante a este exemplo:

    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDAu5kKQCPF... testuser
    
  2. Faça upload da chave para a VM e crie um recurso do Kubernetes com a chave pública, o nome de usuário e o valor de time to live (TTL) da chave.

    O exemplo a seguir usa um arquivo 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 usando as seguintes definições:

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

    kubectl create -f access_request.yaml --kubeconfig MANAGEMENT_API_SERVER
    
  4. Verifique o status da sua solicitação de acesso:

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

    Substitua VM_NAMESPACE pelo namespace da VM.

    Um status configured indica que você pode se conectar à VM.

  5. Conecte-se à VM:

    ssh -i PATH_TO_PRIVATE_KEY USERNAME@EXTERNAL_IP
    

    Substitua os seguintes valores:

    • PATH_TO_PRIVATE_KEY com o caminho para o arquivo de chave SSH privada que corresponde à chave pública adicionada à VM.
    • USERNAME com o nome de usuário especificado ao criar a chave SSH. Por exemplo, cloudysanfrancisco_example_com ou cloudysanfrancisco.
    • EXTERNAL_IP com o endereço IP de entrada externo da VM.

Solução de problemas

Nesta seção, descrevemos como solucionar problemas que podem ocorrer ao se conectar a uma instância de VM depois de criar a solicitação de acesso.

Siga estas etapas para identificar possíveis problemas:

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

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

    Se a VM não estiver em execução, não será possível se conectar ou configurar novas solicitações.

  2. Verifique se a VM está em execução há alguns minutos. Se a VM tiver acabado de ser iniciada, os serviços necessários para o acesso SSH ainda não estarão em execução. Normalmente, eles são executados em até cinco minutos após a inicialização.

  3. Verifique se você não excedeu o valor de TTL na solicitação de acesso. A chave é removida quando o tempo atinge o valor de TTL.

  4. Se o VirtualMachineAccessRequest mostrar um status configured, verifique os seguintes requisitos:

    1. Você ativou a transferência de dados para sua VM na porta 22.
    2. Sua máquina é encaminhada para a VM. Por exemplo, é possível usar o comando
      curl -vso /dev/null --connect-timeout 5 EXTERNAL_IP:22 para verificar o roteamento.
  5. Se o VirtualMachineAccessRequest mostrar um status failed, confira o status completo e analise a mensagem de erro que indica o motivo da falha na solicitação:

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

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

  6. Se o status do VirtualMachineAccessRequest estiver em branco, talvez o ambiente convidado não esteja em execução.

Conectar-se a uma VM do Windows

Para se conectar a uma VM do Windows, é necessário usar o protocolo de área de trabalho remota (RDP) em um aplicativo de área de trabalho remota. Para acessar a VM por RDP, você precisa de uma senha que pode ser recuperada no console do GDC ou no recurso personalizado VirtualMachinePasswordResetRequest da API Virtual Machine Manager.

Antes de continuar, instale o cliente de computador remoto. Use o link a seguir para concluir as etapas com base no seu SO específico. Para acessar o link, você precisa de uma conexão de Internet.

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

Para estabelecer uma conexão de VM do Windows, siga estas etapas:

Console

  1. No menu de navegação, clique em Máquinas virtuais > Instâncias.
  2. Na lista de VMs, procure a VM do Windows em execução para se conectar.
  3. Na coluna Ações, clique em Redefinir senha. A caixa de diálogo Definir nova senha do Windows aparece.
  4. No campo Nome de usuário, digite seu nome de usuário.
  5. Clique em Definir. A caixa de diálogo Nova senha do Windows aparece com uma senha gerada aleatoriamente. Essa senha contém caracteres alfanuméricos e não alfanuméricos.
  6. Clique em Copiar.
  7. Navegue até o cliente de área de trabalho remota e selecione seu nome de usuário.
  8. No campo de entrada Senha, digite sua senha.
  9. Pressione ENTER ou RETURN.

API

  1. Gere uma chave RSA. Você precisa dessa chave para extrair a senha 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 arquivo YAML.

  3. Faça upload da chave RSA gerada, do nome da VM e de um nome de usuário para acessar o cliente de área de trabalho remota:

    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 usando as seguintes definições:

    Variável Definição
    VM_NAMESPACE O nome do namespace em que a VM reside.
    PRR_NAME O nome que você dá à solicitação de redefinição de senha. Por exemplo, vmprr2
    VM_NAME O nome da VM. Por exemplo, vm-test
    USERNAME O nome de usuário usado para fazer login na VM com o cliente de área de trabalho remota. Por exemplo, test-user
    PUBLIC_KEY A chave RSA gerada na etapa 2. É necessário formatar PUBLIC_KEY em várias linhas.

    O exemplo a seguir mostra um arquivo YAML com os valores e a formatação necessários para fazer uma solicitação de redefinição de senha:

    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 arquivo:

    kubectl --kubeconfig=MANAGEMENT_API_SERVER apply -f FILENAME
    

    Substitua FILENAME pelo nome do arquivo para o pedido de redefinição de senha.

  5. Confira o status do recurso VirtualMachinePasswordResetRequest. Desde que a VM esteja no estado Running, o recurso vai gerar a senha em um minuto ou menos.

    kubectl --kubeconfig=MANAGEMENT_API_SERVER describe \
      -n VM_NAMESPACE PRR_NAME
    

    Localize o campo status.encryptedPassword que contém a senha gerada.

  6. Copie o valor em status.encryptedPassword e descriptografe a senha 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:sha1 -pkeyopt rsa_mgf1_md:sha1
    

    Substitua:

    • ENCRYPTED_PASSWORD: a senha gerada do campo status.encryptedPassword.
    • PASSWORD_FILENAME: um arquivo temporário para armazenar a senha decodificada em base64.

    Depois disso, a senha descriptografada vai aparecer como saída para você se conectar à VM pelo RDP.

  7. Abra o cliente de área de trabalho remota e clique em Perfil de conexão remota. Uma caixa de diálogo de conexão vai aparecer.

  8. Na guia Básico, insira seus valores nos seguintes campos:

    • Servidor: o endereço IP de entrada do status de acesso externo da VM com o número da porta de acesso externo da VM anexado. Para buscar o endereço IP de entrada, consulte Ingress.
    • Nome de usuário: o nome de usuário especificado na solicitação de redefinição de senha. Por exemplo, test-user.
    • Senha: a senha gerada que você descriptografou do status da solicitação de redefinição de senha.
  9. Clique em Salvar e conectar.