Ist es möglich, die Sudo-Fähigkeit vor dem Sudo zu überprüfen?

11

Ich schreibe ein kleines Hilfsprogramm. Ich möchte, dass es versucht, sudobei Bedarf etwas auszuführen.

Das heißt: Wenn der aktuelle Benutzer mit Dateiberechtigungen nicht in der Lage ist, eine bestimmte Datei sudozu sudobearbeiten (und die Regeln dies zulassen würden), möchte ich, dass mein Dienstprogramm als Eigentümer der Datei etwas ausführt.

Ich hoffe, diese Fähigkeit im Voraus überprüfen zu können, da ich es vorziehen würde, dass sich die Systemprotokolle nicht mit Rauschen aus fehlgeschlagenen sudoVersuchen füllen . Wie sudoselbst berichtet über Fehler: "Dieser Vorfall wird gemeldet".

Also, ich bin der Hoffnung , programmatisch zu überprüfen: kann user <x>laufen command <y>über sudo?.

Hier ist das Problem: Während es /etc/sudoersdiese Zuordnung enthält, befindet es sich im Root-Besitz und ist für normale Benutzer nicht lesbar.

Ich habe darüber nachgedacht, einen auszuführenden Unterprozess zu sudo -lerzeugen (der Befehle ausgibt, die der aktuelle Benutzer sudo ausführen kann). Ich würde dann die Ausgabe davon analysieren. Dies scheint jedoch ein wenig fragil. Die Ausgabe enthält die gewünschten Informationen, aber es scheint, dass sie für Menschen zum Lesen gedacht sind (nicht für den programmatischen Verbrauch). Ich weiß nicht, ob es eine Garantie dafür gibt, dass die Ausgabe in Zukunft dem gleichen Format oder auf verschiedenen Plattformen folgt.

Wird das programmatische Parsen der sudo -lAusgabe als sicher angesehen? Wenn nicht, gibt es bessere Möglichkeiten, um im Voraus festzustellen, ob ein sudo-Befehl erfolgreich sein würde?


(Hintergrundinformationen zu X / Y: Dieses Dienstprogramm wird von einem Rollenkonto mit eingeschränktem Zugriff verwendet. Ich erwarte, dass sich einige andere Benutzer effektiv dafür entscheiden, dass das Konto mit eingeschränktem Zugriff ihre Dateien über Sudo-Regeln bearbeiten kann. Ich habe jedoch gewonnen Ich weiß nicht im Voraus, für welche dieser anderen Benutzer die entsprechende Sudo-Regel gilt.)

Peter Martin
quelle
3
Ich empfehle Ihnen einen etwas anderen Ansatz. Anstatt Regeln pro Benutzer zu haben, sollten Sie eine Gruppe haben, die alles tun darf, was Sie möchten. Auf diese Weise können Sie einfach überprüfen, ob sich der Benutzer in der Gruppe befindet. Wäre das eine anständige Alternative?
Terdon

Antworten:

13

Laut der Sudo-Manpage:

 -l, --list  If no command is specified, list the allowed (and forbidden)
             commands for the invoking user (or the user specified by the
             -U option) on the current host.  A longer list format is used
             if this option is specified multiple times and the security
             policy supports a verbose output format.

             If a command is specified and is permitted by the security
             policy, the fully-qualified path to the command is displayed
             along with any command line arguments.  If command is
             specified but not allowed, sudo will exit with a status value
             of 1.

Das wird also auf etwas hinauslaufen

if sudo -l -U $USER shutdown > /dev/null
then
   ## $USER can
else
   ## $USER cannot
fi 

Wie von Muru Verwendung entweder -U $USERoder -U $USERTOTESToder nichts, je nach Bedarf.

Archemar
quelle
Wenn Sie $USERden aktuellen Benutzer meinen wollten , können Sie einfach darauf sudo -l <command>verzichten -U $USER.
Muru
Danke - das ist nützlich. Eine Sache, die ich beim Testen dieses Ansatzes bemerkt habe, ist, dass es sich nicht um Fälle zu kümmern scheint, in denen die sudo-Regel so eingerichtet wurde, dass ALLE Befehle mit bestimmten Ausnahmen zulässig sind, wie z. B. (targetUser) ALL, !/usr/bin/foo .. in diesem Fall sudo -l -u targetUser /usr/bin/fooscheint die Ausgabe /usr/bin/foound das Beenden immer noch zu erfolgen mit Status 0. Trotzdem reicht es im Grunde für meine einfache Überprüfung und schlägt das Parsen der ausführlicheren sudo -lAusgabe.
Peter Martin