Ejecute un comando como otro usuario dentro de Apache

Ejecute un comando como otro usuario dentro de Apache

Tengo una aplicación web que ejecuta un programa que necesita X. Estoy usando xvfb para iniciarlo; Quiero ejecutarlo como otro usuario.

Probablemente podría hacerlo sudo -u username -p password my command. Sin embargo, no me siento muy bien acerca de almacenar la contraseña de los usuarios en texto sin formato.

¿Existe una forma "más inteligente" de hacer esto?

Respuesta1

UsarsuEXEClo que permite ejecutar un script como propietario del archivo, en lugar de como usuario del servidor web.

Respuesta2

La forma en que lo he visto es otorgarle al usuario de Apache el privilegio sudo solo para ese comando muy específico (apache2ctrl restart en nuestro caso). No necesita usar contraseñas; si las almacena en texto sin formato en algún lugar que el usuario de Apache pueda leer, es posible que no tenga ninguna.

A menos, por supuesto, que necesites ejecutar varios comandos diferentes a través de Sudo como usuario de Apache. Esto podría resultar incómodo si tienes que agregar privilegios sudo para cada uno de los comandos.

Respuesta3

Si necesita hacer esto fuera de Apache en algún momento, aquí tiene una solución más general.

Para permitir que un usuario ejecute repetidamente un comando específico como otro usuario, puede crear un script de shell propiedad de ese usuario con elsetuidbit habilitado que simplemente ejecuta el comando que necesita. Asegúrese de que el script solo sea ejecutable por usuarios confiables estableciendo la propiedad del grupo en el grupo Apache (asegúrese de que no haya otros usuarios en este grupo) y deshabilitando el permiso de ejecución para todos los demás además del grupo Apache y su usuario.

Un ejemplo:

# Replace $MYCOMMAND, $USERNAME, $GROUPNAME, and $MYSCRIPTNAME below
# In this case $GROUPNAME should probably be apache
su
touch $MYSCRIPTNAME
chown $USERNAME:$GROUPNAME $MYSCRIPTNAME
chmod 4750 $MYSCRIPTNAME # setuid, read/execute for group, none for others
echo '#!/bin/sh' >> $MYSCRIPTNAME
echo "sudo -u $USERNAME $MYCOMMAND" >> $MYSCRIPTNAME

Respuesta4

Quizás sea un poco tarde para responder ahora, pero creo que es necesario mencionar la NOPASSWDcaracterística .sudo

Por ejemplo, en /etc/sudoers(asumiendo que Apache es el usuario que ejecuta el servidor web):

User_Alias WWW = apache

WWW ALL =(username) NOPASSWD: my_command

Y invocar sudo -u username my_command. No es necesario almacenar la contraseña y solo permite que el servidor web se ejecute my_commandcomo nombre de usuario.

El usuario usernameaún puede conservar su contraseña.

información relacionada