Come posso correggere gli errori sudo nella mia istanza Amazon EC2 o Lightsail quando eseguo il comando sudo?
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:
-
Apri la console Amazon EC2.
-
Nel pannello di navigazione, scegli Istanze, quindi seleziona l'istanza EC2.
-
Scegli Stato dell’istanza, quindi seleziona Arresta istanza.
-
Scegli Operazioni, quindi seleziona Impostazioni dell'istanza.
-
Scegli Modifica dati utente.
-
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 --//-- -
Avvia l'istanza e attendi che superi i controlli di stato.
-
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/sudoL'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:
-
Apri la console Lightsail.
-
Scegli Snapshot, quindi seleziona lo snapshot dell'istanza.
-
Scegli Operazioni, quindi seleziona Crea nuova istanza.
-
In Facoltativo, scegli**+ Aggiungi script di avvio**.
-
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 --//-- -
Scegli Crea istanza.
-
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/sudoL'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:
- Se l'istanza utilizza un archivio dell'istanza, salva i dati del volume nell'archivio in uno storage persistente. Ad esempio, puoi salvare i dati in volumi Amazon Elastic Block Store (Amazon EBS) o in bucket Amazon Simple Storage Service (Amazon S3).
Importante: Amazon EC2 elimina i dati dell'archivio dell'istanza quando la arresti. - Crea uno snapshot del volume Amazon EBS. In caso di problemi, puoi utilizzarlo per ripristinare l'istanza.
- Rimuovi temporaneamente l'istanza dal relativo gruppo Amazon EC2 Auto Scaling in modo da non terminarla accidentalmente quando la arresti.
Nota: EC2 Auto Scaling potrebbe terminare le istanze arrestate in un gruppo Auto Scaling a seconda delle impostazioni della protezione da riduzione orizzontale. Le istanze avviate con Amazon EMR, AWS CloudFormation o AWS Elastic Beanstalk potrebbero far parte di un gruppo Auto Scaling. - Imposta il comportamento di chiusura dell'istanza su Arresta per assicurarti che le istanze terminino quando le arresti.
Collega il disco root a un'istanza di ripristino
Completa i seguenti passaggi:
-
Ottieni l'ID del volume e il nome del dispositivo del volume principale dell'istanza originale.
-
Avvia un'istanza di ripristino da un'Amazon Machine Image (AMI) con la stessa versione del sistema operativo Linux nella stessa zona di disponibilità.
-
Scollega il volume principale dall'istanza originale e collegalo all'istanza di ripristino come volume secondario.
-
Connettiti all'istanza di ripristino con la nuova coppia di chiavi SSH.
-
Esegui questo comando per passare all'utente root:
sudo su -
Per identificare il nome e la partizione del dispositivo bloccato, esegui questo comando dall'istanza di ripristino:
lsblkEsempio 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 diskNell'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 /mntSe 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 /mntNota: 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.
-
Per copiare il file /etc/sudoers dall'istanza di lavoro come backup, esegui questo comando:
cp /etc/sudoers /mnt/etc/sudoers.bak -
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
- Per smontare il volume principale, esegui questo comando:
umount -fl /mnt
- 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.
- 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:
-
Apri la console Amazon EC2.
-
Nel pannello di navigazione, scegli Istanze, quindi seleziona l'istanza.
-
Scegli Stato dell’istanza, quindi seleziona Arresta istanza.
-
In Stop instance? (Arrestare l'istanza?), scegli Arresta.
-
Scegli Operazioni, quindi seleziona Impostazioni dell'istanza.
-
Scegli Modifica dati utente.
-
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.
-
Avvia l'istanza, quindi accedi come ec2-user.
-
Per ricreare il file /etc/sudoers, esegui questo comando pkexec:
pkexec /usr/sbin/visudo -
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
- Esegui un comando sudo per verificare che sudo funzioni correttamente.
- 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:
- Apri la console Amazon EC2.
- Nel pannello di navigazione, scegli Istanze, quindi seleziona l'istanza.
- Scegli Operazioni, quindi seleziona Impostazioni dell'istanza.
- 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?
- Argomenti
- Compute
- Lingua
- Italiano
