Ejecute un solo comando como otro usuario; restricciones en sudo

Ejecute un solo comando como otro usuario; restricciones en sudo

Estoy trabajando en una máquina donde no tengo root, pero hay una lista de sudocomandos permitidos. Uno de estos comandos es /bin/su - foouser. Entonces puedo escribir sudo su - foousery obtengo un shell interactivo como foouser. Entonces puedo ejecutar algunas cosas como foouser.

El problema es que foouserse trata de un usuario/shell compartido que se utiliza para generar ciertos procesos de producción importantes. No puedo personalizarlo fácilmente ni configurarlo como quiero. Y no debería trabajar en él de manera constante, lo que divide mis terminales y el historial de comandos entre aquellos en los que he iniciado sesión como yo mismo y aquellos en los que estoy foouser.

Lo que realmente me gustaría hacer es tener una manera de ejecutar un solo comando como foouser, bloquearlo, imprimir stdout y stderr en mi shell como lo haría normalmente un comando, y luego regresar conmigo todavía conectado como yo mismo (y no foouser). Esto podría, por ejemplo, encapsularse en un script para que as_foo barejecute el comando bar, como foouser, imprima stdout y stderr, devuelva el código de retorno de bary luego me devuelva a mi shell.

Puedo pedirles a los administradores del sistema que cambien los permisos. Por ejemplo, podrían agregarlo bara la lista sudo y luego podría usarlo (creo) su -cpara ejecutar la barra de la manera que describí. Pero si al día siguiente quiero correr bar2, tengo que hablar con ellos nuevamente.

¿Hay alguna salida a este dilema? Parece bastante tonto porque obviamente puedo foouserejecutar tantos comandos como quiera, por lo que no veo ninguna diferencia en términos de seguridad. Simplemente no puedo encontrar ninguna manera conveniente y obvia de hacer esto posible.

Respuesta1

sudo su - foouser <command>requiere que tenga al menos acceso de root limitado para ejecutarse su - foouser <command>como root.

sudo -u foouser <command>Puedes hacer lo que quieras en un solo paso. Pero requiere que el administrador del sistema le haya otorgado sudoacceso a foouserla cuenta de esta manera:

ignacio ALL=(foouser) ALL

en lugar de esta manera:

ignacio ALL=(root) su - foouser

Configurar sudode esta manera le permitirá definir, por ejemplo, un alias como el que imaginó:

as_foo='sudo -u foouser'

Y al evitar el su -, es posible que pueda seguir usando sus propias personalizaciones: usar sudode esta manera cambia solo la identidad del usuario pero mantiene HOMEsu valor anterior, leyendo los scripts de inicio del shell y otras personalizaciones desudirectorio de inicio en lugar de foouser's.

(Por supuesto, esos scripts también deben ser legibles para ese otro usuario, y es mejor que cualquier script compartido que pueda ejecutar se refiera foouserexplícitamente al directorio de inicio de como /home/foouseren lugar de simplemente $HOME.)

Sin embargo, hay algunas sudoconfiguraciones que pueden impedir que esa solución funcione: si la always_set_homeopción sudo está configurada en el archivo sudoers, o si env_resetla opción se configura sin agregarla HOMEa la env_keeplista, HOMEse restablecerá de todos modos. En tal situación, intente agregar la -Eopción al sudocomando para solicitar explícitamente mantener su entorno.

Y cuando realmente desee ejecutar algo foousercon el entorno configurado exactamente como está cuando inició sesión foouser(es decir, el equivalente a sudo su - foouser), agregue la -iopción para solicitarlo específicamente. También lo sudo -i -u foouseres un reemplazo 100% preciso de sudo su - foouser.

Si encuentra algún sistema con una versión tan antigua sudoque no tiene la -iopción, use la -Hopción con sudo: no es un reemplazo perfecto, pero podría ser suficiente. Es muy probable que una versión tan antigua sudotambién tenga algunos errores conocidos sensibles a la seguridad, por lo que valdría la pena actualizarla de todos modos.

Puede usarlo sudo -lcomo usted mismo para ver exactamente cómo se define su acceso a sudo y qué opciones de sudo (también conocidas como entradas predeterminadas) están vigentes para usted.

Respuesta2

Pase argumentos adicionales a su.

sudo su - foouser sh -c 'echo $USER'

información relacionada