Salta al contenuto

Come posso correggere gli errori sudo nella mia istanza Amazon EC2 o Lightsail quando eseguo il comando sudo?

11 minuti di lettura
0

Ho modificato la proprietà o eliminato il file /etc/sudoers nella mia istanza Amazon Elastic Compute Cloud (Amazon EC2) o Amazon Lightsail. Ora ricevo errori quando eseguo i comandi sudo.

Breve descrizione

Se elimini o configuri erroneamente il file /etc/sudoers, potresti ricevere i seguenti errori di sintassi 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"

Se ricevi uno di questi errori, non puoi concedere agli utenti o ai gruppi di utenti l'accesso alle risorse di sistema. Per correggere i file /etc/sudoers e /usr/bin/sudo in Amazon EC2 o Lightsail, utilizza uno script con dati utente o uno script di avvio per modificare le autorizzazioni dei file. Oppure collega il disco root a un'istanza di ripristino per apportare modifiche manualmente.

Nota: se hai eliminato il file /etc/sudoers, devi utilizzare uno script con dati utente per ricrearlo.

Risoluzione

Nota: se ricevi degli errori quando esegui i comandi dell'Interfaccia della linea di comando AWS (AWS CLI), consulta Risoluzione degli errori relativi ad AWS CLI. Inoltre, assicurati di utilizzare la versione più recente di AWS CLI.

Utilizza uno script con dati utente o uno script di avvio per modificare le autorizzazioni dei file

Per risolvere i messaggi di errore "owned by uid 1000" o "must be owned by uid 0", devi modificare le autorizzazioni dei file /etc/sudoers e /usr/bin/sudo.

Per le istanze Amazon EC2, completa i seguenti passaggi per modificare le autorizzazioni dei file utilizzando uno script con dati utente:

  1. Apri la console Amazon EC2.

  2. Nel pannello di navigazione, scegli Istanze, quindi seleziona l'istanza EC2.

  3. Scegli Stato dell’istanza, quindi seleziona Arresta istanza.

  4. Scegli Operazioni, quindi seleziona Impostazioni dell'istanza.

  5. Scegli Modifica dati utente.

  6. Utilizza il seguente 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. Avvia l'istanza e attendi che superi i controlli di stato.

  8. Connettiti all'istanza, quindi esegui questo comando per verificare che le autorizzazioni dei file /etc/sudoers e /usr/bin/sudo siano corrette:

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

    L'esempio di output seguente mostra le autorizzazioni corrette:

    $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

Per le istanze Lightsail, completa i seguenti passaggi per modificare le autorizzazioni dei file utilizzando uno script di avvio:

  1. Apri la console Lightsail.

  2. Scegli Snapshot, quindi seleziona lo snapshot dell'istanza.

  3. Scegli Operazioni, quindi seleziona Crea nuova istanza.

  4. In Facoltativo, scegli**+ Aggiungi script di avvio**.

  5. Inserisci il seguente script di avvio:

    #!/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. Scegli Crea istanza.

  7. Connettiti all'istanza, quindi esegui questo comando per verificare le autorizzazioni dei file /etc/sudoers e /usr/bin/sudo:

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

    L'esempio di output seguente mostra le autorizzazioni corrette:

    $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

Collega un disco root a un'istanza di ripristino

Configura l'istanza per l'arresto e l'avvio

Nota: quando arresti e avvii un'istanza, l'indirizzo IP pubblico dell'istanza cambia. È consigliabile utilizzare un indirizzo IP elastico per indirizzare il traffico esterno all'istanza anziché un indirizzo IP pubblico. Se utilizzi Amazon Route 53, potresti dover aggiornare i record DNS di Route 53 quando l'indirizzo IP pubblico cambia.

Prima di arrestare e avviare l'istanza, intraprendi le seguenti azioni:

Collega il disco root a un'istanza di ripristino

