Saltar al contenido

¿Cómo puedo solucionar los errores de sudo en mi instancia de Amazon EC2 o Lightsail cuando ejecuto el comando sudo?

12 minutos de lectura
0

He cambiado la propiedad del archivo /etc/sudoers o lo he eliminado en mi instancia de Amazon Elastic Compute Cloud (Amazon EC2) o Amazon Lightsail. Ahora, recibo errores cuando ejecuto los comandos sudo.

Descripción corta

Al eliminar o configurar incorrectamente el archivo /etc/sudoers, es posible que recibas los siguientes errores de sintaxis o sudo:

  • "sudo: /etc/sudoers is owned by uid 1000, should be 0"
  • "sudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit set"
  • "sudo: unable to open /etc/sudoers: No such file or directory"
  • "sudo: no valid sudoers sources found, quitting"
  • "sudo: error initializing audit plugin sudoers_audit"

Si recibes uno de estos errores, no puedes conceder a los usuarios o grupos de usuarios acceso a los recursos del sistema. Para corregir los archivos /etc/sudoers y /usr/bin/sudo en Amazon EC2 o Lightsail, utiliza un script de inicio o de datos de usuario para modificar los permisos de los archivos. O bien, conecta el disco raíz a una instancia de rescate para realizar cambios manualmente.

Nota: Si has eliminado el archivo /etc/sudoers, debes usar un script de datos de usuario para volver a crearlo.

Resolución

Nota: Si se muestran errores al ejecutar comandos de la Interfaz de la línea de comandos de AWS (AWS CLI), consulta Solución de problemas de AWS CLI. Además, asegúrate de utilizar la versión más reciente de la AWS CLI.

Uso de un script de inicio o de datos de usuario para modificar los permisos del archivo

Para resolver los mensajes de error "owned by uid 1000" o "must be owned by uid 0", debes modificar los permisos de los archivos /etc/sudoers y /usr/bin/sudo.

Para las instancias de Amazon EC2, sigue estos pasos para usar un script de datos de usuario para modificar los permisos de los archivos:

  1. Abre la consola de Amazon EC2.

  2. En el panel de navegación, elige Instancias y, a continuación, selecciona la instancia de EC2.

  3. Elige Estado de instancia y, a continuación, Detener instancia.

  4. Selecciona Acciones y, a continuación, selecciona Configuración de la instancia.

  5. Selecciona Editar datos de usuario.

  6. Introduce el siguiente script:

    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
    # To fix error sudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit set. use below commands
    chown -R root:root /usr/bin/sudo
    chmod 4755 /usr/bin/sudo
    
    # to fix below sudo errors:
    #sudo: /etc/sudoers is owned by uid 1000, should be 0
    #sudo: no valid sudoers sources found, quitting
    #sudo: error initializing audit plugin sudoers_audit
    
    chown -R root:root /etc/sudoers
    chown -R root:root /etc/sudoers.d/
    sudo service sshd restart
    --//--
  7. Inicia la instancia y espera a que pase las comprobaciones de estado.

  8. Conéctate a la instancia y, a continuación, ejecuta el siguiente comando para validar que los permisos de los archivos /etc/sudoers y /usr/bin/sudo son correctos:

    sudo ls -la /etc/sudoers
    sudo ls -la /usr/bin/sudo

    El siguiente ejemplo de salida muestra los permisos correctos:

    $sudo ls -la /etc/sudoers /usr/bin/sudo
    -r--r----- 1 root root   1714 Jun 25 13:38 /etc/sudoers
    -rwsr-xr-x 1 root root 281624 Jun 27  2023 /usr/bin/sudo

