Aplicación web Chmod para PHP

Estoy escribiendo una aplicación web. Es tener:

  • index.php
  • / app – por supuesto, con .htaccess, pero no estoy hablando de eso
  • / app / session – para sesiones, session_save_path (/ app / session) debe usarse en mi servidor
  • / app / include – index.php incluye archivos de este directorio
  • / app / config: solo los archivos .xml, que los archivos leen las clases desde los scripts incluidos
  • / images, / styles etc.

Mi pregunta es:
¿Cuál es la configuración correcta de chmod para los directorios anteriores? Sé lo que es chmod (estoy trabajando en Linux) y sé cómo puedo cambiarlo, pero no puedo encontrar información útil sobre eso. Solo artículos como “Cómo puedo cambiar chmod a 777 …

Y no sé quién es dueño, grupo y otros. Mi página estará en el servidor web compartido, por lo que creo que el propietario es apache, y el grupo es www-data, ¿correcto?

Por favor, dime qué chmod debe tener directorios (y archivos? Estoy usando -R para chmod a archivos) para un sitio web seguro. Principalmente se trata de la posibilidad de intrusión por cualquier script.

WordPress tiene un buen artículo que explica los permisos de archivos de Unix. Léelo y comprenderás lo básico. En resumen (y no teóricamente correcto):

Los sistemas Unix designan 3 ‘roles’ diferentes: el usuario, el grupo y el mundo. Especialmente ‘el mundo’ parece confundir a la gente.

Cada archivo y directorio (que son ambos nodos y, por tanto, no tan diferentes en los sistemas Linux) se asigna a un usuario y un grupo. Puede ver al usuario y al grupo como ‘propietarios’ del archivo / directorio específico (hablaré más adelante sobre ‘nodos’, porque realmente no importa). Los permisos de archivo definen quién puede hacer qué con los nodos. Ejemplo dado:

El archivo index.php se asigna al usuario ‘aso’ y al grupo ‘www-data’ y tiene el permiso de archivo modus 644. Esto significa que el usuario (6) tiene permisos de lectura y escritura, el grupo simplemente ha leído los permisos (4), como es ‘el mundo’ (los últimos 4 de los tres dígitos).

Ahora primero debes entender que CADA usuario en un sistema * nix es parte de un grupo. El nombre del grupo a veces es el mismo que el nombre de usuario, pero UN GRUPO ES OTRA ENTIDAD. Por lo tanto, es posible que tenga un usuario y un grupo llamado ‘aso’.

Las permutaciones de archivos se crean a partir de una ‘máscara de bits’ de la siguiente manera: los permisos de lectura se designan mediante el dígito 4, se escribe por 2 y se ejecuta por 1. Se puede hacer cualquier combinación a partir de esto. En el ejemplo, los permisos de escritura y ejecución se designan con 3 (escritura = 2, ejecución = 1), y los permisos de lectura y ejecución se designan con 5 (lectura = 4, ejecución = 1).

Veamos qué significa esto, y debo ser tan justo como decir que no puedo ser completo en este asunto. Utilice Google si desea una historia completa.

Si creo un archivo en mi sistema * nix, me lo asignan automáticamente (mi usuario) y el grupo del que forma parte mi usuario. Tener los permisos 644 significa que yo (conectado con mi propio usuario) puedo leer el archivo y puedo modificarlo (escribirlo). Pero no tengo los permisos de ejecución (x). Sin embargo, no importa porque esto solo se aplica a los scripts ejecutables (scripts de shell, la mayoría de las veces con una extensión .sh). El grupo al que pertenece el archivo (‘www-data’) solo tiene permisos de lectura, por lo que no puede alterar el archivo. El ‘mundo’ también solo tiene permisos de lectura.

Tenga en cuenta que un usuario puede ser parte de múltiples grupos y, como tal, los permisos de archivos * nix tienen un scope limitado: es posible que desee asignar permisos de escritura al grupo 1 y solo leer permisos al grupo 2. En los sistemas de archivos tradicionales esto no es posible. Sin embargo, los sistemas de archivos como reiserFS y Ext3 pueden usar una ACL extendida para lograr cosas como esa. Esa es otra historia sin embargo.

