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 NOPASSWD
caracterí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_command
como nombre de usuario.
El usuario username
aún puede conservar su contraseña.