Para las instancias de Lightsail, sigue estos pasos para usar un script de inicio para modificar los permisos de los archivos:

  1. Abre la consola de Lightsail.

  2. Elige Instantáneas y, a continuación, selecciona la instantánea de la instancia.

  3. Elige Acciones y, a continuación, selecciona Crear nueva instancia.

  4. En Opcional, elige + Agregar script de inicio.

  5. Introduce el siguiente script de inicio:

    #!/bin/bash
    # To fix error sudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit set. use below commands
    chown -R root:root /usr/bin/sudo
    chmod 4755 /usr/bin/sudo
    
    # to fix below sudo errors:
    #sudo: /etc/sudoers is owned by uid 1000, should be 0
    #sudo: no valid sudoers sources found, quitting
    #sudo: error initializing audit plugin sudoers_audit
    
    chown -R root:root /etc/sudoers
    chown -R root:root /etc/sudoers.d/
    sudo service sshd restart
    --//--
  6. Elige Crear instancia.

  7. Conéctate a la instancia y, a continuación, ejecuta el siguiente comando para comprobar los permisos de los archivos /etc/sudoers y /usr/bin/sudo:

    sudo ls -la /etc/sudoers
    sudo ls -la /usr/bin/sudo

    El siguiente ejemplo de salida muestra los permisos correctos:

    $sudo ls -la /etc/sudoers /usr/bin/sudo
    -r--r----- 1 root root   1714 Jun 25 13:38 /etc/sudoers
    -rwsr-xr-x 1 root root 281624 Jun 27  2023 /usr/bin/sudo

Conexión de un disco raíz a una instancia de rescate

Configuración de una instancia para detenerla e iniciarla

Nota: Al detener e iniciar una instancia, la dirección IP pública de la instancia cambia. Se recomienda utilizar una dirección IP elástica para enrutar el tráfico externo hacia la instancia en lugar de una dirección IP pública. Si usas Amazon Route 53, es posible que tengas que actualizar los registros DNS de Route 53 cuando cambies la dirección IP pública.

Antes de detener e iniciar la instancia, lleva a cabo las siguientes acciones:

Conexión del disco raíz a una instancia de rescate

Sigue estos pasos:

  1. Crea un nuevo par de claves.

  2. Obtén el ID del volumen y el nombre del dispositivo del volumen raíz de la instancia original.

  3. Detén la instancia original.

  4. Inicia una instancia de recuperación desde una imagen de máquina de Amazon (AMI) con la misma versión del sistema operativo Linux en la misma zona de disponibilidad.

  5. Separa el volumen raíz de la instancia original y conéctalo a la instancia de recuperación como volumen secundario.

  6. Conéctate a la instancia de recuperación con tu nuevo par de claves SSH.

  7. Ejecuta el siguiente comando para cambiar al usuario raíz:

    sudo su
  8. Para identificar la partición y el nombre del dispositivo de bloques, ejecuta el siguiente comando desde la instancia de recuperación:

    lsblk

    Resultado de ejemplo

    [root ~]$ lsblk
    NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    xvda    202:0    0    8G  0 disk
    └─xvda1 202:1    0    8G  0 part /
    xvdf    202:80   0  101G  0 disk
    └─xvdf1 202:81   0  101G  0 part
    xvdg    202:96   0   30G  0 disk

    En el ejemplo anterior, los nombres de los dispositivos de volumen xvda y xvdf son volúmenes particionados y xvdg no es un volumen particionado.
    Si el volumen está particionado, ejecuta el siguiente comando para montar la partición /dev/xvdf1 en lugar del dispositivo sin procesar /dev/xvdf:

    mount -o nouuid  /dev/xvdf1 /mnt

    Si usas una instancia creada en AWS Nitro System, el nombre del dispositivo de volumen usa el formato /dev/nvme[0-26]n1. Ejecuta el siguiente comando para montar la partición en el directorio /mnt:

    mount -o nouuid  /dev/nvme1n1p1 /mnt

    Nota: Sustituye /dev/nvme1n1p1 por el nombre del dispositivo que has identificado en el comando lsblk. Para más información, consulta Nombres de dispositivos para volúmenes en instancias de Amazon EC2.

  9. Para copiar el archivo /etc/sudoers de la instancia de trabajo como copia de seguridad, ejecuta el siguiente comando:

    cp /etc/sudoers /mnt/etc/sudoers.bak
  10. Para crear un entorno chroot en el directorio /mnt, ejecuta el siguiente comando:

for i in dev proc sys run; do mount -o bind /$i /mnt/$i; done; chroot /mnt

El enlace de comando anterior monta los directorios /dev, /proc, /sys y /run del sistema de archivos raíz original. Esta configuración permite que los procesos que se ejecutan dentro del entorno chroot accedan a estos directorios del sistema. Para editar el archivo /etc/sudoers, ejecuta el comando siguiente en el entorno chroot:

visudo

