2009-02-08 16 views
17

Me gustaría saber si es posible para un usuario no root en Linux (estoy usando openSUSE) ejecutar Apache sin usar el comando sudo. Tenga en cuenta que el usuario está en el mismo grupo que apache (wwwrun).
Gracias de antemano.¿Hay alguna manera de iniciar/reiniciar/detener el servidor Apache en Linux como usuario no root?

+0

SI sabía que iba a responder, pero en su lugar te diré que esta no es una pregunta de programación :) En serio, sin embargo, no sé la respuesta. Es una gran pregunta, de hecho. –

+1

Gracias y sí, no estaba seguro de si esta pregunta encaja en la programación, sin embargo, lo intenté :). – Adriana

+4

Podría decirse que está relacionado con la programación, ya que la razón más común para querer hacer esto, en mi experiencia, es para que un programador pueda reiniciar apache más fácilmente en su caja de desarrollo. –

Respuesta

3

Los problemas señalados anteriormente por benlumley, es decir, archivos de registro y puertos reservados, pueden superarse fácilmente configurando el directorio de registro y el puerto en su httpd.conf.

+2

No hay forma de evitar las limitaciones de acceso a los puertos privilegiados sin acceso privilegiado. – kmkaplan

+0

"Configurar el ... puerto en su httpd.conf" es una forma de evitar las limitaciones de acceso a los puertos privilegiados, ya que puede elegir un puerto sin privilegios para escuchar. –

+0

Oh, vale, no me había dado cuenta de que un puerto no estándar sería perfecto para el Día. – kmkaplan

1

Los dos problemas que se me ocurre que se necesita para superar son:

  1. permisos en los archivos de registro - estos también pueden estar ya preparado para permitir la wwwrun para acceder a ellos, pero su a menudo un problema.

  2. Usuario no root que accede a un puerto con privilegios (80): no estoy seguro de/cómo puede cambiar esto.

10

Puede ejecutar Apache como cualquier otro usuario. Solo asegúrese de que esté configurado para usar solo los recursos permitidos (directorios, archivos y lo más importante, escuchar en un puerto no privilegiado).

Para que aparezca en el puerto estándar 80 de HTTP (que está privilegiado) deberá configurar, como root una redirección a su servidor Apache real. La forma más fácil es probablemente usar iptables. Por ejemplo, si el servidor Apache está escuchando en el puerto 8080:

iptables -t nat -A PREROUTING -p tcp --dport 80 --syn -j REDIRECT --to-port 8080 

Si no puede configurar el servidor de esta manera (o que su administrador de sistemas puede hacer que una vez por todas), tendrá que utilizar un puerto no privilegiado (algo como Listen 8080) y acceder a ella mediante una dirección URL que se parece a http://www.example.com:8080/

+0

El problema es que no puedo convertirme en root, así que estoy buscando una forma de superar todo lo que se debe hacer como root. Pero gracias por tu respuesta. – Adriana

0

Creo que debería ser capaz de hacer esto mediante la concesión de acceso de ejecución al grupo al que pertenece el programa de control de Apache (por ejemplo, "chmod g + x apachectl"). Si esto no funciona solo, intente también configurar el bit SUID del propietario en el programa (algo similar a "chmod u + s apachectl").

El primer paso permite a los usuarios de su grupo wwwrun ejecutar el programa apachectl. El segundo paso hace que cuando el grupo ejecuta el programa, se ejecute con los privilegios de propietarios del programa.

Avíseme si esto funciona, estoy un poco oxidado con la ejecución de archivos SUID, pero puedo ayudar a investigar más si todavía tiene problemas.

Sin embargo, asegúrese de entender las consecuencias de configurar el bit SUID antes de hacer esto.

5

Respuesta corta: No

La razón para ello es que sólo root puede obligar a los puertos por debajo de 1024.

Respuesta larga: consulta http://www.debian-administration.org/articles/386

Una vez que superar el problema con los puertos, lo no pienses que habrá más problemas. Solo recuerda que el usuario al que se ejecuta apache necesita tener acceso de escritura a los archivos de registro y tal vez también a otros archivos.

Sin embargo, si lo ejecuta sin sudo, el generador probablemente no podrá cambiar el usuario, por lo que apache se ejecutará como el usuario que lo inicia, en lugar del usuario de apache.

¿Pero cuál es la razón por la que no desea ejecutar sudo?Solo el proceso de generación se está ejecutando como raíz, el resto se está ejecutando bajo el usuario apache.

