Resumen actualizado
El directorio / var / www es propiedad de lo root:root
que significa que nadie puede usarlo y es completamente inútil. Como todos queremos un servidor web que realmente funcione (y nadie debería iniciar sesión como "root"), entonces debemos solucionarlo.
Solo dos entidades necesitan acceso.
PHP / Perl / Ruby / Python necesitan acceso a las carpetas y archivos, ya que crean muchos de ellos (es decir
/uploads/
). Estos lenguajes de secuencias de comandos deberían ejecutarse bajo nginx o apache (o incluso alguna otra cosa como FastCGI para PHP).Los desarrolladores
¿Cómo obtienen acceso? Sé que alguien, en algún lugar, ha hecho esto antes. Sin embargo, con tantos miles de millones de sitios web por ahí, pensaría que habría más información sobre este tema.
Sé que 777 es un permiso completo de lectura / escritura / ejecución para el propietario / grupo / otro. Por lo tanto, esto no parece ser necesario, ya que otorga a los usuarios aleatorios permisos completos.
En qué permisos se deben usar /var/www
para que:
- Control de fuente como git o svn
- Usuarios en un grupo como "sitios web" ( o incluso agregados a "www-data" )
- Servidores como apache o lighthttpd
- Y PHP / Perl / Ruby
¿Pueden todos leer, crear y ejecutar archivos (y directorios) allí?
Si estoy en lo cierto, los scripts de Ruby y PHP no se "ejecutan" directamente, sino que se pasan a un intérprete. ¿Entonces no hay necesidad de ejecutar permisos en archivos en /var/www
...? Por lo tanto, parece que el permiso correcto sería el chmod -R 1660
que haría
- todos los archivos compartibles por estas cuatro entidades
- todos los archivos no son ejecutables por error
- bloquear a todos los demás del directorio por completo
- establecer el modo de permiso en "adhesivo" para todos los archivos futuros
¿Es esto correcto?
Actualización 1: Acabo de darme cuenta de que los archivos y directorios pueden necesitar diferentes permisos: estaba hablando de los archivos anteriores, así que no estoy seguro de cuáles deberían ser los permisos del directorio.
Actualización 2: la estructura de carpetas de los /var/www
cambios drásticamente, ya que una de las cuatro entidades anteriores siempre agrega (y a veces elimina) carpetas y subcarpetas de muchos niveles de profundidad. También crean y eliminan archivos a los que las otras 3 entidades pueden necesitar acceso de lectura / escritura. Por lo tanto, los permisos deben hacer las cuatro cosas anteriores para archivos y directorios. Dado que ninguno de ellos debería necesitar permiso de ejecución (ver pregunta sobre ruby / php arriba) supongo que ese rw-rw-r--
permiso sería todo lo que se necesita y completamente seguro ya que estas cuatro entidades son administradas por personal de confianza (ver # 2) y todos los demás usuarios en El sistema solo tiene acceso de lectura.
Actualización 3: Esto es para máquinas de desarrollo personal y servidores de empresas privadas. No hay "clientes web" aleatorios como un host compartido.
Actualización 4: Este artículo de slicehost parece ser el mejor para explicar lo que se necesita para configurar los permisos para su carpeta www. Sin embargo, no estoy seguro de qué usuario o grupo apache / nginx con PHP O svn / git se ejecutan y cómo cambiarlos.
Actualización 5: (creo) finalmente encontré una manera de hacer que todo funcione (respuesta a continuación). Sin embargo, no sé si esta es la forma correcta y SEGURA de hacerlo. Por lo tanto, he comenzado una recompensa. La persona que tiene el mejor método para asegurar y administrar el directorio www gana.
fuente
No estoy seguro de si es "correcto", pero esto es lo que hago en mi servidor:
Tenga en cuenta que debe tener habilitado el bit de ejecución en los directorios para poder enumerar los contenidos.
fuente
Después de investigar más, parece que git / svn TOOLS NO es un problema ya que se ejecutan como cualquier usuario que los esté usando. (Sin embargo, ¡los demonios git / svn son una cuestión diferente!) Todo lo que creé / cloné con git tenía mis permisos y la herramienta git se enumeró en
/usr/bin
la tesis.Permisos de Git resueltos.
Los permisos de usuario parecen resolverse agregando todos los usuarios que necesitan acceso al directorio www al
www-data
grupo en el que apache (y nginx) se ejecutan.Entonces parece que una respuesta a esta pregunta es así:
Por defecto
/var/www
es propiedad deroot:root
y nadie puede agregar o cambiar archivos allí.1) Cambiar propietario del grupo
Primero necesitamos cambiar el grupo de directorio www para que sea propiedad de "www-data" en lugar del grupo "root"
2) Agregar usuarios a www-data
Luego necesitamos agregar el usuario actual (y cualquier otra persona) al grupo www-data
3) directorio www CHMOD
Cambie los permisos para que SOLO el propietario (root) y todos los usuarios del grupo "www-data" puedan rwx (leer / escribir / ejecutar) archivos y directorios ( nadie más debería poder acceder a ellos ).
Ahora todos los archivos y directorios creados por cualquier usuario que tenga acceso (es decir, en el grupo "www-data") serán legibles / grabables por apache y, por lo tanto, por php.
¿Es esto correcto? ¿Qué pasa con los archivos que PHP / Ruby crea? ¿Pueden los usuarios de www-data acceder a ellos?
fuente
La adherencia no es herencia de permisos. La permanencia en un directorio significa que solo el propietario de un archivo, o el propietario del directorio, puede cambiar el nombre o eliminar ese archivo en el directorio, a pesar de que los permisos indiquen lo contrario. Así, 1777 en / tmp /.
En Unix clásico, no hay herencia de permisos basada en el sistema de archivos, solo en el umask del proceso actual. En * BSD, o Linux con setgid en el directorio, el campo de grupo de los archivos recién creados se establecerá de la misma manera que el directorio principal. Para algo más, debe buscar en las ACL, con la ACL 'predeterminada' en los directorios, que le permiten tener permisos heredados.
Debe comenzar definiendo: * qué usuarios tienen acceso al sistema * cuál es su modelo de amenaza
Por ejemplo, si está realizando alojamiento web con varios clientes y no desea que vean los archivos de los demás, entonces puede usar un grupo de "webcusts" para todos esos usuarios y un modo de directorio de 0705. Luego, los archivos servidos por el proceso del servidor web ( no en "webcusts") verá los Otros permisos y se permitirá; los clientes no pueden ver los archivos de los demás y los usuarios pueden meterse con sus propios archivos. Sin embargo, esto no significa que en el momento que permita CGI o PHP que tiene que asegurarse de que los procesos se ejecutan como el usuario específico (buenas prácticas de todos modos, para-varios usuarios-a-uno-anfitrión, para la rendición de cuentas). De lo contrario, los clientes podrían meterse con los archivos de los demás haciendo que un CGI lo haga.
Sin embargo, si el usuario en tiempo de ejecución de un sitio web es el mismo que el propietario del sitio web, entonces tiene problemas para no poder proteger el contenido de los abusadores en el caso de un agujero de seguridad en el script. Aquí es donde ganan los hosts dedicados, para que pueda tener un usuario en tiempo de ejecución distinto del propietario del contenido estático y no tener que preocuparse tanto por la interacción con otros usuarios.
fuente
rename()
,unlink()
), solo para acciones en el archivo en sí (open()
). Este es el comportamiento "habitual".Creo que la mejor manera de hacerlo es utilizando las ACL de Posix. Son cómodos para trabajar y ofrecen toda la funcionalidad que necesita.
http://en.wikipedia.org/wiki/Access_control_list#Filesystem_ACLs
fuente
El propietario del archivo debe ser la persona que lo crea, mientras que el grupo debe ser www-data. El modo para directorios / archivos es en general 755/644. Mientras que para directorios y archivos el grupo necesita acceso de escritura, el mod es 775/664. Supongamos que Paddy es el desarrollador. En total esto hace:
fuente
Agregando a la respuesta de @ Xeoncross, creo que sería bueno configurar los permisos en archivos y directorios por separado.
Esto permitirá a los desarrolladores crear y modificar directorios dentro de / var / www. Lo que parece importante porque los desarrolladores pueden necesitar crear directorios adicionales o eliminar un directorio que ya no es necesario.
También permitirá a los desarrolladores crear y modificar archivos de código (leer archivos HTML, PHP y similares). Pero, solo permitirá el acceso de solo lectura para todos los demás.
fuente