¿Con qué usuario deberían ejecutarse apache y PHP? ¿Qué permisos deben tener los archivos / var / www?

41

Simplemente hice girar un cuadro de Ubuntu 11.10 y luego corrí apt-get install apache2 php5para instalar apache2 y PHP 5 en el cuadro. Ahora funciona como un "servidor web" y carga "Funciona". página. Ahora estoy tratando de reforzar la seguridad y tengo las siguientes preguntas sobre los servidores web de Linux:

  1. ¿Con quién debería estar corriendo Apache?
  2. ¿En qué grupo (s) debería estar este usuario?
  3. ¿Qué paquete (s) puede hacer que PHP (y Apache?) Se ejecute como el propietario de los archivos? (como en los servidores web compartidos) ¿Debo usar estos paquetes? ¿Son fáciles / factibles de mantener en un sistema pequeño?
  4. ¿Cuáles deberían ser los permisos predeterminados para los archivos y carpetas que se sirven en la web con Apache ejecutándose como www-data? ¿Para apache / php ejecutándose como el usuario?

He hecho lo siguiente al examinar la configuración predeterminada:

Estructura de archivo

Cuando cd /y hago una ls -allista de los contenidos, veo /var:

drwxr-xr-x 13 root root  4096 2012-02-04 20:47 var/

Si cdentro vary ls -alveo:

drwxr-xr-x  2 root root  4096 2012-02-04 20:47 www/

Finalmente, adentro /var/wwwveo:

drwxr-xr-x  2 root root 4096 2012-02-04 20:47 ./
drwxr-xr-x 13 root root 4096 2012-02-04 20:47 ../
-rw-r--r--  1 root root  177 2012-02-04 20:47 index.html

Mi conclusión clave es que hasta ahora todos estos archivos pertenecen root:root, los archivos tienen permisos de 644 y los directorios tienen permisos de 755.

Permisos de Apache

Si creo un archivo como root /var/www/test.phpcon los contenidos:

<?php echo shell_exec('whoami');

y cargar ese archivo en un navegador que me dice www-data, que es lo mismo que en el /etc/apache2/envvarsarchivo:

export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data

Si lo hago ps aux | grep -i apache, veo lo siguiente:

root      1916  1.2 104664  7488 Ss   20:47 /usr/sbin/apache2 -k start
www-data  1920  0.8 105144  5436 S    20:47 /usr/sbin/apache2 -k start
www-data  1921  1.0 105144  6312 S    20:47 /usr/sbin/apache2 -k start
www-data  1922  0.7 104688  4624 S    20:47 /usr/sbin/apache2 -k start
www-data  1923  0.7 104688  4624 S    20:47 /usr/sbin/apache2 -k start
www-data  1924  0.7 104688  4624 S    20:47 /usr/sbin/apache2 -k start
www-data  1925  0.7 104688  4624 S    20:47 /usr/sbin/apache2 -k start

Entonces, ¿quién está ejecutando Apache? Parece que tal vez el primer proceso es root, tal vez desde el /etc/init.d/apachescript cuando se inició el sistema, y ​​los otros se www-datageneraron desde el primero. ¿Es eso correcto?

Luego, si escribo, groups www-dataentonces veo www-data : www-data, por lo que parece que solo está en el www-datagrupo. Supongo que esto también es una práctica estándar.

Hosting Compartido y Seguridad

Entonces, si entiendo las cosas correctamente, si apache se ejecuta como www-datay quiero que apache pueda leer un directorio, el xbit debe establecerse para el grupo world (other) ( o+x), y eso también debe establecerse en todos los padres directorios hasta el final de la cadena ( www, var). Y si quiero que Apache pueda leer un archivo, entonces el o+rbit necesita ser configurado.

Desafortunadamente, creo que esto introduce un agujero de seguridad para múltiples aplicaciones y / o múltiples usuarios en la misma caja de Linux: todos los archivos web deben ser legibles en todo el mundo, por lo que también son accesibles para otras aplicaciones y otros usuarios en el sistema. Si una aplicación instalada en el sistema tenía una vulnerabilidad de seguridad que permitía una entrada de usuario sin validar, que luego fue ejecutada por PHP, un atacante remoto podría examinar todos los demás archivos del sistema web que eran legibles en todo el mundo. Del mismo modo, si la caja tenía múltiples usuarios, y un usuario conocía la ruta de los archivos web de otro usuario, él / ella podría leer el contenido del archivo (y ver cosas sensibles como cadenas de conexión de base de datos, etc.).

He oído hablar de dos paquetes, suphpy phpsuexecque tratan de permitir que los archivos de los usuarios se distribuyan "como ellos" en un sistema compartido. Una de las ventajas de esto es que permite que las aplicaciones web (como Wordpress) creen y modifiquen archivos, muy útil para agregar temas, complementos y actualizar software. Por supuesto, probablemente sea más seguro hacer estas cosas manualmente, pero ¿se puede llegar a un compromiso quizás con uno de los paquetes mencionados anteriormente? ¿O posiblemente usando chownpara hacer que el grupo del directorio de wordpress pertenezca www-datay establezca el bit fijo en el grupo ( g+s)?

