Verhindert, dass sudo zur Eingabe eines Kennworts auffordert, wenn ein nicht zulässiger Befehl ausgeführt wird

15

Ich habe einer Gruppe die Berechtigung erteilt, bestimmte Befehle ohne Kennwort über sudo auszuführen. Wenn einer der Benutzer einen Tippfehler macht oder den falschen Befehl ausführt, werden sie vom System zur Eingabe ihres Kennworts aufgefordert und erhalten eine Fehlermeldung. Dies ist für den Benutzer verwirrend, daher möchte ich nur einen Fehler anzeigen, anstatt ihn zur Eingabe eines Kennworts aufzufordern. Ist das möglich?

Hier ist ein Beispiel meiner sudoers-Datei:

%mygroup ALL=(ALL) NOPASSWD:/usr/local/bin/myscript.sh *

Beispiel, wenn sie das falsche Skript ausführen:

# sudo /usr/local/bin/otherscript.sh
[sudo] password for user:
Sorry, user user is not allowed to execute '/usr/local/bin/otherscript.sh' as root on <hostname>.

Gewünschte Ausgabe:

Sorry, user user is not allowed to execute '/usr/local/bin/otherscript.sh' as root on <hostname>. Please check the command and try again.

Beachten Sie die fehlende Passwortabfrage.

Mein Google-Fu hat mich im Stich gelassen und liefert nur Ergebnisse auf nicht nach einem Passwort gefragt , wenn der Benutzer wird erlaubt , den Befehl auszuführen.

user184982
quelle
8
Wenn das möglich wäre, könnte es eine (kleine) Sicherheitslücke öffnen. Wenn Sie angemeldet sind und Ihre Tastatur ausleihen, kann ich nicht sehen, welche Befehle sudoSie ausführen können, ohne Ihr Kennwort einzugeben . Mit der gewünschten Funktion konnte ich diese Informationen für bestimmte Befehle abrufen.
Keith Thompson
4
Dies ist ein ziemlich großes Sicherheitsproblem. Sie sollten sudo nicht mit Skripten als Befehl verwenden. Die Benutzer können das Skript einfach bearbeiten und ausführen, was immer sie möchten, und es vollständig vor einem Audit maskieren. Fügen Sie stattdessen den Aufruf von sudo im Skript hinzu.
Coteyr
1
@coteyr, mit dem Binärdateien ausgeführt werden, sudoist ein ebenso großes Problem, wenn Benutzer Schreibzugriff auf diese Dateien haben.
Dmitry Grigoryev
1
@CarlWitthoft Aus diesem Grund verwenden Sie absolute Pfade, um zulässige Programme in sudoers anzugeben.
Dmitry Grigoryev
1
@DmitryGrigoryev, ja, aber wenn Sie sed oder so etwas für nur eine Datei verwenden, hat sudo keinen Vorteil. Das Ändern einer Datei durch einen Benutzer ist der Grund, warum Dateien Berechtigungen haben. Sie müssen das Rad nicht neu erfinden. Wenn Sie möchten, dass ein Benutzer eine Datei ändern kann, lassen Sie ihn dies zu. Es ist weder nötig noch von Vorteil, mit sudo durch die Rahmen zu springen, damit ein Benutzer eine Datei ohne Kennwort ändern kann. Du kannst es ihnen immer nur erlauben. Richtiges Werkzeug für den richtigen Job.
Coteyr

Antworten:

25

Aus einer kurzen Lektüre von sudo(8)

   -n          The -n (non-interactive) option prevents sudo from
               prompting the user for a password.  If a password is
               required for the command to run, sudo will display an error
               message and exit.

Und für die Zweifler:

# grep jdoe /etc/sudoers
jdoe    ALL=(ALL) NOPASSWD: /bin/echo
#

So getestet:

% sudo echo allowed
allowed
% sudo -n ed             
sudo: a password is required
% sudo ed               

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

Password:

Also würde ein aliasfür sudodiese Leute wahrscheinlich den Trick tun, um die Passwortabfrage zu verhindern. Warum dies eine benutzerdefinierte Kompilierung erfordert sudo, weiß ich nicht, ich habe nur das Handbuch gelesen.

Thrig
quelle
Tatsächlich. Ich würde so etwas wie alias sudo="$(which sudo) -n"in / etc / bashrc einfügen und dann je nach Wunsch entweder sudo(angepasstes Verhalten) oder command sudo(Standardverhalten) verwenden.
einen Lebenslauf vom
7

Eine Sache, die bei mir (Sudo-Version 1.8.17p1) funktioniert hat, aber nur einen Teil Ihres Problems befriedigt, ist, die Anzahl der Kennwortversuche auf 0 zu setzen.

Defaults:%mygroup passwd_tries = 0

Dadurch wird sudo mit Code 1 beendet, wenn ein Befehl ausgeführt wird, für den ein Kennwort erforderlich ist. Es wird jedoch keine Fehlermeldung ausgegeben.

meuh
quelle
Dies ist auch eine gültige Antwort, aber das Fehlen einer Fehlermeldung kann verwirrend sein. Der korrekte, aber unerwartete Fehler aus der obigen Antwort ist jedoch auch verwirrend. Ich schätze, es ist ein Fehler. Vielen Dank für eine alternative Antwort, Optionen werden immer geschätzt!
User184982
2

Du kannst nicht.

Erst wenn Sie sich authentifiziert haben, können Sie feststellen, wer Sie sind. Standardmäßig können Sie sich nicht ohne ein Kennwort authentifizieren.

Sie können die Authentifizierung ändern, um USB-Sticks, Fingerabdruckscanner, Sprachauthentifizierung, Gesichtserkennung oder eine Reihe anderer Dinge zu verwenden, aber der Punkt ist der gleiche.

Sie können sich nicht authentifizieren, ohne UND zu authentifizieren, bevor Sie sich authentifizieren. Sudo kann Ihnen nicht sagen, was Sie ausführen können oder nicht.

coteyr
quelle
2
Das Eingeben Ihres Passworts bei der Ausführung von sudo ist keine Identifizierung ("Sagen Sie, wer Sie sind"). Sudo weiß wer du bist. Das Eingeben Ihres Passworts ist eine Anwesenheitsbestätigung.
Gilles 'SO- hör auf böse zu sein'
Ich betrachte die Anwesenheitsbestätigung als "Authentifizierung". Wie bei Authentifizierung, dann Autorisierung.
Coteyr
2
Die Antwort lautet "Authentifizierung", nicht "Identifizierung". Während sudo nicht wissen , wer Sie sind, behaupten , basierend auf den Benutzer, der in an diesem Terminal angemeldet ist, weiß er nicht , wer Sie sind , bis Sie diese Identität authentifiziert haben.
Dave Sherohman
2

@StrongBad hat einen Kommentar verfasst, der eine Antwort verdient:

Ich denke, die beste Lösung wäre, ein Wrapper-Skript zu schreiben, das immer sudomit den richtigen Parametern aufruft . (Einschließlich -n)

Das Wrapper-Skript kann Argumente analysieren usw., so dass das aufgerufene Sudo-Skript so klein wie möglich und daher weniger fehleranfällig wird.

Stig Hemmer
quelle
1

Das ist nicht möglich. Die einzige Möglichkeit ist, den Quellcode zu ändern und Ihren eigenen Fork von zu kompilierensudo

user1700494
quelle
Sie haben Recht, aber ich glaube nicht, dass ich die Erlaubnis bekomme, eine benutzerdefinierte Version von sudo auf alle unsere Produktionsserver zu laden. hah
user184982