¿Cómo hago para que sudo conserve mis variables de entorno?

47

Usando sudo 1.7.4p4 en Solaris 5.10 y sudo 1.6.7p5 en RHEL4 u6 No puedo ver cómo preservar mis variables de entorno, por ejemplo $ PYTHONPATH. He agregado esta línea a los sudoers, pero no hace ninguna diferencia:

Defaults !env_reset

¿Estoy haciendo algo mal, o la instalación de sudo simplemente no respeta la bandera env_reset?

Editar: ¡Al menos en Solaris, hemos descubierto que este problema depende del shell! El shell raíz estándar es Bourne, si ejecutamos bash bajo sudo ( sudo bash) por otro lado,! Env_preset preservará el entorno (incluyendo PATH y LD_LIBRARY_PATH). Este es un comportamiento bastante confuso, debo decir.

aknuds1
fuente
stackoverflow.com/questions/8633461/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Respuestas:

44

Use con cuidado, hay problemas de seguridad con sudo y variables.

De man sudoersencontré que deberías usar

Valores predeterminados env_reset
Valores predeterminados env_keep + = "PYTHONPATH OTRO VARIABLE AÚN MÁS"

En Ubuntu, sudoconserva algunas variables. sudo -ies más como iniciar sesión como root y luego ejecutar el comando. Ambos pueden ser inconvenientes, el primero sudo nano myfiledeja archivos propiedad de root dentro de su hogar y el segundo sudo -i nano myfileintentará abrir / root / myfile.


correr

sudo printenv PATH

y mira lo que da. Aquí da

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

por ejemplo. Ahora corre sudo visudoy agrega la línea

Defaults        secure_path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

reemplazando por lo que encontraste justo antes. Agregue una nueva ruta si es necesario.

Sobre bibliotecas:

sudo LD_LIBRARY_PATH=/usr/lib/path/to/a/safe/library your command

Las distribuciones de Linux tienen mucho cuidado PATH, y realmente debes tener cuidado antes de jugar con ellas. Tenga especial cuidado al agregar rutas como " ." o /home/usernameno es seguro.

Uno de los peligros de agregar rutas es que abre la posibilidad de que se ejecuten archivos en estas rutas root, abriendo una ventana en la seguridad del sistema que puede ser explotada por software malicioso. Puede haber otros peligros. Solo asegúrate de saber lo que estás haciendo. Eludir sudolas medidas de seguridad puede hacer que su Solaris sea tan seguro como Windows XP.

usuario39559
fuente
Gracias por la sugerencia. Al menos en Solaris, parece que env_keep funciona solo en parte, ya que ignora PATH y LD_LIBRARY_PATH. ¿Quizás sudo está construido con configuraciones que lo hacen negarse a preservar variables "peligrosas"?
aknuds1
¿Funcionó con otra persona deseable, como AKNUDS? También puede ejecutar sudo sudo -V (¡sí, dos veces sudo!) Y ver qué dice. Aquí la solución anterior funciona bien con PYTHONPATH, pero PATH realmente parece especial. El verdadero problema es con PATH. En Ubuntu construyen sudo reseteando deliberadamente PATH.
user39559
env_keep conservó PYTHONPATH y HOME para mí, por lo que claramente hay algo de filtrado.
aknuds1
En su solución revisada, sugiere que conecte el sudo PATH modificando secure_path, ¿verdad? No creo que quiera hacer eso. Sin embargo, probablemente estamos cerca de una respuesta a mi pregunta; Creo que sudo está diseñado para ignorar reset_env e ignorar variables como PATH y LD_LIBRARY_PATH, cuando se especifica con env_keep. Creo que puedo hacer sin conservar PATH / LD_LIBRARY_PATH bajo sudo, es que no es problema, pero aún así es interesante saber por qué no va a funcionar :)
aknuds1
No funcionará porque los sudoescritores fueron cuidadosos al evitar que lo hicieras. No desea que se cargue una biblioteca maliciosa porque se encontraron en la ruta utilizada por sudo. Entonces, es por eso que se reinicia. Si está codificando cosas que deben ser ejecutadas por root, cópielas en el directorio del sistema apropiado.
user39559
8

