Recibo errores “Permission denied (publickey)” (Permiso denegado) o “Authentication failed, permission denied” (Error de autenticación, permiso denegado) al intentar acceder a mi instancia EC2. ¿Cómo se soluciona esto?

Última actualización: 20/05/2022

Al acceder a la instancia de Amazon Elastic Compute Cloud (Amazon EC2), aparecen los errores “Permiso denegado (clave pública)” o “Se produjo un error en la autenticación; permiso denegado”. ¿Cómo se soluciona esto?

Descripción corta

Los errores “Permission denied (publickey)” (Permiso denegado) y “Authentication failed, permission denied” (Error de autenticación, permiso denegado) se producen si:

  • Está intentando conectarse con un nombre de usuario incorrecto para su AMI.
  • Los permisos de archivo dentro del sistema operativo son incorrectos en la instancia.
  • El archivo de clave pública SSH (.pub) incorrecto está en el archivo authorized_keys.

Resolución

Verificar que esté usando el nombre de usuario correcto para su AMI

Verificar que los permisos de archivo dentro del sistema operativo sean correctos y que la clave pública SSH correcta conste en el archivo authorized_keys

Hay cuatro métodos para llevar a cabo estas tareas:

Método 1: utilizar la consola serie de EC2

Si activó la consola serie de EC2 para Linux, puede utilizarla para solucionar problemas de tipos de instancias compatibles basadas en Nitro. La consola serie lo ayuda a resolver los problemas de arranque, configuración de red y configuración de SSH. La consola de serie se conecta a su instancia sin necesidad de una conexión de red funcional. Puede acceder a la consola serie mediante la consola de Amazon EC2 o AWS Command Line Interface (AWS CLI).

Antes de utilizar la consola serie, conceda acceso a ella a nivel de cuenta. A continuación, cree políticas de AWS Identity and Access Management (IAM) que concedan acceso a sus usuarios de IAM. Además, cada instancia que utilice la consola de serie debe incluir como mínimo un usuario basado en contraseña. Si su instancia no está disponible y no ha configurado el acceso a la consola de serie, siga las instrucciones de los métodos 2, 3 o 4. Para obtener información sobre cómo configurar la consola serie de EC2 para Linux, consulte Configurar el acceso a la consola serie de EC2.

Nota: si recibe errores al ejecutar comandos de AWS CLI, asegúrese de que utiliza la versión más reciente de AWS CLI.

Método 2: usar el administrador de sesiones de AWS Systems Manager para entrar en la instancia y hacer correcciones

Este método actualiza los permisos e inyecta su clave pública SSH en el archivo authorized_keys.

Nota: Se requiere la instalación de SSM Agent para utilizar este método. Para obtener más información sobre el administrador de sesiones y obtener una lista completa de los requisitos previos, consulte Configuración de Session Manager.

1.    Abra la consola de AWS Systems Manager.

2.    Inicie una sesión.

3.    Use el comando ls -ld para asegurarse de que los permisos de los archivos en el directorio home sean correctos. La siguiente es una lista de los permisos correctos:

  • El directorio home de Linux, /home, por ejemplo, tiene que ser (0755/drwxr-xr-x).
  • El directorio home del usuario, /home/ec2-user/, por ejemplo, tiene que ser (0700/drwx------).
  • El permiso del directorio .ssh, /home/ec2-user/.ssh, por ejemplo, tiene que ser (0700/drwx------).
  • El permiso del archivo authorized_keys file, /home/ec2-user/.ssh/authorized_keys, por ejemplo, tiene que ser (0600/-rw-------).

A continuación se muestra un ejemplo del comando ls -ld y la salida resultante. En este ejemplo, ec2-user es el nombre de usuario. Cambie el nombre de usuario según su AMI específico.

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

4.    En la computadora local, compruebe la clave pública SSH.

5.    Si la firma de la clave pública SSH no está presente en la salida, entonces debe actualizar el archivo authorized_keys para permitir su clave SSH. En el ejemplo siguiente, reemplace la clave de ejemplo con su clave 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.    Para corregir los permisos, ejecute los comandos siguientes en su instancia 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.    Termine la sesión.

8.    Conéctese a la instancia mediante SSH.

Método 3: ejecutar el procedimiento de automatización AWSSupport-TroubleshootSSH

AWSSupport-TroubleshootSSH instala la herramienta Amazon EC2Rescue. Después de la instalación, la herramienta busca y corrige algunos problemas que provocan errores de conexión remota al conectarse a una máquina con Linux a través de SSH. Para más información, consulte ¿Cómo puedo usar el flujo de trabajo de automatización de AWSSupport-TroubleshootSSH para solucionar problemas de conexión de SSH?