Completa i seguenti passaggi:

  1. Crea una nuova coppia di chiavi.

  2. Ottieni l'ID del volume e il nome del dispositivo del volume principale dell'istanza originale.

  3. Arresta l'istanza originale.

  4. Avvia un'istanza di ripristino da un'Amazon Machine Image (AMI) con la stessa versione del sistema operativo Linux nella stessa zona di disponibilità.

  5. Scollega il volume principale dall'istanza originale e collegalo all'istanza di ripristino come volume secondario.

  6. Connettiti all'istanza di ripristino con la nuova coppia di chiavi SSH.

  7. Esegui questo comando per passare all'utente root:

    sudo su
  8. Per identificare il nome e la partizione del dispositivo bloccato, esegui questo comando dall'istanza di ripristino:

    lsblk

    Esempio di output

    [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

    Nell'esempio precedente, xvda e xvdf sono nomi di dispositivi di volumi partizionati, mentre xvdg non corrisponde a un volume partizionato.
    Se il volume è partizionato, esegui questo comando per montare la partizione /dev/xvdf1 invece del dispositivo raw /dev/xvdf:

    mount -o nouuid  /dev/xvdf1 /mnt

    Se utilizzi un'istanza basata su AWS Nitro System, il nome del dispositivo del volume utilizza il formato /dev/nvme[0-26]n1. Esegui questo comando per montare la partizione nella directory /mnt:

    mount -o nouuid  /dev/nvme1n1p1 /mnt

    Nota: sostituisci /dev/nvme1n1p1 con il nome del dispositivo identificato con il comando lsblk. Per ulteriori informazioni, consulta Nomi dei dispositivi per i volumi sulle istanze Amazon EC2.

  9. Per copiare il file /etc/sudoers dall'istanza di lavoro come backup, esegui questo comando:

    cp /etc/sudoers /mnt/etc/sudoers.bak
  10. Per creare un ambiente chroot nella directory /mnt, esegui questo comando:

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

Il comando precedente esegue il bind mount delle directory /dev, /proc, /sys e /run dal file system root originale. La configurazione consente ai processi eseguiti all'interno dell'ambiente chroot di accedere a queste directory di sistema. Per modificare il file /etc/sudoers, esegui questo comando all'interno dell'ambiente chroot:

visudo

Assicurati che il file abbia le seguenti impostazioni predefinite:

# 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: il comando visudo blocca il file sudoers.
Se ricevi errori quando esegui il comando precedente, esegui questo comando diff per confrontare il file /etc/sudoers con il nuovo file /etc/sudoers.bak:

diff /etc/sudoers /etc/sudoers.bak

Nota: se non hai apportato modifiche personalizzate prima di modificare il file, ripristina il file /etc/sudoers.bak in /etc/sudoers. Per uscire dall'ambiente chroot, esegui questo comando:

exit
  1. Per smontare il volume principale, esegui questo comando:
umount -fl /mnt
  1. Scollega il volume principale che hai collegato come volume secondario dall'istanza di ripristino. Quindi ricollegalo all'istanza originale con il nome del dispositivo del passaggio 2.
  2. Avvia l'istanza originale, quindi esegui questo comando per verificare che i comandi sudo funzionino correttamente:
sudo su

Utilizza i dati utente per modificare il contenuto del file o ricrearlo

Nota: per utilizzare il seguente metodo di risoluzione, devi impostare una password per l'utente root.

Ricrea il file

Per accedere all'istanza come utente root in modo da poter ricreare il file, completa i seguenti passaggi:

  1. Apri la console Amazon EC2.

  2. Nel pannello di navigazione, scegli Istanze, quindi seleziona l'istanza.

  3. Scegli Stato dell’istanza, quindi seleziona Arresta istanza.

  4. In Stop instance? (Arrestare l'istanza?), scegli Arresta.

  5. Scegli Operazioni, quindi seleziona Impostazioni dell'istanza.

  6. Scegli Modifica dati utente.

  7. Inserisci il seguente script per impostare una password temporanea per l'utente root:

    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: la password utilizza testo semplice per trasmettere informazioni segrete e non è sicura. Assicurati di rimuovere la password temporanea dall'utente root dopo aver completato la procedura di risoluzione.

  8. Avvia l'istanza, quindi accedi come ec2-user.

  9. Per ricreare il file /etc/sudoers, esegui questo comando pkexec:

    pkexec /usr/sbin/visudo
  10. Inserisci la password dell'utente root, quindi modifica il file /etc/sudoers con i seguenti valori:

# 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. Esegui un comando sudo per verificare che sudo funzioni correttamente.
  2. Arresta l'istanza.

Elimina lo script con dati utente

Per eliminare i valori dei dati utente utilizzando la console Amazon EC2 , inclusa la password dell'utente root, completa i seguenti passaggi:

  1. Apri la console Amazon EC2.
  2. Nel pannello di navigazione, scegli Istanze, quindi seleziona l'istanza.
  3. Scegli Operazioni, quindi seleziona Impostazioni dell'istanza.
  4. Scegli Modifica dati utente, quindi elimina tutti i dati utente.

Per utilizzare AWS CLI per eliminare i valori dei dati utente, inclusa la password dell'utente root, esegui questo comando modify-instance-attribute:

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

Nota: sostituisci a ** example-instance-id** l'ID della tua istanza.

Per verificare di aver rimosso i dati utente, esegui questo comando describe-instance-attribute:

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

Nota: sostituisci a ** example-instance-id** l'ID della tua istanza.

Dopo aver eliminato i dati utente, avvia l'istanza.

Informazioni correlate

Perché non riesco a eseguire i comandi sudo sulla mia istanza EC2 per Linux?

AWS UFFICIALEAggiornata 7 mesi fa