Solo los he usado como usuario final de una empresa de alojamiento web, por lo que no conozco los entresijos de ellos, y si es razonable instalarlos en un sistema pequeño, o si hay algún otro En su lugar, debería usar medidas de seguridad, pero pensé en mencionarlas aquí, ya que parecen ser una forma posible de abordar algunas de mis preocupaciones.

Regresar a las preguntas

  1. ¿Con quién debería estar corriendo Apache?
  2. ¿En qué grupo (s) debería estar este usuario?
  3. ¿Qué paquete (s) puede hacer que PHP (y Apache?) Se ejecute como el propietario de los archivos? (como en los servidores web compartidos) ¿Debo usar estos paquetes? ¿Son fáciles / factibles de mantener en un sistema pequeño?
  4. ¿Cuáles deberían ser los permisos predeterminados para los archivos y carpetas que se sirven en la web con Apache ejecutándose como www-data? ¿Para apache / php ejecutándose como el usuario?
cwd
fuente
Posible duplicado de serverfault.com/questions/339948/…
AD7six

Respuestas:

17
  1. no root
  2. no root
  3. SuEXEC
  4. Depende 644 para archivos y 755 para carpetas son valores predeterminados seguros.

No cambie la propiedad de nada a www-data a menos que desee que php pueda editar el contenido de ese archivo / carpeta

Independientemente de cualquier otra cosa que haga: las carpetas necesitan permisos de lectura y ejecución para que el usuario encuentre archivos; los archivos necesitan permisos de lectura para que el usuario los lea. Si obtiene errores de permisos al cambiar las cosas, ha logrado eliminar estos permisos fundamentalmente necesarios.

Si no está escribiendo ningún archivo a través de su aplicación php, puede dejar los archivos que le pertenecen: usted. En esta circunstancia, el permiso mundial (xx4 / 5) es el que se aplica.

Si deja los archivos como propiedad suya: usted con permisos de archivo de 644 (archivos) lo que eso significaría es que solo usted puede editar los archivos del sitio web, www-data no es usted, por lo que no puede editar los archivos.

Si desea restringir el acceso a apache + you y bloquear todos los demás accesos chown -R you:www-data *. Con permisos de archivo de 640 y permisos de carpeta de 750 que puede editar, www-data puede leer, porque entonces apache lee el permiso de grupo (x4 / 5x).

Restrinja al mínimo las rutas en las que permite que apache / php escriba, si hay un directorio tmp en el que la aplicación necesita escribir, permita que escriba solo en esa carpeta , y para cualquier ubicación de escritura si es posible, asegúrese de que esté fuera del documentar la raíz o tomar medidas para garantizar que esta ruta de escritura no sea accesible desde la web.

Tenga en cuenta que "usted" no debe ser root. Permitir el acceso ssh directo como root es un indicador de otros fallos de seguridad (como no rechazar el inicio de sesión con contraseña), pero eso es un montón de preguntas en sí mismo.

AD7six
fuente
10

Entonces, si entiendo las cosas correctamente, si apache se está ejecutando como www-data y quiero que apache pueda leer un directorio, el bit x debe establecerse para el grupo del mundo (otro) (o + x), y eso también debe establecerse en todos los directorios principales en toda la cadena (www, var). Y si quiero que Apache pueda leer desde un archivo, entonces el bit o + r necesita ser configurado.

Esto no es cierto, no tiene que configurar rwxpara 'otro'. Debe cambiar el propietario y / o grupo de la carpeta / archivo en particular que está tratando de proteger. P.ej:

chown -R cwd:www-data /var/www/cwd.com
chmod 750 /var/www/cwd.com

Ahora solo los miembros del grupo www-datapueden leer /var/www/cwd.com. Y solo usted (cwd) puede escribirle. Si desea permitir que sus aplicaciones (a través de Apache) escriban / modifiquen archivos en ese directorio también, modifíquelo en 770.

Creo que esto cubre todos sus problemas, no veo ninguna razón para cambiar el usuario con el que se ejecuta Apache.

Rob Wouters
fuente
2
Gracias. No es una mala solución, pero si un usuario conoce la ruta al archivo de otro usuario, podría escribir un script que leería el contenido del archivo y luego cargarlo en el navegador web, que lo ejecutaría como apache, lectura efectiva el archivo del directorio del otro usuario. ¿Tiene sentido? Entonces, incluso si configura los permisos de la carpeta en 750, todavía existe una posible vulnerabilidad de seguridad.
cwd
@cwd ¿Terminaste resolviendo esto?
Ricky Boyce
@cwd Esta fue la pregunta exacta que tenía. Es por eso que pregunté esto: serverfault.com/questions/807723/…
Nandakumar Edamana