Ejecutar Apache como un usuario diferente

10

Cuando ejecuto el ps -efHcomando para enumerar todo el proceso, puedo ver Apache ejecutándose como rooty parece tener subprocesos ejecutándose como www-data. Aquí está el extracto:

root     30117     1  0 09:10 ?        00:00:00   /usr/sbin/apache2 -k start
www-data 30119 30117  0 09:10 ?        00:00:00     /usr/sbin/apache2 -k start
www-data 30120 30117  0 09:10 ?        00:00:00     /usr/sbin/apache2 -k start
www-data 30121 30117  0 09:10 ?        00:00:00     /usr/sbin/apache2 -k start

¿Puedo hacer que Apache y todos los subprocesos se ejecuten como usuarios diferentes apache2d:apache2d? ¿Si es así, cómo? Leí en alguna parte que la configuración para esto se puede encontrar /etc/apache2/httpd.confpero ese archivo parece estar vacío. ¿Se puede lograr esto cambiando el propietario y el grupo del /etc/init.d/apache2script y luego configurando el indicador setuid en él?

Mridang Agarwalla
fuente

Respuestas:

21

Apache tiene que ejecutarse como root inicialmente para vincularse al puerto 80. Si no lo ejecuta como root inicialmente, entonces no puede vincularse al puerto 80. Si desea vincularse a algún puerto superior a 1024, entonces sí, puede hacerlo. De lo contrario, no se preocupe por la raíz. Ese es el proceso padre Apache y no atiende ninguna solicitud. Generará procesos secundarios y eliminará privilegios para manejar solicitudes.

Para cambiar el usuario de Apache, configure los parámetros Usery Groupen su configuración de Apache.

bahamat
fuente
Bueno, perdón por desviarme, pero noto que haproxy puede ejecutarse como haproxy (no como root) y enlazar el puerto tcp 80. ¿Cómo se logra esto? ¿Alguna iluminación?
kiiwii
1
No lo hace. Los procesos solo pueden vincularse a puertos inferiores a 1024 si tiene privilegios de superusuario. Entonces, haproxy está comenzando como root y eliminando privilegios (probablemente) o setuid root (poco probable).
bahamat
No necesita ejecutarlo como root, solo necesita permitir que su usuario 'apache' acceda a puertos restringidos (es decir, aquellos por debajo de 1024). Esta respuesta explica cómo se puede utilizar 'authbind' para hacer eso: superuser.com/questions/710253/...
Animal451
4

@bahamat lo explica bastante bien, pero agregaré un poco más de detalle.

En el curso de la operación normal, el proceso de apache propiedad de la raíz no realizará ninguna operación real que no sea escuchar en el puerto 80 y reenviar las conexiones entrantes a sus www-datahijos (sin privilegios, como el usuario).

La ubicación del archivo de configuración maestro depende de las opciones de tiempo de compilación y varía según la distribución, pero /etc/apache2/apache2.confes una buena suposición inicial.

Además, si está configurando un sistema de alojamiento web multiusuario, es posible que desee examinar SuExec y fcgid para que el proceso de apache de cada usuario de alojamiento web individual se ejecute como dicho usuario, de modo que si un usuario es negligente con su seguridad, otro Los usuarios no se verán afectados.

Shadur
fuente
3

Al menos en Ubuntu, la configuración para esto está en /etc/apache2/envvars. Ajústelos, luego reinicie apache y estará listo para funcionar.

mlissner
fuente
Gracias, esto me ayudó! Estoy configurando un cuadro de ubuntu vagabundo, y por alguna razón /etc/apache2/httpd.conf no se estaba utilizando para cargar el usuario y el grupo. ¡Envars parece hacer el truco!
Greg
2

Además, consulte Apache2 ITK MPM .

Bifurca un hilo de Apache con el uid/ asignado gid, esto le permite seguir usando mod_php. No más chmod/ chownetc.

Olli
fuente
Votación por la mpm_itkcual es una mejora significativa sobre suexec / fcgid
Shadur
0

Mac OS X:

Lo que funcionó para mí es ir al archivo de configuración de apache:

/etc/apache2/httpd.conf

En este archivo he buscado Usuario o Grupo

y tropecé con:

User _www
Group _www

Lo cambié a cualquier usuario / grupo que necesitaba (en mi caso, al usuario / grupo que es el propietario de los archivos de mi aplicación web que puede ver. Y esto puede verificarlo usando el simple 'ls -l' mando)

Mercurio
fuente