Estou recebendo as mensagens de erro “Permission denied (publickey)” (Permissão negada [chave pública]) ou “Authentication failed, permission denied” (Falha na autenticação, permissão negada) ao tentar acessar minha instância do EC2. Como resolvo isso?

Última atualização: 04/05/2021

Estou recebendo as mensagens de erro “Permission denied (publickey)” (Permissão negada [chave pública]) ou “Authentication failed, permission denied” (Falha na autenticação, permissão negada) ao acessar minha instância do Amazon Elastic Compute Cloud (Amazon EC2). Como resolvo isso?

Descrição breve

Os erros “Permission denied (publickey)” (Permissão negada [chave pública]) e “Authentication failed, permission denied” (Falha na autenticação, permissão negada) ocorrem quando:

  • Você está tentando se conectar usando um nome de usuário incorreto em sua AMI.
  • As permissões estão incorretas na instância.
  • O arquivo de chave pública SSH (.pub) no arquivo authorized_keys está incorreto.

Resolução

Confirmar que você está usando o nome de usuário correto para sua AMI

Para obter a lista de nomes de usuário válidos, consulte Erro: o servidor recusou nossa chave ou não há métodos de autenticação compatíveis.

Confirmar que as permissões da instância estão corretas e que o arquivo authorized_keys contém a chave pública SSH correta

Há quatro métodos para realizar essas tarefas:

Método 1: usar o console serial do EC2

Se você tiver habilitado o console serial do EC2 para Linux, poderá utilizá-lo para solucionar problemas com tipos de instância baseados em Nitro compatíveis. O console serial ajuda na solução de problemas de inicialização, de configuração da rede e do SSH. Ele se conecta à instância sem a necessidade de uma conexão ativa à rede. Você pode usar o console do Amazon EC2 ou a AWS Command Line Interface (AWS CLI) para acessar o console serial.

Antes de usá-lo, conceda acesso a ele na conta. Em seguida, crie políticas do AWS Identity and Access Management (IAM) que concedam acesso aos seus usuários do IAM. Além disso, todas as instâncias que usam o console serial precisam ter pelo menos um usuário com senha. Se não for possível estabelecer contato com a instância e você não tiver configurado o acesso ao console serial, siga as instruções nos Métodos 2, 3 ou 4. Para obter informações sobre como configurar o console serial do EC2 para Linux, consulte Configurar o acesso ao console serial do EC2.

Observação: se você receber mensagens de erro ao executar comandos na AWS CLI, verifique se está usando a versão mais recente da interface.

Método 2: usar o gerenciador de sessões do AWS Systems Manager para fazer login na instância e efetuar correções

Este método atualiza permissões e injeta sua chave pública SSH no arquivo authorized_keys.

Observação: é necessário instalar o SSM Agent para usar esse método. Para obter mais informações sobre o gerenciador de sessões e ver a lista completa de pré-requisitos, consulte Setting up Session Manager.

1.    Abra o console do AWS Systems Manager.

2.    Inicie uma sessão.

3.    Use o comando ls -ld para verificar se as permissões dos arquivos no diretório home estão corretas. Esta é a lista das permissões corretas:

  • O diretório inicial no Linux, /home, deve ser, por exemplo, (0755/drwxr-xr-x).
  • O diretório inicial do usuário, /home/ec2-user/, deve ser, por exemplo, (0700/drwx------).
  • A permissão do diretório .ssh, /home/ec2-user/.ssh, deve ser, por exemplo, (0700/drwx------).
  • A permissão do arquivo authorized_keys, /home/ec2-user/.ssh/authorized_keys, deve ser, por exemplo, (0600/-rw-------).

Veja a seguir um exemplo do comando ls -ld e da saída resultante. Neste exemplo, ec2-user é o nome do usuário. Mude o nome do usuário de acordo com sua AMI específica.

$ ls -ld /home/ec2-user/
drwx------ 3 ec2-user ec2-user 4096 Apr  1 08:31 /home/ec2-user/

4.    No computador local, verifique a chave pública SSH.

5.    Se a assinatura da chave pública SSH não estiver presente na saída, atualize o arquivo authorized_keys para permitir a sua chave SSH. No exemplo a seguir, substitua a chave dada por sua chave pública SSH.

$ echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDVogCW5eZogRp+vF6Ut360b0bYyTmqgYaCXOyiW77I916AS5jFL3zsCtONbGn4hnG/UGGWXpLfUV85qpVJb38fskPZNuyZtjGjXM2W7qqbCZ1N9HBb6IPBaL97tmqBi+8rD7mSkoHc40sIV+KxkQSvD6AAFjQruCjxzfGIApnOvuj6IMsVEuFHBx4QhkbCzafxo02D9BZT4+dMy7tmyuC+UiNEQpgfFoszl+4VNFTIPlQQyn6CpUiV/rFXIadXsHqc+UOdVnfEXP+30YL75RHabze/1F5MY6t94AEcmcb05Dq4vwN9IjcxKmwgvxLOXzryytepvHQU+PobBEXAMPLE' >> /home/ec2-user/.ssh/authorized_keys