¿Qué significa todo esto? En realidad, es más fácil de lo que se espera, siempre que comprenda qué significan los derechos asignados y cuál es la diferencia entre un nodo de archivo y un nodo de directorio.

Archivos

  • Leer: Capacidad de leer sus contenidos
  • Escribir: Posibilidad de alterar (escribir Y borrar) sus contenidos
  • Ejecutar: Posibilidad de ejecutar el archivo (ejecutar un script, con todas las consecuencias posibles)

Directorios

  • Leer: Capacidad de leer su contenido. Lo que significa: enumerar los nombres de nodo, pero NO un contenido de nodo, tipo, etc.
  • Escribir: Posibilidad de agregar / eliminar archivos
  • Ejecutar: Posibilidad de mostrar su contenido, incluido el tipo, la última fecha de modificación, etc.

De vuelta a tu caso. Si tiene una configuración normal (un servidor Linux que ejecuta Apache y PHP como módulo), sus archivos se asignarán a su usuario ftp y al grupo ‘www-data’ (el grupo Apache se está ejecutando). Usted mismo necesita permisos de lectura y escritura (como a veces desea cambiar un archivo), pero NO NECESITA ejecutar permisos (ya que PHP – o HTML para el caso – no son ejecutables). Entonces, para el usuario, necesitaría un 6 (lectura = 4, escritura = 2, marcas combinadas 6). Para el usuario del grupo solo necesita permisos de lectura, ya que Apache (o el módulo PHP) solo necesita leer el contenido de su script php. Cualquier otro usuario en el sistema no tiene nada que ver con sus archivos y, como tal, no necesita permisos como todos (0).

Entonces, para TODOS sus scripts, los permisos de 640 (leer y escribir para el usuario, leer para el grupo y ninguno para ‘el mundo’) son suficientes.

Para los directorios, su usuario necesita todos los permisos (lectura = 4, escritura = 2, ejecución = 1, 7 en total). ¿Por qué? Debido a que necesita leer sus contenidos (nombres de nodo), tiene que poder determinar si es un nodo de archivo o directorio (y otras propiedades) Y debe poder agregar y eliminar archivos (si desea agregar archivos algunas veces, no lo haga) t usted?). Entonces daremos a su usuario un 7.

Sin embargo, el grupo (‘www-data’, el grupo del que se está ejecutando Apache) solo necesita permisos de lectura y ejecución. Los permisos de lectura para listar los contenidos (nombres de nodo) y los permisos de ejecución para listar otras propiedades (tipo de nodo, tiempo de modificación, etc.). Sin embargo, no necesita permisos de escritura, porque normalmente no desea que PHP (Apache) agregue / elimine archivos de su árbol de aplicaciones.

Por último, el “mundo”, que es cualquier otro usuario en el sistema (que NO es lo mismo que el mundo en su sentido más amplio) no necesita ningún permiso. ¿Por qué alguien más en el servidor necesitaría acceder a sus archivos?

Combinado que haría 750 (todos los permisos para el usuario, leer y ejecutar para el grupo, ninguno para los demás).


Respuesta resumida a su pregunta, el mínimo es:

  • Permisos de archivos: 640
  • Permisos de directorio: 750

Pero siempre es bueno, bastante estándar y lo suficientemente seguro:

  • Permisos de archivos: 644
  • Permisos de directorio: 755

Yo uso 640 en mi servidor. Los archivos son propiedad de mí, así que necesito leer y escribir. El grupo es www-data para que apache pueda leer. Los scripts PHP no necesitan ejecutarse para ejecutarse (si se usa el módulo apache php, que es el predeterminado. Creo que se debe ejecutar al usar cgi), solo leer. Nadie más necesita acceso. Tengo una carpeta de carga que le da a Apache la escritura, pero solo esa carpeta y, por lo general, denego el acceso con .htaccess, inhabilito php para evitar la carga de scripts o lo coloco fuera de la raíz web; dependiendo de las necesidades del proyecto.