Solução de problemas de login do SO


Neste documento, descrevemos como solucionar problemas de login do SO usando o servidor de metadados. Para informações sobre como configurar o Login do SO ou para instruções passo a passo, consulte Como configurar o Login do SO.

Você pode consultar o servidor de metadados de dentro de uma instância de máquina virtual (VM). Para mais informações, consulte Como armazenar e recuperar metadados de instância.

Antes de começar

  • Configure a autenticação, caso ainda não tenha feito isso. A autenticação é o processo de verificação da sua identidade para acesso a serviços e APIs do Google Cloud. Para executar códigos ou amostras de um ambiente de desenvolvimento local, autentique-se no Compute Engine selecionando uma das seguintes opções:

    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 as amostras da API REST nesta página em um ambiente de desenvolvimento local, use as credenciais fornecidas para gcloud CLI.

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

        gcloud init

      Para mais informações, consulte Autenticar para usar REST na documentação de autenticação do Google Cloud.

Mensagens de erro comuns

Veja a seguir exemplos de erros comuns que você pode encontrar ao usar o Login do SO.

Não é possível encontrar o nome do grupo

Ao usar o Login do SO em algumas VMs, talvez você receba a seguinte mensagem de erro após a conexão ser estabelecida:

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

Ignore essa mensagem de erro. Esse erro não afeta as VMs.

Falha ao receber grupos

É possível que você veja registros semelhantes aos seguintes ao criar 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

Esses registros indicam que a organização não tem grupos do Login do SO do Linux configurados. Ignore essas mensagens.

Falha na pré-condição

Talvez você observe um erro semelhante ao seguinte ao se conectar à VM usando SSH:

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

Esse erro ocorre quando o Login do SO tenta gerar um nome de usuário que já existe em uma organização. Isso é comum quando uma conta de usuário é excluída e um novo usuário com o mesmo endereço de e-mail é criado logo em seguida. Depois que uma conta de usuário é excluída, pode levar até 48 horas para as informações serem removidas do POSIX do usuário.

Para resolver esse problema, faça uma das seguintes ações:

Argumento inválido

Talvez você veja erros semelhantes aos seguintes ao se conectar a uma VM usando SSH ou SCP para transferir arquivos:

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 esses erros, faça o seguinte:

  1. Veja seu perfil de login do SO executando o comando gcloud compute os-login describe-profile:

    gcloud compute os-login describe-profile
    

    A resposta será semelhante a:

    name: '00000000000000'
    posixAccounts:
    ...
    sshPublicKeys:
     ...:
       fingerprint: ...
       key: |
         ssh-rsa AAAAB3NzaC1yc2...
       name: ...
     ...
    
  2. Revise a saída para identificar as chaves SSH não usadas.

  3. Remova as chaves não utilizadas da saída usando o comando gcloud compute os-login ssh-keys remove:

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

    Substitua KEY pela impressão digital das chaves ou pela string da chave.

Para evitar que esse problema ocorra no futuro, adicione um prazo de validade para as chaves SSH. As chaves expiradas são removidas automaticamente do perfil de login 48 horas após a expiração ou quando você adiciona uma nova chave ao perfil.

Código de resposta HTTP: 503

O seguinte erro pode aparecer quando você tentar se conectar a uma VM usando SSH:

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

Esse problema é causado pelo limite de taxa do servidor de metadados de 100 consultas por segundo por instância de máquina virtual. Não é possível ajustar esse limite. Para resolver esse problema, aguarde alguns segundos e tente se conectar novamente.

Para evitar esse problema no futuro, tente o seguinte:

  • Implementar um mecanismo de nova tentativa no código do aplicativo. Confira mais informações em:
  • Reutilizar as conexões SSH atuais.
  • Envie comandos em lotes para reduzir as conexões SSH e as consultas de metadados do Login do SO.

Entradas de metadados de Login do SO padrão

O Compute Engine define um conjunto de entradas de metadados padrão que veiculam informações de Login do SO. Os metadados padrão sempre são definidos e configurados no servidor. As chaves de metadados padrão diferenciam maiúsculas de minúsculas.

A tabela a seguir descreve as entradas que você pode consultar.

Relativo a http://metadata.google.internal/computeMetadata/v1/
Entrada de metadados Descrição
project/attributes/enable-oslogin Verifica se o Login do SO está ativado no projeto atual do Google Cloud.
instance/attributes/enable-oslogin Verifica se o Login do SO está ativado na VM atual.
oslogin/users/ Recupera informações de perfil para usuários do Login do SO. É possível transmitir parâmetros de consulta como username, uid, pagesize e pagetoken.
oslogin/authorize/

Recupera as configurações de permissão de login ou nível administrativo para um usuário de Login do SO.

Para verificar uma permissão, especifique o parâmetro de consulta policy. O valor do parâmetro de política precisa ser definido como login (para verificar a permissão de login) ou adminLogin (para verificar o acesso ao sudo).

Como verificar se o Login do SO está configurado

Use o console do Google Cloud ou a CLI do Google Cloud para consultar metadados de modo a determinar se o Login do SO está ativado. O login do SO é ativado quando a chave de metadados enable-oslogin é definida como TRUE nos metadados do projeto ou da instância. Se os metadados da instância e do projeto forem definidos, o valor definido nos metadados da instância terá precedência.

