¿Cómo permitir al usuario preservar el entorno con sudo?

17

Me encuentro con el siguiente error al intentar permitir que algunas variables de entorno pasen al nuevo entorno cuando se ejecuta sudo:

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

Alguna información que puede ser útil para depurar:

[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

Mi ejemplo de ejecución:

[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

Mi archivo sudoers.d para esta configuración específica:

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

También he intentado agregar !env_reseta los valores predeterminados y todavía falla con el mismo error. Siento que me falta algo obvio y necesito un segundo par de ojos. ¿Que me estoy perdiendo aqui?

Andy Shinn
fuente
1
Creo que aproximadamente el 93% de nosotros comprende el punto de su pregunta, pero su comando de ejemplo no es muy bueno.  , si no falla directamente, mostrará el valor previo de , porque el shell expande la variable en la línea de comando incluso antes de que se invoque. Las mejores pruebas son or o , donde realmente estamos viendo el entorno del proceso que se ejecuta con privilegios. sudo (option(s)) echo $GIT_DIRsudo$GIT_DIRsudosudo printenv GIT_DIRsudo env | grep GIT_DIRsudo sh -c 'echo "$GIT_DIR"'
G-Man dice 'Restablece a Mónica' el
Vea también esta pregunta sobre Desbordamiento de pila .
Franklin Yu

Respuestas:

27

Puede usar la SETENV"Etiqueta" en su sudoersarchivo, como en:

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

O, para combinarlo con NOPASSWD:

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

Extracto relevante del hombre de los sudoers:

SETENV y NOSETENV

Estas etiquetas anulan el valor de la opción setenv por comando. Tenga en cuenta que si SETENV se ha configurado para un comando, el usuario puede deshabilitar la opción env_reset desde la línea de comando a través de la opción -E. Además, las variables de entorno establecidas en la línea de comandos no están sujetos a las restricciones impuestas por env_check, env_deleteo env_keep. Como tal, solo los usuarios de confianza deberían poder establecer variables de esta manera. Si el comando coincidente es TODO, la etiqueta SETENV está implícita para ese comando; este valor predeterminado se puede anular mediante el uso de la etiqueta NOSETENV.

iodbh
fuente
1

No especifique la -Eopción. Usando -Eusted está diciendo que todas las variables de entorno para el usuario deploydeben ser preservadas, no soloGIT_DIR

Correr sudo echo $GIT_DIRdebería funcionar porque has agregado GIT_DIRa la env_keeplista

Stian S
fuente