it-swarm.com.de

Benutzer darf einen Befehl mit Argumenten ausführen (der Leerzeichen enthält).

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 diesem Benutzer nicht erlauben, grep für alle Dateien auszuführen. Der Benutzer hat keinen Lesezugriff auf die Datei, daher ist die Verwendung von Sudo erforderlich. Ich versuche, eine Nagios-Prüfung zu schreiben, die die Protokolldatei eines anderen Dienstes auf dem Computer erfasst.

Sudo fragt jedoch immer wieder nach einem Passwort.

Mein Befehl lautet: Sudo grep "string I want (" /var/log/thefilename.log (ja, es gibt ein rohes ( und einige Leerzeichen in der Zeichenfolge, die ich grep)

/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:root und hat Berechtigungen -r--r-----

Der Server ist Ubuntu Trusty 14.04.3 LTS.

Wie kann ich das zum Laufen bringen?

17
Rory

Anscheinend glättet Sudo den Befehl in eine Zeichenfolge, 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

Bearbeiten: Wie @ user23013 in den Kommentaren ausführt, kann dies ausgenutzt werden, um in jeder Datei nach "string I want" zu suchen (und im weiteren Sinne auch nach "string I" und "string"). ) Bitte überlegen Sie genau, bevor Sie die Argumentprüfung von Sudo verwenden!


Beachten Sie auch, dass die folgenden Aufrufe gleichwertig sind, d. H. 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 verarbeitet werden und niemals Sudo erreichen.

13
  1. Schreiben Sie ein Skript (nur von root beschreibbar)
  2. Führen Sie in diesem Skript das grep aus, das Sie benötigen
  3. Erlauben Sie in der sudoers-Konfiguration nur den Zugriff auf dieses Skript
  4. Konfigurieren Sie ein beliebiges Tool oder empfehlen Sie dem Benutzer, das Skript nur über Sudo auszuführen

Viel einfacher zu debuggen, einfacher, bestimmten Zugriff auf eine bestimmte Datei zu sperren und viel schwieriger auszunutzen.

32
EightBitTony

Da Sie nur root für den Dateizugriff benötigen, sollten Sie cat, tee oder ähnliches verwenden und dieses an grep oder ein anderes Programm weiterleiten, das Sie ausführen müssen. Z.B. Sudo cat /file/path | grep … Auf diese Weise beschränken Sie root auf den Ort, an dem Sie ihn unbedingt benötigen.

2
user167676

Sudo ist großartig, aber manchmal passt es nicht am besten. Dafür verwende ich gerne super. super erlaubt auch erhöhte Berechtigungen, setzt jedoch Befehlsaliasnamen voraus, was praktisch ist, wenn komplizierte Befehlszeilen zulässig sind, da sie als einfache Befehlszeilen verwendet werden.

ihre super.tab würde aussehen wie:

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

und würde als super grepcmd aufgerufen.

0
hildred