Permisos del sistema de archivos de recorrido y predeterminado del directorio (755) para el servidor web

1

Estoy tratando de comprender mejor los posibles agujeros de seguridad que pueden estar creando mis permisos predeterminados del sistema de archivos. Parece que soy capaz de atravesar mi sistema de archivos, sirviendo páginas php simples que muestran información de archivos fuera de mi / var / www Web Root:

echo file_exists('../../../bin/filename');

No sé si esta capacidad es normal si los permisos de mi raíz web están configurados correctamente. Tengo los permisos de / var / www como 750, donde owner: group = root: www-data.

Dado que los directorios principales de mi Raíz web, / y / var, tienen owner: group = root: root, sus permisos deben ser 755 porque los directorios secundarios no podrán tener más permisos que sus padres, y los datos de www el usuario con el que se está ejecutando Apache caerá en la categoría de "otro" usuario de sus padres. Por lo tanto, parece que la capacidad de atravesar fuera de la raíz web podría ser normal.

Suponiendo que este comportamiento es normal, ¿es una buena práctica establecer directorios que no sean padres de mi raíz web, como / bin, / sbin, etc., con permisos de 750, por lo que www-data en este caso no puede llegar a ellos?

    
pregunta Kevin 22.02.2014 - 20:23
fuente

2 respuestas

1

En términos de restringir lo que puede hacer un servidor web, normalmente concedo acceso al contenido por parte del servidor web a través de la entidad "otro" (rw-rw-r-- / drwxrwsr-x), esto me permite configurar un grupo (en algunos casos, grupos múltiples) de personas que pueden mantener (escribir) los archivos. En una máquina simple, también significa que puedo eliminar los permisos de ejecución y lectura en otro lugar con un impacto mínimo. Pero el uso de chroot (o contenedores) es una solución más efectiva cuando corresponde.

Su código de ejemplo parece estar utilizando PHP: deshabilitar allow_url_include y la configuración de open_basedir son los primeros pasos esenciales para fortalecer un servidor (hay muchos más, pero esto no es un tema). La configuración de open_basedir evita casi todos los mecanismos de cruce de directorios. Pero lo realmente importante es no procesar las rutas suministradas desde la web a menos que no pueda evitar el problema, e incluso luego validar los datos con una lista blanca y realpath ().

    
respondido por el symcbean 23.02.2014 - 01:46
fuente
0

Para acceder a un archivo o directorio, debe tener execute acceso a su directorio principal (y, por lo tanto, a todos los padres que se encuentran arriba).

Por lo tanto, si puedo acceder a '/ var / www / html', implícitamente también puedo acceder a /var/www/ y /var y / . Sin embargo, eso no significa que pueda hacer mucho con él, ya que mi permiso para cualquier otro subárbol está determinado por el permiso en ese directorio.

Entonces, aunque puedo llegar a /var/www/html , eso no significa que pueda llegar a /var/www/docs , depende de los permisos de docs .

Ahora, aquí está el detalle importante para los permisos de archivos, y una vez que lo entiendas, puedes crear un conjunto de permisos razonables:

Para archivos

  • leer : significa que tiene acceso para abrir el archivo de solo lectura y acceder a su contenido
  • escribir : significa que tiene acceso para abrir un archivo existente de lectura-escritura y modificar o eliminar su contenido. No significa que pueda eliminar la entrada de archivo , pero puede truncar el archivo para vaciarlo o cambiarlo para que diga otra cosa.
  • ejecutar : significa que tienes permiso para ejecutar el archivo. Es posible que no vea su contenido porque el sistema operativo leerá el archivo en su nombre y lo ejecutará por usted.

Para directorios

  • leer : significa que tiene acceso a lista los archivos en un directorio. Es posible que no tenga acceso para hacer nada con ellos, pero al menos puede ver sus nombres, tamaños, permisos, etc.
  • escribir : significa que tiene acceso a cambiar la lista de archivos en un directorio. Es decir, puede crear archivos, eliminarlos, cambiarles el nombre, etc. Es posible que no pueda abrir (leer o escribir) ningún archivo existente, pero puede modificar la lista.
  • ejecutar : significa que puede acceder a los archivos o directorios en lugar del directorio siempre que sepa el nombre y tenga los permisos adecuados en el archivo secundario o dir. Puede usar el directorio, pero no tiene permiso para modificar o ver la lista de archivos.

Para acceder a un directorio secundario dado, todo lo que necesita es el bit de ejecución. Así, por ejemplo, en /home/ , no es raro ver los permisos establecidos en rwx--x--x y propiedad de root , con los directorios de usuarios establecidos en rwx------ y propiedad del usuario. Esto le da a cada usuario acceso a su propio directorio, pero él no puede acceder o incluso listar los otros directorios bajo /home .

Incluso mejor

Un sistema aún mejor, que todavía está en desarrollo pero es lo suficientemente estable para los primeros usuarios, es usar Linux cgroups para dar a cada usuario o sitio o programa su propio sistema de archivos en su totalidad. Esto se hace usando una combinación de chroot y mount --bind y, a menudo, sindicalizando sistemas de archivos (como unionfs o aufs) para dar a cada proceso acceso solo a los archivos que necesita, sin duplicación innecesaria.

Además, cgroups permite que los procesos individuales vivan en redes aisladas con dominios aislados de memoria y socket y recursos similares. Esto crea el potencial de lo que parece y actúa como una máquina virtual, pero sin la máquina virtual. Esta tecnología sigue avanzando, pero está bastante claro que este será el camino a seguir para el aislamiento de procesos en Linux.

Los proyectos relevantes que utilizan esta tecnología incluyen LXC y Docker , ofrece una forma muy fácil de configurar contenedores aislados que incluyen todo su" mundo "desde una perspectiva de ejecución (como una VM), pero sin agregar una sobrecarga de virtualización .

    
respondido por el tylerl 22.02.2014 - 22:23
fuente

Lea otras preguntas en las etiquetas