Benutzer darf einen Befehl mit Argumenten ausführen (die Leerzeichen enthalten)

17

Ich möchte einem Benutzer erlauben, grep (über sudo) auszuführen und nach einer bestimmten Zeichenfolge in einer bestimmten Datei zu suchen. Ich möchte nicht zulassen, dass dieser Benutzer grep für alle Dateien ausführen kann. Der Benutzer hat keinen Lesezugriff auf die Datei, daher muss sudo verwendet werden. Ich versuche, eine Nagios-Überprüfung zu schreiben, die die Protokolldatei eines anderen Dienstes auf dem Computer abruft.

Es funktioniert jedoch nicht, sudo fragt nach einem Passwort.

Mein Befehl lautet: sudo grep "string I want (" /var/log/thefilename.log(Ja, es gibt ein RAW (und einige Leerzeichen in der Zeichenfolge, die ich abfragen möchte.)

/etc/sudoers.d/user-can-grep hat diesen Inhalt:

user ALL=(root) NOPASSWD: /bin/grep "string I want (" /var/log/thefilename.log

Diese sudoers-Datei gehört root:rootund hat Berechtigungen-r--r-----

Der Server ist Ubuntu Trusty 14.04.3 LTS.

Wie kann ich das schaffen?

Rory
quelle
Ruft die Nagios-Prüfung explizit / bin / grep oder / usr / bin / grep auf?
Jeff Schaller
Schreiben Sie ein Shell-Skript, das dies ausführt, und lassen Sie das Skript dann ausführen sudo.
user253751
@ JeffSchaller FYI das Skript ruft nur grep, und which grepsagt mir, dass es verwendet /bin/grep. AFAIK in sudo-Datei müssen Sie den vollständigen Pfad der Binärdatei angeben, auch wenn Sie es ohne den vollständigen Pfad aufrufen.
Rory

Antworten:

13

Anscheinend reduziert sudo den Befehl in einen String, bevor er mit einer Spezifikation in der sudoers-Datei verglichen wird. In Ihrem Fall müssen Sie also keine Anführungszeichen oder andere Formen der Flucht verwenden:

user ALL=(root) NOPASSWD: /bin/grep string I want ( /var/log/thefilename.log

Edit : Wie @ user23013 in den Kommentaren vermerkt, kann dies ausgenutzt werden, um in jeder Datei nach "string I want" zu suchen (und in der Erweiterung auch nach "string I" und "string".) mit sudos argument überprüfung!


Beachten Sie auch, dass die folgenden Aufrufe gleichwertig sind, dh Sie können Benutzer nicht auf eine bestimmte Darstellung beschränken:

sudo grep "string I want (" /var/log/thefilename.log
sudo grep 'string I want (' /var/log/thefilename.log
sudo grep string\ I\ want\ \( /var/log/thefilename.log

Dies liegt an der Tatsache, dass Anführungszeichen und Escapezeichen von der Shell gehandhabt werden und niemals erreicht werden sudo.

Alexander Batischev
quelle
Interessant, ich frage mich, ob das ausnutzbar ist, dh davon zu überzeugen, dass sudoSie eine Sache eingegeben haben (die der Spezifikation entspricht), aber wenn es darum geht, sie auszuführen, ist es etwas ganz anderes.
EightBitTony
4
@EightBitTony Natürlich ist es das! In Ihrem sudoers: user host = NOPASSWD: /usr/bin/vim Editing sudoers file(mit Absicht, damit Benutzer bearbeiten „Bearbeiten sudoers - Datei“) durch ausgenutzt werden cd‚ing in /etc/Laufen sudo vim Editing sudoers file. Ich würde sagen, dass für jeden Befehl von angemessener Komplexität der in Ihrem Kommentar vorgeschlagene Ansatz verwendet werden sollte. Die Shell bietet eine $@Variable, mit der Sie überprüfen können, ob die Argumente so gruppiert sind, wie Sie es erwarten.
Alexander Batischev
8
Erstellen Sie einen Pfad an einer ( /var/logbeliebigen Stelle und verknüpfen Sie ihn thefilename.logmit einer beliebigen Datei. Der Benutzer kann dann string I wantvon jeder beliebigen Datei aus zugreifen .
user23013
2
Die Antwort von @ EightBitTony (Schreiben eines Wrapper-Skripts, Ermöglichen des sudo-Zugriffs auf dieses Skript) ist viel besser und sicherer.
cas
Wow, das ist eine extrem schlechte Praxis für ein sicherheitsorientiertes Tool.
Sam Watkins
32
  1. Schreiben Sie ein Skript (nur von root beschreibbar)
  2. Führen grepSie in diesem Skript das benötigte aus
  3. Erlauben Sie in der sudoers-Konfiguration nur den Zugriff auf dieses Skript
  4. Konfigurieren Sie jedes Tool oder raten Sie jedem Benutzer, das Skript einfach über sudo auszuführen

Es ist viel einfacher zu debuggen, es ist einfacher, den Zugriff auf eine bestimmte Datei zu sperren und es ist viel schwieriger, sie auszunutzen.

EightBitTony
quelle
2

Da Sie nur root für den Dateizugriff benötigen, sollten Sie erwägen cat, dieses teeoder ein ähnliches grepProgramm zu verwenden und es an das Programm weiterzuleiten, das Sie ausführen müssen. Auf sudo cat /file/path | grep …diese Weise beschränken Sie root darauf, wo Sie es unbedingt brauchen.

user167676
quelle
0

sudoist toll, aber manchmal ist es nicht die beste Passform. Dafür nutze ich gerne super. superErlaubt auch erhöhte Berechtigungen, setzt jedoch Befehls-Aliase voraus, was praktisch ist, wenn komplizierte Befehlszeilen zugelassen werden, da sie als einfache Befehlszeilen verwendet werden.

Ihre super.tab würde so aussehen:

grepcmd "grep 'string I want (' /var/log/thefilename.log" user

und würde aufgerufen werden als super grepcmd.

hildred
quelle
sudohas Cmnd_Alias(der einen oder mehrere Befehle mit oder ohne Argumentbeschränkungen enthalten kann).
cas
Gar nicht das Gleiche. Cmnd_Alias ​​ist ein Tool zur Vereinfachung der Konfigurationsdatei. Es stellt dem Benutzer keinen Alias ​​zur Verfügung, der der primäre Betriebsmodus von Super ist (weshalb ich sudo verwende, wenn ich keine Aliasing-Befehle oder keine suid-Skripte ausführe (die meiste Zeit) und super für diese beiden Anwendungsfälle).
Hildred
Das ist, wofür Wrapper-Skripte sind ... und sie sind nicht auf Einzeiler beschränkt oder haben nervige Zitatprobleme.
cas