Juguetear con sudoersdebe hacerse con precaución, como han dicho otros.

Un enfoque más simple para casos más simples cuando hay variables de entorno particulares que desea preservar es simplemente pasar la variable de entorno que desea directamente a través de sudo (esto se muestra [VAR=value]en la ayuda de cmdo de sudo).

Vea este pequeño ejemplo donde también lo he demostrado para más de una variable.

$ export MY_V1=1
$ export MY_V2=2
$ printenv | grep MY_V
MY_V2=2
MY_V1=1
$ sudo MY_V1=$MY_V1 MY_V2=$MY_V2 printenv | grep MY_V
MY_V2=2
MY_V1=1

Para el PYTHONPATHejemplo original en la pregunta, solo use lo siguiente:

$ sudo PYTHONPATH=$PYTHONPATH python some_script.py
<script_output_here>

Crear un alias para este tipo de cosas es útil. Al igual que:

$ alias sudopy='sudo PYTHONPATH=$PYTHONPATH python'
Russ
fuente
1
podría ser bueno hacer eso - alias sudopy = 'sudo PYTHONPATH = $ PYTHONPATH python' - luego úselo sudopy some_script.py
Capaz Mac
@AbleMac Tienes razón. Eso fue un error ... lo arreglaré. ¡Gracias!
Russ
3

Se Defaults !env_resetve bien, asumiendo que no estás llamando a sudo con la -Eopción.

Podría intentar eliminar esa entrada por completo.

¿Has verificado que estás editando el archivo sudoers correcto? Supongo que podría ser /etc/sudoerso /usr/local/etc/sudoersdependiendo de cómo se instaló. ¿Lo editaste usando visudo?

¿Cómo estás ejecutando sudo? sudo python, sudo su, sudo su -, sudo -s, Alguna otra cosa? Solo sudo pythony sudo supreservaría su entorno.

Que env | grep PYTHONPATHdice Si no hay nada, asegúrese de exportar PYTHONPATH ejecutando export PYTHONPATHe intente nuevamente.

Que sudo env | grep PYTHONPATHdice Si imprime el valor esperado, entonces algo más está sobrescribiendo su valor de PYTHONPATH. Tal vez .bashrc o .bash_profile de la raíz o los archivos de configuración de todo el sistema.

Mikel
fuente
1
Estoy bastante seguro de que estoy editando los sudoers correctos, con el prefijo de instalación correspondiente a sudo. Estoy ejecutando sudo como "sudo su". Tendré que responderle, en unos días, lamentablemente, por escrito con el resto de sus sugerencias. ¡Gracias!
aknuds1
1
Intente cambiar una configuración sin importancia como editoro passpromptpara ver si tiene el archivo correcto. O use strace, dtrace, truss o similar y vea qué archivos abre.
Mikel
env | grep PYTHONPATH mientras mi usuario imprime el valor esperado, sin embargo, bajo sudo, no se imprime nada. Editando sudoers, puedo asegurarme de que PYTHONPATH se conserva modificando "env_keep". Sin embargo, env_keep no conservará PATH o LD_LIBRARY_PATH. ¿Supongo que sudo tiene una restricción de seguridad para no preservar variables como PATH y LD_LIBRARY_PATH? ¿Una configuración de tiempo de construcción tal vez?
aknuds1
1
! env_reset es ignorado por lo que puedo decir, pero puedo verificarlo mañana. Estoy bastante seguro de que env_delete no se está configurando, pero también puedo verificarlo.
aknuds1
1
He confirmado que! Env_reset se ignora y env_delete no está configurado.
aknuds1
-1

De acuerdo con la documentación de Ubuntu para LD_LIBRARY_PATH :

Debe usar los archivos de configuración /etc/ld.so.conf.d/*.conf

Entonces:

  1. Agregue un ld.soarchivo de configuración /etc/ld.so.conf.d/con la ruta de suLD_LIBRARY_PATH

  2. Actualice el caché con:

    sudo ldconfig -v
    
OlPo
fuente
Bien, pero la pregunta no es sobre Ubuntu. Sugerencia: la próxima vez mira las etiquetas debajo de la pregunta.
DavidPostill