Erlaube komplexen sudo Befehl unter Debian Linux

13

Ich muss einen bestimmten Befehl auf einer Debian Linux-Box für einen einzelnen Benutzer zulassen. Ich habe dies in der /etc/sudoersDatei versucht :

# User privilege specification
zabbix  ALL=NOPASSWD: /usr/bin/apt-get --print-uris -qq -y upgrade 2>/dev/null |awk '{print $2}' | wc | awk '{print $1}'

Das funktioniert nicht wie erwartet. Wenn ich den Befehl als Benutzer zabbix mit sudo ausführe, fragt er nach dem Kennwort (obwohl ich die NOPASSWDOption angegeben habe).

Dies funktioniert jedoch:

# User privilege specification
zabbix  ALL=NOPASSWD: /usr/bin/apt-get

apt-getHat aber den Nachteil, dass alle Unterbefehle von erlaubt sind. Gibt es eine Möglichkeit, wie ich dies beheben kann, um nur einen bestimmten Befehl zuzulassen?

Daniel
quelle

Antworten:

10

Ich bin nicht einverstanden mit Lain. Obwohl es funktionieren wird, müssen Sie nicht awkals root ausgeführt werden. Ich würde mich damit nicht wohl fühlen, weil Sie in der Lage sein könnten, auf awkirgendeine Weise anzugreifen . Es ist schließlich ein vollständiger Programmierspracheninterpreter.

Wenn eine ausgeführt wird sudo /usr/bin/apt-get --print-uris -qq -y upgrade 2>/dev/null |awk '{print $2}' | wc | awk '{print $1}', werden sie tatsächlich ausgeführt sudo /usr/bin/apt-get --print-uris -qq -y upgradeund leiten dann als aufrufender Benutzer um.

Versuche dies: zabbix ALL=NOPASSWD: /usr/bin/apt-get --print-uris -qq -y upgrade

Übrigens, es ist nichts Falsches daran, dies so in ein Skript einzufügen, wie es Lain tut, und das könnten Sie immer noch tun. Ich würde es einfach vermeiden, awk als root auszuführen, wenn es möglich ist.

user606723
quelle
1
Sie haben Recht, aber wenn das Skript unsicher ist, spielt es keine Rolle, was darin enthalten ist, es kann überschrieben werden und die Welt ist Ihre Auster. Wenn das Skript sicher ist, ist auch der Inhalt sicher.
user9517
25

Wahrscheinlich stören Sie die Art und Weise, wie die Umleitung mit sudo interagiert. Die Umleitung erfolgt beim anrufenden Benutzer, nicht beim privilegierten Benutzer. Es wäre wahrscheinlich einfacher für Sie, Ihren Befehl in ein Skript zu packen und dann dem zabbix-Benutzer zu erlauben, dieses Skript auszuführen, z

#!/bin/bash
/usr/bin/apt-get --print-uris -qq -y upgrade 2>/dev/null |awk '{print $2}' | wc | awk '{print $1}'

die eingestellten Sudoer wie

zabbix  ALL=NOPASSWD: /path/to/script

Jetzt wird das gesamte Skript als privilegierter Benutzer ausgeführt und nicht nur der bestimmte Befehl apt-get. Stellen Sie jedoch sicher, dass der zabbix-Benutzer nicht in das Skript schreiben kann.

user9517
quelle
1
Jemand kann mich wahrscheinlich korrigieren, wenn sudo sich bereits darum kümmert (ich erinnere mich an Probleme mit der Übergabe von Umgebungsvariablen), aber ich würde vorschlagen, awk und wc als allgemeine Best Practice für Skripte zu verwenden, damit ein Benutzer dies kann Exportiere nicht PATH = ~ user / bin: $ PATH und schreibe die gewünschten Befehle in ein Skript namens awk (oder wc) in ~ user / bin
Foon
@Foon: Ich denke du verwechselst sudo mit cron.
user9517
1
Nicht verwirrend, aber superuser.com/questions/232231/… zeigt an, dass sudo die Manipulation von PATH verhindert (und standardmäßig LD_LIBARRAY_PATH)
Foon
Ich habe etwas Ähnliches gemacht, nur ich habe das evozierende Skript verurteilt und es nur von root beschreibbar gemacht. Testen Sie, ob es für den Benutzer mit den Berechtigungen 711 funktioniert. Er kann dann nicht einmal sehen, was er unternimmt, um es zu umgehen.
Chris K