Direkt zum Inhalt

Warum kann ich keine sudo-Befehle auf meiner Amazon EC2-Linux-Instance ausführen?

Lesedauer: 5 Minute
0

Wenn ich sudo-Befehle auf meiner Amazon Elastic Compute Cloud (Amazon EC2)-Linux-Instance ausführe, erhalte ich eine Fehlermeldung.

Kurzbeschreibung

Die Datei /usr/bin/sudo muss root:root als Eigentümer haben. Wenn die Datei /usr/bin/sudo einem Nicht-Root-Benutzer gehört, erhältst du die folgende Fehlermeldung, wenn du Sudo-Befehle auf deiner EC2-Linux-Instance ausführst:

„/usr/bin/sudo must be owned by uid 0 and have the setuid bit set“

Die Datei sudoers darf auch nicht für alle beschreibbar (world-writable) sein. Wenn die Datei für alle beschreibbar ist, kann jeder in die Datei schreiben und du erhältst die folgende Fehlermeldung:

„sudo: /etc/sudoers is world writable“

Hinweis: Standardmäßig ist der Dateimodus für die Datei sudoers auf 0440 gesetzt. Diese Konfiguration erlaubt es dem Eigentümer und der Gruppe, die Datei zu lesen, lässt aber nicht zu, dass jemand in die Datei schreibt.

Um die vorherigen Fehler zu beheben, verwende die serielle EC2-Konsole für Linux, um eine Verbindung herzustellen und eine Fehlerbehebung durchzuführen. Oder aktualisiere das Benutzerdatenskript der Instance, um die Dateiberechtigungen zurückzusetzen.

Lösung

Hinweis: Wenn du Fehler bei der Ausführung von AWS Command Line Interface (AWS CLI)-Befehlen erhältst, lies Fehlerbehebung AWS CLI. Stelle außerdem sicher, dass du die neueste Version der AWS CLI verwendest.

Verwende die serielle EC2-Konsole, um eine Verbindung herzustellen und eine Fehlerbehebung durchzuführen

Voraussetzung: Konfiguriere den Zugriff auf die serielle EC2-Konsole. Du kannst die serielle Konsole nur auf Instances verwenden, die auf dem AWS Nitro System basieren, sowie auf unterstützten Bare-Metal-Instances.

Verwende die Amazon-EC2-Konsole oder die AWS CLI mit SSH-Client-Befehlen, um mit der seriellen Konsole eine Verbindung zu deiner Instance herzustellen. Die serielle Konsole erfordert keine funktionierende Netzwerkverbindung. Nachdem du eine Verbindung hergestellt hast, führe eine Fehlerbehebung für deine Instance durch, um Probleme beim Booten, bei der Netzwerkkonfiguration oder bei der SSH-Konfiguration zu beheben.

Wenn du die serielle Konsole nicht für die Verbindung verwenden kannst, musst du ein Benutzerdatenskript verwenden, um die Sudo-Fehler zu beheben.

Das Benutzerdatenskript aktualisieren

Hinweis: Wenn du Probleme mit einem Benutzerdatenskript behebst, musst du deine Instance anhalten und starten.

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. Ein Stopp und Start unterscheidet sich von einem Instance-Neustart. Weitere Informationen findest du unter Wie Anhalten und Starten der EC2-Instance funktioniert.

Bevor du die Instance anhältst und startest, gehe wie folgt vor:

Aktualisiere dein Benutzerdatenskript

Führe die folgenden Schritte aus:

  1. Halte die Instance an.
    Hinweis: Wenn du Stop (Stopp) nicht auswählen kannst, ist die Instance bereits angehalten oder ihr Root-Gerät ist ein Instance-Speicher-Volume.
  2. Wähle deine Instance und dann Actions (Aktionen) aus.
  3. Wähle Instance settings (Instance-Einstellungen) und dann Edit User Data (Benutzerdaten bearbeiten) aus.
  4. (Optional) Wenn du die erforderlichen Berechtigungen nicht kennst, überprüfe /usr/bin/sudo auf die richtigen Berechtigungen. Führe den folgenden Befehl auf einer funktionierenden Instance mit demselben Betriebssystem aus:
    ls -l /usr/bin/sudo
    Hinweis: Die Berechtigungen für /usr/bin/sudo unterscheiden sich je nach Linux-Distribution. Du kannst die Berechtigungen in der Befehlsausgabe als Referenz verwenden. Stelle sicher, dass die Instance, auf der du den Befehl ausführst, eine Neuinstallation ist und sich nicht in der Produktion befindet. Diese Konfigurationen bedeuten, dass die Datei unverändert bleibt.
  5. Gib das folgende Benutzerdatenskript basierend auf deiner Linux-Distribution ein.
    Red Hat-basierte Distributionen:
    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
    PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:
    rpm --setugids sudo && rpm --setperms sudo
    find /etc/sudoers.d/ -type f -exec /bin/chmod 0440 {} \;
    find /etc/sudoers.d/ -type f -exec /bin/chown root:root {} \;
    --//
    Debian-basierte Distributionen:
    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
    /bin/chown root:root /usr/bin/sudo
    /bin/chmod 4111 /usr/bin/sudo
    /bin/chmod 644 /usr/lib/sudo/sudoers.so
    /bin/chmod 0440 /etc/sudoers
    /bin/chmod 750 /etc/sudoers.d
    find /etc/sudoers.d/ -type f -exec /bin/chmod 0440 {} \;
    find /etc/sudoers.d/ -type f -exec /bin/chown root:root {} \;
    --//
    Hinweis: Stelle sicher, dass du das gesamte Skript kopierst. Füge keine zusätzlichen Leerzeichen ein, wenn du das Skript eingibst. Die letzten beiden Befehlszeilen stellen die Berechtigungen, den Eigentümer und die Gruppe für die benutzerdefinierten sudo-Sicherheitsrichtlinien-Plugins im Verzeichnis /etc/sudoers.d/ wieder her.
  6. Wähle Save (Speichern) aus.
  7. Starte die Instance.
  8. Verwende SSH, um eine Verbindung zur Instance herzustellen, und führe dann einen Testbefehl aus, um zu überprüfen, ob sudo wie erwartet funktioniert.
    Beispielbefehl:
    sudo whoami
    Hinweis: Die Ausgabe für den vorherigen Beispielbefehl muss root lauten. Wenn du immer noch Berechtigungsfehler erhältst, überprüfe /var/log/cloud-init-output.log auf Ausführungsfehler im Benutzerdatenskript, die du beheben musst. Wenn du einen Syntaxfehler erhältst, siehe Wie behebe ich sudo-Fehler auf meiner Amazon-EC2- oder Amazon Lightsail-Instance, wenn ich den sudo-Befehl ausführe?
AWS OFFICIALAktualisiert vor 5 Monaten