Como visualizar usuários de Login do SO

Para visualizar as informações do perfil de vários usuários, você precisa especificar os parâmetros pagesize e pagetoken. Substitua pagesize e pagetoken pelo valor numérico necessário.

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

Por exemplo, para definir pagesize como 1 e pagetoken como 0, execute o seguinte comando:

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

Na maioria das distribuições, também é possível executar o comando Unix getent passwd para recuperar as entradas de senha para usuários da organização.

Como visualizar um usuário específico de login do SO

Para ver as informações de perfil de um usuário específico na VM, execute o comando a seguir:

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

Substitua USERNAME pelo nome de usuário do usuário que você quer consultar.

Por exemplo, é executar uma solicitação para procurar o usuário user_example_com. O comando e a saída a seguir mostram uma formatação adicional para melhorar a legibilidade.

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

A resposta será semelhante a:

{
    "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..."
            }
        }
    }]
}

Na maioria das distribuições, também é possível executar comandos Unix, como getent passwd username ou getent passwd uid, para recuperar informações de perfil.

Para recuperar as chaves SSH de um usuário, também é possível executar /usr/bin/google_authorized_keys USERNAME. Se nenhuma chave for retornada, talvez o usuário não tenha as permissões necessárias para fazer login na VM.

Como verificar as permissões de login

Para ver as permissões de login e nível administrativo, é necessário fornecer os parâmetros de consulta policy=login&email=LOGIN_NAME.

  1. Consulte o perfil do usuário para ver o valor do campo name:

    curl "http://metadata.google.internal/computeMetadata/v1/oslogin/users?username=user_example_com" -H "Metadata-Flavor: Google"
  2. Na saída, anote o name.

  3. Execute o comando login a seguir usando o valor de name:

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

Por exemplo, é possível consultar as permissões de login do usuário user_example_com que foi visualizado na seção anterior.

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

A resposta ao comando indica que o usuário está autorizado a fazer login na VM:

{"success":true}

Como verificar se sua VM tem uma conta de serviço

É possível consultar o servidor de metadados para encontrar a conta de serviço associada à VM. Na VM, execute o seguinte comando:

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

A resposta será semelhante a:

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

Se nenhuma conta de serviço for encontrada, a saída ficará em branco.

Como depurar problemas do Login do SO com o gcpdiag

gcpdiag é uma ferramenta de código aberto. Não é um produto do Google Cloud oficialmente compatível. Use a ferramenta gcpdiag para identificar e corrigir problemas no projeto do Google Cloud. Para mais informações, consulte o projeto gcpdiag no GitHub.

Este runbook do gcpdiag investiga possíveis causas de problemas de acesso SSH em VMs do Windows e do Linux no Google Cloud. O foco é:
  • Integridade da VM: verifica se a VM está em execução e tem recursos suficientes (CPU, memória, disco).
  • Permissões: garante que você tenha as permissões de IAM corretas para configurar chaves SSH.
  • Configurações da VM: verifica se as chaves SSH e outros metadados estão configurados corretamente.
  • Regras de rede: analisa as regras de firewall para confirmar se o tráfego SSH é permitido.
  • SO convidado: procura problemas internos do SO que possam bloquear o SSH.

Console do Google Cloud

  1. Preencha e copie o comando a seguir.
  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. Abra o console do Google Cloud e ative o Cloud Shell.
  4. Abrir Console do Cloud
  5. Cole o comando copiado.
  6. Execute o comando gcpdiag, que faz o download da imagem Docker gcpdiag. e realiza verificações de diagnóstico. Se aplicável, siga as instruções de saída para corrigir verificações com falha.

Docker

Você pode executar gcpdiag usando um wrapper que inicia gcpdiag em um contêiner do Docker. Docker ou Podman precisa ser instalado.

  1. Copie e execute o seguinte comando na estação de trabalho local.
    curl https://gcpdiag.dev/gcpdiag.sh >gcpdiag && chmod +x gcpdiag
  2. Execute o 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

Veja os parâmetros disponíveis para este runbook.

Substitua:

  • PROJECT_ID: o ID do projeto que contém o recurso
  • VM_NAME: o nome da VM de destino no seu projeto.
  • ZONE: a zona em que a VM de destino está localizada.
  • PRINCIPAL: o principal do usuário ou da conta de serviço para iniciar a conexão SSH. Para a autenticação baseada em chaves, use o comando autenticado pela ferramenta de linha de comando do Cloud Shell ou conectado no console do Google Cloud. Para a representação de uma conta de serviço, use o e-mail da sua conta de servço.
  • IAP_ENABLED: um valor booleano (verdadeiro ou falso) que indica se o Identity-Aware Proxy é usado para estabelecer a conexão SSH. Padrão: true
  • LOCAL_USER:usuário Posix na VM.
  • CHECK_OS_LOGIN: um valor booleano (verdadeiro ou falso) que indica se o Login do SO deve ser usado para autenticação SSH.
  • CHECK_SSH_IN_BROWSER:um valor booleano para verificar se o SSH no navegador é viável.

Flags úteis

Para conferir uma lista e descrição de todas as flags da ferramenta gcpdiag, consulte Instruções de uso do gcpdiag.

A seguir