Método 4: utilizar un script de datos de usuario para reparar los permisos SSH y agregar la clave pública SSH correcta al archivo authorized_keys

Importante

  • Si su instancia está basada en un almacén de instancias o tiene volúmenes de almacén de instancias que contienen datos, los datos se pierden al detener la instancia. Para obtener más información, consulte Determinación del tipo de dispositivo raíz de la instancia.
  • Si la instancia forma parte de un grupo de Amazon EC2 Auto Scaling, la detención de la instancia podría terminarla. Las instancias lanzadas con Amazon EMR, AWS CloudFormation o AWS Elastic Beanstalk pueden formar parte de un grupo de AWS Auto Scaling. La terminación de la instancia en este caso depende de la configuración de la protección de escalado de la instancia para su grupo de Auto Scaling. Si su instancia forma parte de un grupo de Auto Scaling, elimine temporalmente la instancia del grupo de Auto Scaling antes de iniciar los pasos de resolución.
  • Detener y comenzar la instancia cambia la dirección IP pública de la instancia. Es una práctica recomendada utilizar una dirección IP elástica en lugar de una dirección IP pública cuando se dirige el tráfico externo a su instancia.

1.    Abra la consola de Amazon EC2.

2.    Elija Instances (Instancias) en el panel de navegación y, a continuación, seleccione la instancia que intenta lanzar.

3.    Detenga la instancia.

4.    Elija Actions (Acciones), Instance Settings (Configuración de instancia), Edit User Data (Editar datos de usuario).

5.    Copie el script de datos de usuario siguiente en el cuadro de diálogo Edit User Data (Editar datos de usuario) y elija Save (Guardar).

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
OS_USER=@@@@@@
chown root:root /home 
chmod 755 /home
chown $OS_USER:$OS_USER /home/$OS_USER -R
chmod 700 /home/$OS_USER
chmod 700 /home/$OS_USER/.ssh
chmod 600 /home/$OS_USER/.ssh/authorized_keys
--//

Nota: Reemplace el valor OS_USER por el nombre de usuario asociado a la AMI desde la que lanzó la instancia. Para obtener más información, consulte Obtener el nombre de usuario predeterminado de la AMI que utilizó para lanzar la instancia en Causas comunes de problemas de conexión.

6.    En la computadora local, compruebe la clave pública SSH.

7.    Si la firma de la clave pública SSH no está presente en la salida, agregue la clave correcta al script de datos de usuario que ha creado en el paso 5. Si la firma coincide, puede omitir este paso. Agregue la clave pública SSH al script de datos de usuario como se indica en el ejemplo siguiente. Reemplace la clave de ejemplo con su clave 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
OS_USER=@@@@@@
chown root:root /home 
chmod 755 /home
chmod 700 /home/$OS_USER
chmod 700 /home/$OS_USER/.ssh
chmod 600 /home/$OS_USER/.ssh/authorized_keys
echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDVogCW5eZogRp+vF6Ut360b0bYyTmqgYaCXOyiW77I916AS5jFL3zsCtONbGn4hnG/UGGWXpLfUV85qpVJb38fskPZNuyZtjGjXM2W7qqbCZ1N9HBb6IPBaL97tmqBi+8rD7mSkoHc40sIV+KxkQSvD6AAFjQruCjxzfGIApnOvuj6IMsVEuFHBx4QhkbCzafxo02D9BZT4+dMy7tmyuC+UiNEQpgfFoszl+4VNFTIPlQQyn6CpUiV/rFXIadXsHqc+UOdVnfEXP+30YL75RHabze/1F5MY6t94AEcmcb05Dq4vwN9IjcxKmwgvxLOXzryytepvHQU+PobBEXAMPLE' >> /home/$OS_USER/.ssh/authorized_keys
chown $OS_USER:$OS_USER/ home/$OS_USER -R
--//

Nota: Reemplace el valor OS_USER por el nombre de usuario asociado a la AMI desde la que lanzó la instancia. Para obtener más información, consulte Obtener el nombre de usuario predeterminado de la AMI que utilizó para lanzar la instancia en Causas comunes de problemas de conexión.

8.    Inicie su instancia.

Nota: El script de datos de usuario anterior se ejecuta cada vez que se reinicia la instancia. Después de recuperar el acceso a la instancia, elimine el script de datos de usuario.

Para eliminar datos de usuario:

  • Complete los pasos del 1 al 4 de esta sección.
  • Elimine el script de datos de usuario del cuadro de diálogo Edit User Data (Editar datos de usuario).