Estoy haciendo una interfaz web para monitorizar algunos servicios: comprobar si están corriendo o no, y poder arrancar, parar o reiniciarlos.
El código del lado del servidor es en PHP así que con
shell_exec no tuve problema para comprobar si los procesos están funcionando o no con
ps -e | grep nombredelproceso
.
Hasta ahí bien, el problema es que para arrancar, parar o reiniciar necesito ser root, y ejecutar apache como root no me parece una buena idea desde el punto de vista de la seguridad.
Lo primero que he probado es a crear un script que arranque o pare servicios, activarle el bit SUID, y ya llamarlo desde PHP, pero por lo que he podido investigar, resulta que por motivos de seguridad, el SUID se ignora para los scripts, entonces me sigue dando el problema de permiso denegado. Por ahí decían de hacer un programa en C que llame al script, y ahora sí, supuestamente el SUID activado no se ignoraría en este programa en C. Para lo que tenía pensado hacer, algo sencillo, con un fichero html, un css, un js y dos php, que permitiera un "deploy" fácil y rápido esto me parece complicarse demasiado, aparte que ya habría que andar compilando dependiendo de la plataforma, en caso de que sea x86 o ARM.
Luego está la opción de hacerlo con sudo, automatizando la introducción de la contraseña... cosa que no me gusta porque significa dejar la contraseña en texto plano, y además hacer sudoer a www-data (el usuario por defecto que crea Apache) significaría poco más o menos que ejecutarlo como root.
¿Alguna solución sencilla y directa a poder ser, para arrancar o parar servicios con
service sin ser root pero usando el usuario limitado www-data?
PD: Sobre temas de seguridad no hay problema, los servicios monitorizables, arrancables y parables hay que meterlos en un fichero en el cual sólo root puede escribir, con lo cual no quedarían expuestos servicios esenciales del sistema.
Edito: Debido al control de flooding que tiene EOL no me deja poner una respuesta hasta dentro de 5 días, asi que edito a continuación.
Justo después de abrir el hilo, cuando ya estaba a punto de abandonar hasta que alguien me pudiera echar una mano, se me ha ocurrido buscar en google por "servicios permisos linux", y he dado con el siguiente enlace:
http://ernestogamez.es/dar-permisos-a-usuario-linux-para-ejecutar-aplicaciones/.
A partir de ahí, ha sido ir al fichero
/etc/sudoers y añadir lo siguiente:
www-data ALL=(ALL) NOPASSWD: /usr/sbin/service
Y ya se pueden arrancar y parar servicios haciendo llamadas desde PHP, y además como yo quería, sin pedir contraseña para automatizarlo pero sin dejarla en texto plano, y sólo añadiendo el permiso que me es necesario, nada de hacer al usuario root. Eso sí, hay que poner
sudo al principio del comando para que este privilegio se haga efectivo.