usuario apache y acceso root

usuario apache y acceso root

Quiero desarrollar algunos scripts en PHP que invoquen los siguientes comandos; usando la función exec()

service network restart

crontab -u root /xyz/abc/fjs/crontab

etc.

El problema es que Apache ejecuta el script como usuario de Apache (estoy en CentOS 5), independientemente de agregar Apache a la rueda ohaciendo el bien, el mal y el feo la asignación de grupo no ejecuta comandos (como se mencionó anteriormente).

Las siguientes son mis configuraciones;

Mis /etc/sudoers

root    ALL=(ALL)       ALL
apache  ALL=(ALL)       NOPASSWD: ALL
%wheel  ALL=(ALL)       ALL
%wheel  ALL=(ALL)       NOPASSWD: ALL

Como probé un par de combinaciones con sudoer y httpd.conf, el httpd.conf reciente se ve así;

mi httpd.conf

User apache
Group wheel

mi script PHP

exec("service network start", $a);
print_r($a);

exec("sudo -u root service network start", $a);
print_r($a);

Producción

Array
(
    [0] => Bringing up loopback interface:  [FAILED]
    [1] => Bringing up interface eth0:  [FAILED]
    [2] => Bringing up interface eth0_1:  [FAILED]
    [3] => Bringing up interface eth1:  [FAILED]
)
Array
(
    [0] => Bringing up loopback interface:  [FAILED]
    [1] => Bringing up interface eth0:  [FAILED]
    [2] => Bringing up interface eth0_1:  [FAILED]
    [3] => Bringing up interface eth1:  [FAILED]
)

Sin sorpresa, cuando invoco reiniciar servicios de red a través de ssh, usando un usuario similar como apache, el comando se ejecuta exitosamente. Se trata de acceder a dichos comandos a través del protocolo HTTP. Estoy seguro de que el tipo de software cPanel/Plesk usa algo como sudoer o algo así y lo que estoy tratando de hacer es básicamente posible. ¿Pero necesito tu ayuda para entender qué pieza me falta?

¡Muchas gracias!

Respuesta1

Si toma la solución de Troyengel de generar una entrada en la tabla cron raíz y luego la modifica un poco, es posible que tenga una solución viable.

Si absolutamente necesita usar Apache para indicar un reinicio de la interfaz, ¿por qué no hacer que PHP cree un archivo que actúe como un indicador y luego hacer que su cronjob raíz que se ejecuta cada minuto (o lo que sea) verifique la existencia de ese indicador? Si existe, reinicie las interfaces. Si no es así, muere. (recuerde hacer que el cronjob elimine la bandera después de que reinicie exitosamente la interfaz).

Esto logra el objetivo (reiniciar la interfaz, activada desde apache/php) y evita todos los posibles problemas relacionados con otorgar acceso a nivel raíz a un servicio web/scripting.

Respuesta2

Tendrá que escribirlas como herramientas PHP impulsadas por la línea de comandos (asegúrese de que el paquete php-cli esté instalado a través de yum), luego ejecutarlas directamente en el crontab raíz, no como un usuario normal. Probablemente también quieras escribirlo en un script básico de bash (shell), usar php sería excesivo si solo estás ejecutando comandos a través de exec().

Respuesta3

Debe invocar los comandos que necesita para ejecutar como un usuario diferente sudoy luego configurar el sudoersarchivo de configuración de manera adecuada para que el usuario que ejecuta el script PHP pueda ejecutar los scripts como el otro usuario. Consulte sudoers(5) y aproximadamente una docena de preguntas anteriores sobre el uso de sudo.

Respuesta4

podrías usar el bit adhesivo para ejecutar un script de shell como root. sin embargo, hacer eso es un poco más complicado.

Sin embargo, no puedes simplemente establecer tuid en un script de shell. Necesita crear un ejecutable regular con, por ejemplo, C/C++, algo que no llame a un intérprete como lo hacen los scripts de Shell, y hacer que ejecute el script de Shell.

información relacionada