Simplemente hice girar un cuadro de Ubuntu 11.10 y luego corrí apt-get install apache2 php5
para 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:
- ¿Con quién debería estar corriendo Apache?
- ¿En qué grupo (s) debería estar este usuario?
- ¿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?
- ¿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 -al
lista de los contenidos, veo /var
:
drwxr-xr-x 13 root root 4096 2012-02-04 20:47 var/
Si cd
entro var
y ls -al
veo:
drwxr-xr-x 2 root root 4096 2012-02-04 20:47 www/
Finalmente, adentro /var/www
veo:
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.php
con 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/envvars
archivo:
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/apache
script cuando se inició el sistema, y los otros se www-data
generaron desde el primero. ¿Es eso correcto?
Luego, si escribo, groups www-data
entonces veo www-data : www-data
, por lo que parece que solo está en el www-data
grupo. 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-data
y quiero que apache pueda leer un directorio, el x
bit 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+r
bit 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, suphp
y phpsuexec
que 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 chown
para hacer que el grupo del directorio de wordpress pertenezca www-data
y 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
- ¿Con quién debería estar corriendo Apache?
- ¿En qué grupo (s) debería estar este usuario?
- ¿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?
- ¿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?
Respuestas:
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.
fuente
Esto no es cierto, no tiene que configurar
rwx
para 'otro'. Debe cambiar el propietario y / o grupo de la carpeta / archivo en particular que está tratando de proteger. P.ej:Ahora solo los miembros del grupo
www-data
pueden 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.
fuente