Asegúrate de que el archivo tenga la siguiente configuración predeterminada:

# This file MUST be edited with the 'visudo' command as root.

# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.

# See the man page for details on how to write a sudoers file.

Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
# Host alias specification
# User alias specification
# Cmnd alias specification
# User privilege specification
root ALL=(ALL:ALL) ALL
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
# See sudoers(5) for more information on "#include" directives:
#includedir /etc/sudoers.d

Nota: El comando visudo bloquea el archivo sudoers.
Si recibes errores cuando ejecutas el comando anterior, ejecuta el siguiente comando diff para comparar el archivo /etc/sudoers con el nuevo archivo /etc/sudoers.bak:

diff /etc/sudoers /etc/sudoers.bak

Nota: Si no hiciste cambios personalizados antes de editar el archivo, restaura el archivo /etc/sudoers.bak en /etc/sudoers. Para salir del entorno chroot, ejecuta el siguiente comando:

exit
  1. Para desmontar el volumen raíz, ejecuta el siguiente comando:
umount -fl /mnt
  1. Separa el volumen raíz que conectaste como volumen secundario de la instancia de recuperación. A continuación, vuelve a conectarlo a la instancia original con el nombre del dispositivo del paso 2.
  2. Inicia la instancia original y, a continuación, ejecuta el siguiente comando para confirmar que los comandos sudo funcionan correctamente:
sudo su

Uso de los datos de usuario para modificar el contenido del archivo o volver a crear el archivo

Nota: Para utilizar el siguiente método de solución de problemas, debes establecer una contraseña para el usuario raíz.

Volver a crear el archivo

Para acceder a la instancia como usuario raíz y poder volver a crear el archivo, sigue estos pasos:

  1. Abre la consola de Amazon EC2.

  2. En el panel de navegación, elige Instancias y, a continuación, selecciona la instancia.

  3. Elige Estado de instancia y, a continuación, Detener instancia.

  4. En ¿Detener instancia?, selecciona Detener.

  5. Selecciona Acciones y, a continuación, selecciona Configuración de la instancia.

  6. Selecciona Editar datos de usuario.

  7. Introduce el siguiente script para establecer una contraseña temporal para el usuario raíz:

    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
    chpasswd <<<"root:root"
    --//

    Importante: Esta contraseña utiliza texto sin formato para transmitir secretos y no es segura. Asegúrate de eliminar la contraseña temporal del usuario raíz después de completar los pasos de solución de problemas.

  8. Inicia la instancia y, a continuación, inicia sesión como ec2-user.

  9. Para volver a crear al archivo /etc/sudoers, ejecuta el siguiente comando pkexec:

    pkexec /usr/sbin/visudo
  10. Introduce la contraseña del usuario raíz y modifica el archivo /etc/sudoers con los valores siguientes:

# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults    env_reset
Defaults    mail_badpass
Defaults    secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d
  1. Ejecuta un comando sudo para comprobar que sudo funciona correctamente.
  2. Detén la instancia.

Eliminar el script de datos de usuario

Para usar la consola de Amazon EC2 para eliminar los valores de los datos del usuario, incluida la contraseña del usuario raíz, sigue estos pasos:

  1. Abre la consola de Amazon EC2.
  2. En el panel de navegación, elige Instancias y, a continuación, selecciona la instancia.
  3. Selecciona Acciones y, a continuación, selecciona Configuración de la instancia.
  4. Selecciona Editar datos de usuario y, a continuación, elimina todos los datos de usuario.

Para usar la AWS CLI para eliminar los valores de los datos de usuario, incluida la contraseña del usuario raíz, ejecuta el siguiente comando modify-instance-attribute:

aws ec2 modify-instance-attribute --instance-id example-instance-id --user-data Value=""

Nota: Sustituye example-instance-id por el ID de tu instancia.

Para comprobar que has eliminado los datos de usuario, ejecuta el siguiente comando describe-instance-attribute:

aws ec2 describe-instance-attribute --instance-id example-instance-id --attribute userData

Nota: Sustituye example-instance-id por el ID de tu instancia.

Tras eliminar los datos de usuario, inicia la instancia.

Información relacionada

¿Por qué no puedo ejecutar los comandos sudo en mi instancia de Linux de EC2?

OFICIAL DE AWSActualizada hace 4 meses