0

Puede "setuid" para permitir que los usuarios no root ejecuten apachectl como root (sin tener que autenticarse como root).

Example

Editar: hay que mencionar que necesita acceso root para configurar esto en el primer lugar :-)

+0

Pensé lo mismo.Intenté y no vuela. (13) Permiso denegado: make_sock: no se pudo vincular a la dirección [::]: 80 (13) Permiso denegado: make_sock: no se pudo vincular a la dirección 0.0.0.0:80 –

+0

Mi error - Generalmente, setuid se ignora para los scripts de shell (por razones de seguridad). Echa un vistazo a la respuesta de Emanuel. – Nick

+0

La respuesta de Emanuel vuela. –

5

Si ha instalado sudo puede crear un archivo: /etc/suduers.d/apache2reload con el siguiente contenido:

username ALL=NOPASSWD:/usr/bin/service apache2 reload 
+0

No haría eso. No puedo entender por qué tanta gente publicó esta opción. Por defecto, una vez que haces el comando sudo, no tienes que ingresar la contraseña para ejecutar otro comando sudo, dándoles acceso libre a la raíz. – dtc

+0

Esto no fue "predeterminado" en los dos sistemas que acabo de probar (Ubuntu 14.04, SLES 11) - vale la pena comprobarlo usted mismo. – Nick

+0

Esta es la respuesta correcta. Cambiar el usuario que apache se ejecuta como (que de todos modos no es raíz) no hace la diferencia. La objeción de @dtc se basa en un malentendido acerca de cómo funciona el sudoers conf. – jwg

0

puede ver sus privilegios con sudo -l, desde aquí se puede encontrar que usted tiene acceso al comando de reinicio, pero tal vez no iniciar o parar.

0

Algunos enlaces que encontré dieron la respuesta más beneficiosa para esto. Técnicamente, todavía está actuando como root pero puedes modificar los archivos apache2 y apache2ctl (si también usas el segundo) para cargar archivos. Esto le permite ejecutarlos con acceso raíz pero seguir siendo de un usuario que tiene los mismos permisos, manteniendo la seguridad intacta (a menos que apache o apache2ctl fueran más locos, lo que dudo que sean).

-1

puede utilizar para ejecutar el supervisor de Apache

3

Si no quieren dar a conocer el acceso sudo, también puede crear un programa envoltorio setuid. Por ejemplo:

httpdctrl.c

#include <stdio.h> 
#include <sys/types.h> 
#include <unistd.h> 
#include <signal.h> 
#include <strings.h> 

// allow start/stop/restart of apache by non-root users 

int main(int argc, char **argv) 
{ 
    char *cmd, *cmd2, *usage; 

    // UPDATE THIS LINE: 
    cmd = "/your/path/to/httpd/sbin/apachectl"; 
    cmd2 = "apachectl"; 
    usage = "Usage: COMMAND [start|stop|restart]\n"; 

    if (argc != 2) { 
    printf(usage); 
    exit(1); 
    } 

    setegid(0); 
    seteuid(0); 
    setgid(0); 
    setuid(0); 

    if (strncmp(argv[1], "start", 5) == 0) { 
    if (execl(cmd, cmd2, "start", (char*)0) < 0) { 
    perror("Error"); 
    } 
    } else if (strncmp(argv[1], "stop", 4) == 0) { 
    if (execl(cmd, cmd2, "stop", (char*)0) < 0) { 
    perror("Error"); 
    } 
    } else if (strncmp(argv[1], "restart", 7) == 0) { 
    if (execl(cmd, cmd2, "restart", (char*)0) < 0) { 
    perror("Error"); 
    } 
    } else { 
    printf(usage); 
    exit(1); 
    } 
    exit(0); 
} 

actualizar la ruta en:

// UPDATE THIS LINE: 
    cmd = "/your/path/to/httpd/sbin/apachectl"; 

A continuación, compilar y cambiar permisions con

gcc -o httpdctrl httpdctrl.c 
sudo chown root:root httpdctrl 
sudo chmod u+s httpdctrl 

Ahora el httpdctrl es propiedad de root, y setuid lo ejecutará como raíz.

IMPORTANTE: Asegúrese de que el script de inicio/detención y todos los directorios principales también son propiedad de root. También elimine el acceso de escritura a archivos y directorios para 'otros'. Básicamente, no desea que alguien pueda editar o cambiar los directorios/archivos que se ejecutan con la raíz.

Cuestiones relacionadas