Wie behebe ich sudo-Fehler auf meiner Amazon-EC2- oder Lightsail-Instance, wenn ich den sudo-Befehl ausführe?
Ich habe den Eigentümer der Datei /etc/sudoers auf meiner Amazon Elastic Compute Cloud (Amazon EC2)- oder Amazon-Lightsail-Instance geändert oder gelöscht. Jetzt erhalte ich Fehler, wenn ich sudo-Befehle ausführe.
Kurzbeschreibung
Wenn du die Datei /etc/sudoers löschst oder falsch konfigurierst, erhältst du möglicherweise die folgenden syntax- oder sudo-Fehler:
- „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“
Wenn du eine dieser Fehlermeldungen erhältst, kannst du Benutzern oder Benutzergruppen keinen Zugriff für Systemressourcen gewähren. Um die Dateien /etc/sudoers und /usr/bin/sudo auf Amazon EC2 oder Lightsail zu korrigieren, verwende ein Benutzerdaten-Script oder ein Launch-Script, um die Dateiberechtigungen zu ändern. Füge alternativ die Stammfestplatte an eine Rettungs-Instance an, um manuell Änderungen vorzunehmen.
Hinweis: Wenn du die Datei /etc/sudoers gelöscht hast, musst du ein Benutzerdaten-Script verwenden, um sie neu zu erstellen.
Lösung
Hinweis: Wenn du beim Ausführen von AWS Command Line (AWS CLI)-Befehlen Fehlermeldungen erhältst, findest du weitere Informationen dazu unter Problembehandlung bei der AWS CLI. Stelle außerdem sicher, dass du die neueste Version der AWS CLI verwendest.
Ein Benutzerdaten- oder Launch-Script verwenden, um die Dateiberechtigungen zu ändern
Um die Fehlermeldungen „owned by uid 1000" oder „must be owned by uid 0" zu beheben, musst du die Dateiberechtigungen /etc/sudoers und /usr/bin/sudo ändern.
Führe für Amazon-EC2-Instances die folgenden Schritte aus, um ein Benutzerdaten-Sckript zum Ändern der Dateiberechtigungen zu verwenden:
-
Öffne die Amazon-EC2-Konsole.
-
Wähle im Navigationsbereich Instances und dann die EC2-Instance aus.
-
Wähle Instance-Status und dann Instance stoppen aus.
-
Wähle Aktionen und dann Instance-Einstellungen aus.
-
Wähle Benutzerdaten bearbeiten.
-
Gib das folgende Script ein:
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 --//-- -
Starte die Instance und warte, bis sie die Statusüberprüfungen bestanden hat.
-
Stelle eine Verbindung zur Instance her und führe dann den folgenden Befehl aus, um zu überprüfen, ob die Berechtigungen der Dateien /etc/sudoers und /usr/bin/sudo korrekt sind:
sudo ls -la /etc/sudoers sudo ls -la /usr/bin/sudoDie folgende Beispielausgabe zeigt die richtigen Berechtigungen:
$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
Führe für Lightsail-Instances die folgenden Schritte aus, um ein Launch-Script zum Ändern der Dateiberechtigungen zu verwenden:
-
Öffne die Lightsail-Konsole.
-
Wähle Snapshots und dann den Instance-Snapshot aus.
-
Wähle Aktionen und dann Neue Instance erstellen aus.
-
Wähle unter Optional die Option + Launch-Script hinzufügen.
-
Gib das folgende Launch-Script ein:
#!/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 --//-- -
Wähle Instance erstellen.
-
Stelle eine Verbindung zur Instance her und führe dann den folgenden Befehl aus, um die Berechtigungen der Dateien /etc/sudoers und /usr/bin/sudo zu überprüfen:
sudo ls -la /etc/sudoers sudo ls -la /usr/bin/sudoDie folgende Beispielausgabe zeigt die richtigen Berechtigungen:
$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
Stammfestplatte an eine Rettungs-Instance anfügen
Instance für einen Stopp und Start konfigurieren
Hinweis: Wenn du eine Instance anhältst und startest, ändert sich die öffentliche IP-Adresse der Instance. Es empfiehlt sich, beim Weiterleiten von externem Datenverkehr an die Instance eine Elastic-IP-Adresse anstelle einer öffentlichen IP-Adresse zu verwenden. Wenn du Amazon Route 53 verwendest, musst du möglicherweise die Route-53-DNS-Datensätze aktualisieren, wenn sich die öffentliche IP-Adresse ändert.
Bevor du die Instance anhältst und startest, gehe wie folgt vor:
- Wenn deine Instance einen Instance-Speicher verwendet, sichere die Volume-Daten im Instance-Speicher auf persistenten Speicher. Du kannst beispielsweise die Daten in Amazon Elastic Block Store (Amazon EBS)-Volumes oder Amazon Simple Storage Service (Amazon S3)-Buckets speichern.
Wichtig: Amazon EC2 löscht Instance-Speicherdaten, wenn du die Instance anhältst. - Erstelle einen Snapshot des Amazon-EBS-Volumes. Wenn Probleme auftreten, kannst du den Snapshot verwenden, um die Instance wiederherzustellen.
- Entferne die Instance vorübergehend aus ihrer Amazon EC2-Auto-Scaling-Gruppe, damit du die Instance beim Stoppen nicht versehentlich beendest.
Hinweis: EC2 Auto Scaling kann angehaltene Instances in einer Auto-Scaling-Gruppe basierend auf deinen Einstellungen für den Abskalierungsschutz beenden. Instances, die du mit Amazon EMR, AWS CloudFormation oder AWS Elastic Beanstalk startest, sind möglicherweise Teil einer Auto-Scaling-Gruppe. - Stelle das Verhalten beim Herunterfahren der Instance auf Stopp ein, um sicherzustellen, dass die Instances nicht beendet werden, wenn du sie anhältst.
Stammfestplatte an eine Rettungs-Instance anfügen
Gehe wie folgt vor:
-
Rufe die Volume-ID und den Gerätenamen für das Root-Volume der ursprünglichen Instance ab.
-
Starte eine Wiederherstellungs-Instance von einem Amazon Machine Image (AMI) mit derselben Linux-Betriebssystemversion in derselben Availability Zone.
-
Stelle mit dem neuen SSH-Schlüsselpaar eine Verbindung zur Wiederherstellungs-Instance her.
-
Verwende den folgenden Befehl, um zum Root-Benutzer zu wechseln:
sudo su -
Führe den folgenden Befehl von der Wiederherstellungs-Instance aus, um den Namen und die Partition des Blockgeräts zu identifizieren:
lsblkBeispielausgabe
[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 diskIm vorherigen Beispiel sind die Volume-Gerätenamen xvda und xvdf partitionierte Volumes und xvdg ist kein partitioniertes Volume.
Wenn dein Volume partitioniert ist, führe den folgenden Befehl aus, um die Partition /dev/xvdf1 anstelle des /dev/xvdf-Rohgeräts einzubinden:mount -o nouuid /dev/xvdf1 /mntWenn du eine Instance verwendest, die auf dem AWS Nitro System basiert, verwendet der Volume-Gerätename das Format /dev/nvme[0-26]n1. Führe den folgenden Befehl aus, um die Partition im Verzeichnis /mnt einzubinden:
mount -o nouuid /dev/nvme1n1p1 /mntHinweis: Ersetze /dev/nvme1n1p1 durch den Gerätenamen, den du mit dem Befehl lsblk ermittelt hast. Weitere Informationen findest du unter Gerätenamen für Volumes auf Amazon-EC2-Instances.
-
Um die Datei /etc/sudoers als Backup von der Arbeits-Instance zu kopieren, führe den folgenden Befehl aus:
cp /etc/sudoers /mnt/etc/sudoers.bak -
Um eine chroot-Umgebung im Verzeichnis /mnt zu erstellen, führe den folgenden Befehl aus:
for i in dev proc sys run; do mount -o bind /$i /mnt/$i; done; chroot /mnt
Der vorherige Befehl führt ein Bind-Mount der Verzeichnisse /dev, /proc, /sys und /run aus dem ursprünglichen Root-Dateisystem aus. Diese Konfiguration ermöglicht Prozessen, die in der chroot-Umgebung ausgeführt werden, den Zugriff auf diese Systemverzeichnisse. Um die Datei /etc/sudoers zu bearbeiten, führe den folgenden Befehl in der chroot-Umgebung aus:
visudo
Stelle sicher, dass die Datei die folgenden Standardeinstellungen hat:
# 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
Hinweis: Der visudo-Befehl sperrt die sudoers-Datei.
Wenn du beim Ausführen des vorherigen Befehls eine Fehlermeldung erhältst, führe den folgenden diff-Befehl aus, um die Datei /etc/sudoers mit der neuen Datei /etc/sudoers.bak zu vergleichen:
diff /etc/sudoers /etc/sudoers.bak
Hinweis: Wenn du vor der Bearbeitung der Datei keine benutzerdefinierten Änderungen vorgenommen hast, stelle die Datei /etc/sudoers.bak wieder in /etc/sudoers her. Um die chroot-Umgebung zu verlassen, führe den folgenden Befehl aus:
exit
- Führe den folgenden Befehl aus, um die Einbindung des Root-Volumes aufzuheben:
umount -fl /mnt
- Trenne das Root-Volume, das du als sekundäres Volume angefügt hast, von der Wiederherstellungs-Instance. Füge es dann erneut mit dem Gerätenamen aus Schritt 2 an die ursprüngliche Instance an.
- Starte die ursprüngliche Instance und führe dann den folgenden Befehl aus, um dich zu vergewissern, dass die sudo-Befehle ordnungsgemäß funktionieren:
sudo su
Benutzerdaten verwenden, um den Dateiinhalt zu ändern oder die Datei neu zu erstellen
Hinweis: Um die folgende Methode zur Problembehandlung verwenden zu können, musst du ein Passwort für den/die Root-Benutzer:in festlegen.
Die Datei neu erstellen
Gehe wie folgt vor, um als Root-Benutzer:in auf die Instance zuzugreifen, sodass du die Datei neu erstellst:
-
Öffne die Amazon-EC2-Konsole.
-
Wähle im Navigationsbereich Instances und dann die Instance aus.
-
Wähle Instance-Status und dann Instance stoppen aus.
-
Wähle unter Instance stoppen? die Option Stopp aus.
-
Wähle Aktionen und dann Instance-Einstellungen aus.
-
Wähle Benutzerdaten bearbeiten.
-
Gib das folgende Script ein, um ein temporäres Passwort für den/die Root-Benutzer:in festzulegen:
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" --//Wichtig: Dieses Passwort verwendet Nur-Text zur Weitergabe von Geheimnissen und ist nicht sicher. Stelle sicher, dass du das temporäre Passwort vom / von der Root-Benutzer:in entfernst, nachdem du die Schritte zur Problembehandlung abgeschlossen hast.
-
Starte die Instance und melde dich dann als ec2-user an.
-
Um die Datei /etc/sudoers wieder herzustellen, führe den folgenden pkexec-Befehl aus:
pkexec /usr/sbin/visudo -
Gib das Passwort des Root-Benutzers ein und ändere dann die Datei /etc/sudoers mit den folgenden Werten:
# 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
- Führe einen sudo-Befehl aus, um zu überprüfen, ob sudo ordnungsgemäß funktioniert.
- Halte die Instance an.
Löschen des Benutzerdaten-Scripts
Gehe wie folgt vor, um die Benutzerdatenwerte, einschließlich des Passworts des Root-Benutzers, mithilfe der Amazon-EC2-Konsole zu löschen:
- Öffne die Amazon-EC2-Konsole.
- Wähle im Navigationsbereich Instances und dann die Instance aus.
- Wähle Aktionen und dann Instance-Einstellungen aus.
- Wähle Benutzerdaten bearbeiten aus und lösche dann alle Benutzerdaten.
Um die AWS CLI zum Löschen der Benutzerdatenwerte, einschließlich des Passworts des Root-Benutzers, zu verwenden, führe den folgenden modify-instance-attribute-Befehl aus:
aws ec2 modify-instance-attribute --instance-id example-instance-id --user-data Value=""
**Hinweis:**Ersetze example-instance-id durch deine Instance-ID.
Führe den folgenden describe-instance-attribute-Befehl aus, um zu überprüfen, ob du die Benutzerdaten entfernt hast:
aws ec2 describe-instance-attribute --instance-id example-instance-id --attribute userData
**Hinweis:**Ersetze example-instance-id durch deine Instance-ID.
Nachdem du die Benutzerdaten gelöscht hast, starte die Instance.
Ähnliche Informationen
Warum kann ich keine sudo-Befehle auf meiner EC2-Linux-Instance ausführen?
- Themen
- Compute
- Sprache
- Deutsch