6.    Execute os comandos a seguir para corrigir as permissões na sua instância do EC2.

$ sudo chown root:root /home
$ sudo chmod 755 /home
$ sudo chown ec2-user:ec2-user /home/ec2-user -R
$ sudo chmod 700 /home/ec2-user /home/ec2-user/.ssh
$ sudo chmod 600 /home/ec2-user/.ssh/authorized_keys

7.    Encerre a sessão.

8.    Conecte-se à instância com o SSH.

Método 3: executar o procedimento de automação AWSSupport-TroubleshootSSH

AWSSupport-TroubleshootSSH instala a ferramenta Amazon EC2Rescue. Após a instalação, a ferramenta confere e soluciona alguns problemas que podem causar erros em uma conexão remota a uma máquina Linux pelo SSH. Para obter mais informações, consulte How can I use the AWSSupport-TroubleshootSSH Automation workflow to troubleshoot SSH connection issues?

Método 4: usar um script de dados do usuário para reparar permissões SSH e adicionar a chave pública SSH correta ao arquivo authorized_keys

Importante

  • Observe que, se sua instância usar armazenamento de backup ou tiver volumes de armazenamento com dados, os dados serão perdidos quando a instância for interrompida. Para obter mais informações, consulte Determinar o tipo de dispositivo raiz da instância.
  • Se a instância fizer parte de um grupo do Amazon EC2 Auto Scaling, a interrupção da instância poderá terminá-la. Instâncias iniciadas com o Amazon EMR, AWS CloudFormation ou AWS Elastic Beanstalk podem ser parte de um grupo do AWS AutoScaling. Nesse caso, o encerramento depende das configurações de proteção da redução da escala da instância na horizontal do grupo do Auto Scaling. Se a instância fizer parte de um grupo do Auto Scaling, remova-a temporariamente do grupo antes de seguir as etapas de resolução do problema.
  • Interromper e iniciar a instância altera o endereço IP público dela. Uma prática recomendada é usar um endereço IP elástico em vez de um público ao rotear o tráfego externo da instância.

1.    Abra o console do Amazon EC2.

2.    No painel de navegação, escolha Instances (Instâncias) e selecione a instância com a qual está tentando se conectar.

3.    Interrompa a instância.

4.    Escolha Actions (Ações), Instance settings (Configurações da instância), Edit User Data (Editar dados do usuário).

5.    Copie o script de dados do usuário a seguir na caixa de diálogo Edit User Data (Editar dados do usuário) e escolha Save (Salvar).

Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0

--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"

#cloud-config
cloud_final_modules:
- [scripts-user, always]

--//
Content-Type:
    text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"

#!/bin/bash
chown root:root /home
chmod 755 /home
chown ec2-user:ec2-user /home/ec2-user -R
chmod 700 /home/ec2-user /home/ec2-user/.ssh
chmod 600 /home/ec2-user/.ssh/authorized_keys
--//

6.    No computador local, verifique a chave pública SSH.

7.    Se a assinatura da chave pública SSH não estiver presente na saída, adicione a chave correta ao final do script de dados do usuário criado na etapa 5. Se a assinatura corresponder, pule esta etapa. Adicione a chave pública SSH ao final do script de dados do usuário, como mostrado no exemplo a seguir. Substitua a chave do exemplo por sua chave pública SSH.

Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0

--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"

#cloud-config
cloud_final_modules:
- [scripts-user, always]

--//
Content-Type:
    text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"

#!/bin/bash
chown root:root /home
chmod 755 /home
chmod 700 /home/ec2-user /home/ec2-user/.ssh
chmod 600 /home/ec2-user/.ssh/authorized_keys
echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDVogCW5eZogRp+vF6Ut360b0bYyTmqgYaCXOyiW77I916AS5jFL3zsCtONbGn4hnG/UGGWXpLfUV85qpVJb38fskPZNuyZtjGjXM2W7qqbCZ1N9HBb6IPBaL97tmqBi+8rD7mSkoHc40sIV+KxkQSvD6AAFjQruCjxzfGIApnOvuj6IMsVEuFHBx4QhkbCzafxo02D9BZT4+dMy7tmyuC+UiNEQpgfFoszl+4VNFTIPlQQyn6CpUiV/rFXIadXsHqc+UOdVnfEXP+30YL75RHabze/1F5MY6t94AEcmcb05Dq4vwN9IjcxKmwgvxLOXzryytepvHQU+PobBEXAMPLE' >> /home/ec2-user/.ssh/authorized_keys
chown ec2-user:ec2-user /home/ec2-user -R
--//

8.    Inicie sua instância.

Observação: o script de dados do usuário mostrado anteriormente está definido para ser executado a cada nova inicialização da instância. Depois de obter acesso novamente à instância, remova o script.

Para remover os dados do usuário:

  • Conclua as etapas 1-4 nesta seção.
  • Exclua o script de dados do usuário na caixa de diálogo Edit User Data (Editar dados do usuário).