Wie kann der Benutzer die Umgebung mit sudo schützen?

17

Beim Versuch, einige Umgebungsvariablen beim Ausführen an die neue Umgebung weiterzuleiten, tritt der folgende Fehler auf sudo:

sudo: sorry, you are not allowed to preserve the environment

Einige Informationen, die beim Debuggen hilfreich sein können:

[deploy@worker1 ~]$ sudo -l
    Matching Defaults entries for deploy on this host:
    requiretty, !visiblepw, always_set_home, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE",
    env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET
    XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin, env_keep+="GIT_WORK_TREE GIT_DIR", !requiretty

User deploy may run the following commands on this host:
    (ALL) NOPASSWD: /usr/bin/git, (ALL) /etc/init.d/httpd*, (ALL) /sbin/service, (ALL) /usr/bin/make, (ALL) /bin/echo

Mein Laufbeispiel:

[deploy@worker1 ~]$ export GIT_DIR="/home/ashinn/testing"
[deploy@worker1 ~]$ sudo -E sh -c 'echo "$GIT_DIR"'
sudo: sorry, you are not allowed to preserve the environment

Meine sudoers.d-Datei für diese spezielle Konfiguration:

Defaults:deploy         env_keep += "GIT_WORK_TREE GIT_DIR", !requiretty
deploy  ALL=(ALL)       NOPASSWD: /usr/bin/git, /etc/init.d/httpd*, /sbin/service, /usr/bin/make, /bin/echo

Ich habe auch versucht !env_reset, die Standardeinstellungen hinzuzufügen , und es schlägt immer noch mit dem gleichen Fehler fehl. Ich habe das Gefühl, dass ich etwas Offensichtliches vermisse und ein zweites Paar Augen brauche. Was vermisse ich hier?

Andy Shinn
quelle
1
Ich glaube, dass ungefähr 93% von uns den Punkt Ihrer Frage verstehen, aber Ihr Beispielbefehl ist nicht sehr gut.  Wenn dies nicht sofort fehlschlägt, wird der Vorgabewert von angezeigt , da die Shell die Variable in der Befehlszeile erweitert, bevor sie überhaupt aufgerufen wird. Bessere Tests sind oder oder , wo wir uns die Umgebung des Prozesses ansehen, der privilegiert läuft. sudo (option(s)) echo $GIT_DIRsudo$GIT_DIRsudosudo printenv GIT_DIRsudo env | grep GIT_DIRsudo sh -c 'echo "$GIT_DIR"'
G-Man sagt, dass Monica
Siehe auch diese Frage zum Stack Overflow .
Franklin Yu

Antworten:

27

Sie können das SETENV"Tag" in Ihrer sudoersDatei verwenden, wie in:

deploy  ALL=(ALL)       SETENV: /usr/bin/git, /etc/init.d/httpd*, /sbin/service, /usr/bin/make, /bin/echo

Oder, um es mit NOPASSWD zu kombinieren:

deploy  ALL=(ALL)       NOPASSWD:SETENV: /usr/bin/git, /etc/init.d/httpd*, /sbin/service, /usr/bin/make, /bin/echo

Relevanter Auszug aus dem Sudoer-Man:

SETENV und NOSETENV

Diese Tags überschreiben den Wert der Option setenv auf Befehlsbasis. Beachten Sie, dass der Benutzer die Option env_reset in der Befehlszeile über die Option -E deaktivieren kann, wenn SETENV für einen Befehl festgelegt wurde. Zusätzlich Umgebungsvariablen in der Befehlszeile festgelegt sind , unterliegen nicht die von auferlegten Beschränkungen env_check, env_deleteoder env_keep. Daher sollten nur vertrauenswürdige Benutzer die Möglichkeit haben, Variablen auf diese Weise festzulegen. Wenn der übereinstimmende Befehl ALL ist, wird das SETENV-Tag für diesen Befehl impliziert. Diese Standardeinstellung kann mit dem NOSETENV-Tag überschrieben werden.

Iodbh
quelle
1

Geben Sie die -EOption nicht an. Wenn -ESie sagen, dass alle Umgebungsvariablen für den Benutzer deployerhalten bleiben sollen, nicht nurGIT_DIR

Laufen sudo echo $GIT_DIRsollte funktionieren, da Sie GIT_DIRder env_keepListe hinzugefügt haben

Stian S
quelle