¿Cuáles son los permisos de directorio recomendados?

145

Me estoy preparando para implementar un sitio de Drupal 7 y no puedo encontrar ninguna documentación sobre lo que los permisos de directorio y archivo de seguridad recomendados deberían estar configurados.

Específicamente default/files/(¿también subdirectorios?) settings.php, .htaccessY cualquier otra cosa que debería tener en cuenta.

ack
fuente
1
También hay una respuesta aquí: drupal.stackexchange.com/questions/52695/…
Radical libre del
Hay un blog que explica esto maravillosamente y cubre todos los aspectos de manera abstracta. technologymythbuster.blogspot.com/2018/06/…
Kalpesh Popat

Respuestas:

69

Su servidor web debería poder leer todos los archivos pero no escribirles. Si su sitio implica cargar archivos, dé permiso al servidor para escribir solo en esa carpeta.

En los documentos de Drupal hay más información sobre cómo configurarlo, así como algunas cosas que pueden suceder si no lo hace .

Paul Jones
fuente
13
Esto no es cierto para el directorio de sitios / default / files, que debe ser editable por el servidor web o tendrá muchos problemas.
rooby
3
@rooby La segunda oración aclara eso.
kenorb
14
Aunque dice "Si su sitio implica cargar archivos", esa no es la única razón por la que podría necesitar acceso de escritura al directorio de archivos. Un ejemplo muy común es la agregación js / css, que son usuarios no relacionados que cargan archivos. Otros módulos también pueden esperar que ese directorio sea grabable.
rooby
91

Esa página drupal como tantas es muy larga y confusa. Pero contiene esta publicación de Jason, quien dio en el clavo:

Publicado por Jason Sale el 1 de noviembre de 2010 a las 12:40 p.m.

Gracias por escribir esto y todo, pero todo lo que yo y el 99% de las personas que leen esta página realmente queremos es una lista de números junto a una lista de carpetas.

  • /default en 755
  • /default/files incluyendo todas las subcarpetas y archivos en 744 (o 755)
  • /default/themes incluyendo todas las subcarpetas y archivos en 755
  • /default/modules incluyendo todas las subcarpetas y archivos en 755
  • /default/settings.phpy /default/default.settings.phpen 444
ErichBSchulz
fuente
77
El tema es largo y confuso. La página se ajusta a la realidad de la situación.
greggles
17
... de los documentos de Drupal! ¡Y es por eso que debe cambiarse a algo simple y entendible de inmediato! Especialmente cuando se trata de seguridad. ¡SOLO PORQUE se trata de seguridad! Porque nos pertenece a todos. Un servidor infectado no es solo un problema del usuario inexperto de Drupal. Es un problema de todos nosotros entonces. Por lo tanto, no es muy útil mantener documentos complejos y mal escritos inspirados en el narcisismo de los desarrolladores para mostrar la complejidad y la complejidad y lo bien que ellos mismos pueden manejarlo. No veo el punto de dejar de lado un simple gráfico de árbol de permisos de archivos. grados de webchick en eso.
nilsun
3
¿Por qué tener 755 en / default / files? ¿No debería ser siempre 744 en caso de que alguien logre cargar algo malicioso pirateando el front-end (o mediante una configuración deficiente)? ¿Hay alguna razón para tener 755? ¿Qué pasa con / tmp?
Webdrips
1
El archivo settings.php debería ser 440. "Otros" no debería poder ver settings.php. 740 si quieres poder escribirle sin comandos sudo.
Bryden
¿Es curioso por qué el archivo .htaccess en los archivos y la carpeta tmp deben ser escritos por el servidor web? ¿No es seguro marcarlo 444 solo como settings.php. La razón por la que pregunto es si junkfile.php puede ser cargado por un hacker a la carpeta de archivos a través del servidor web, entonces el archivo .htaccess podría ser reemplazado. estoy en lo cierto?
kiranking
82

Mi práctica en torno a la creación de un nuevo sitio Drupal en un servidor es tener un usuario que forme parte del grupo del servidor web (generalmente Apache), y que ese usuario sea el propietario de todos los archivos de Drupal. En Ubuntu, estos son los comandos para configurarlo:

# Create a new example user, setting up /var/www/example as their home dir.
useradd -s /bin/bash -d /var/www/example -m example

# Now add that user to the Apache group. On Ubuntu/Debian this group is usually
# called www-data, on CentOS it's usually apache.
usermod -a -G www-data example

# Set up a password for this user.
passwd example

Una vez que tenga eso configurado, iniciaré sesión como ese usuario e instalaré Drupal en / var / www / example / docroot o similar, y luego crearé el directorio de archivos a mano y copiaré el archivo settings.php. Dado que iniciamos sesión como nuestro usuario de ejemplo antes de copiar en Drupal, la propiedad y los permisos de nuestros archivos deben configurarse automáticamente en todos los archivos y scripts centrales de Drupal (incluidos los archivos .htaccess).

su - example
cd docroot
cp sites/default/default.settings.php sites/default/settings.php

# Temporarily give the web server write permissions to settings.php
chgrp www-data sites/default/settings.php
chmod g+w sites/default/settings.php

Ahora configuremos el directorio de archivos.

# Create the directory.
mkdir sites/default/files

# Now set the group to the Apache group. -R means recursive, and -v means 
# verbose mode.
chgrp -Rv www-data sites/default/files

A continuación, configuraremos permisos para que el servidor web siempre pueda escribir en cualquier archivo que se encuentre en este directorio. Hacemos esto usando 2775 en nuestro comando chmod. El 2 significa que la identificación del grupo se conservará para cualquier archivo nuevo creado en este directorio. Lo que eso significa es que www - data siempre será el grupo en cualquier archivo, asegurando así que el servidor web y el usuario siempre tendrán permisos de escritura para cualquier archivo nuevo que se coloque en este directorio. Los primeros 7 significan que el propietario (ejemplo) puede R (Leer) W (Escribir) y X (Ejecutar) cualquier archivo aquí. El segundo 7 significa que el grupo (www-data) también puede RW y X cualquier archivo en este directorio. Finalmente, el 5 significa que otros usuarios pueden archivos R y X, pero no escribir.

 chmod 2775 sites/default/files

Si hay archivos existentes en este directorio, asegúrese de que el servidor web tenga permisos de escritura.

 chmod g+w -R sites/default/files

Ahora Drupal está listo para ser instalado. Cuando termine, es MUY importante volver a settings.php y asegurarse de que todos los usuarios solo tengan permisos de lectura.

 chmod 444 sites/default/settings.php

¡Eso es! Esta configuración garantiza que evite cualquier situación en la que el usuario propietario del directorio o el servidor web no pueda escribir / cambiar / eliminar archivos en el directorio de archivos.

q0rban
fuente
¿no es seguro establecer .htacess en 444 jsut como settings.php? de todos modos, ese archivo rara vez se actualiza en drupal core.
kiranking
Puede configurar .htaccess en 444, pero agregará dolor de cabeza adicional al actualizar Drupal core y no hará que su sitio sea más seguro.
q0rban
30

El servidor web debe poder escribir la carpeta de archivos de Drupal. La forma más segura de hacerlo es cambiar el grupo y hacer que el grupo se pueda escribir, así:

chgrp www-data sites/default/files
chmod g+w sites/default/files

Dejando a un lado la carpeta de carga de archivos, la más segura es chmod 644 para todos los archivos, 755 para directorios.

Esto podría lograrse así (cuando se ejecuta en la carpeta del sitio Drupal, .es para la ruta actual):

find . -type f | xargs chmod 644
find . -type d | xargs chmod 755

Recuerde que deberá configurar chmod g+wnuevamente después de ejecutar el comando anterior, ya que estos restablecerán el chmod en todos los archivos y carpetas.

mikl
fuente
2
Esta respuesta asume: estás en ubuntu. Su sitio es el único que se ejecuta en ese servidor. También solo resuelve el problema una vez en lugar de hacerlo realidad automáticamente (por ejemplo, cambiando la máscara de usuario).
greggles
No necesariamente Ubuntu, y sigue siendo una medida útil, incluso si hay varios sitios ejecutándose en el mismo servidor. Cambiar la umask (que con suerte ya debería tener esta configuración) no es algo que recomendaría a las personas que no conocen bien Linux. Sé que esto no es seguridad perfecta, pero no dejemos que lo perfecto sea el enemigo del bien aquí.
mikl
En un sitio múltiple corro chgrp -R www-data sites/*/filesy chmod -R g+w sites/*/filesme deshago de los errores de la página de estado.
leymannx
20

Cualquier consejo para "chmod blah" o "chown X" no tiene sentido sin saber: cuál es el grupo de usuario predeterminado: en los archivos y qué usuario y grupos ejecuta su servidor web.

Los documentos de Drupal con los que otros se han vinculado son bastante buenos en el tema, pero otro recurso es el Módulo de revisión de seguridad que ayuda a garantizar que tenga todo configurado correctamente.

greggles
fuente
9

Contestaré considerando el caso en que los archivos se crean en el servidor usando FTP, usando credenciales diferentes de las que se ejecutan en el servidor web (normalmente, Apache se ejecuta como nobody / nobody). Esto significa que el usuario que posee los archivos creados manualmente antes de ejecutar el instalador de Drupal (que incluye también los archivos cargados en el servidor desde el archivo de Drupal) no es el usuario utilizado para ejecutar el servidor web (ni el nombre de usuario ni el grupo coinciden) . Este escenario se aplica también al caso en que esos archivos se crean utilizando SSH.

  • El archivo settings.php debe poder escribirse desde el instalador de Drupal, pero una vez realizada la instalación, se sugiere que sea de solo lectura (el instalador lo sugiere y Drupal comprobará periódicamente si el archivo es realmente de solo lectura). En el escenario que estoy describiendo, el permiso de este archivo debe ser al menos 644.
  • Los archivos .htaccess (que están presentes en al menos dos lugares) deben tener el permiso 644. El usuario que creó el archivo aún debe poder sobrescribir el archivo, en el caso de que la próxima versión de Drupal venga con un archivo .htaccess que se ha actualizado (ya sucedió una vez, cuando se agregó una línea a ese archivo para evitar un problema de seguridad). También es posible establecer los permisos en 444, pero en ese caso, los permisos deben cambiarse nuevamente a 644 cuando el archivo necesita ser actualizado.
  • El directorio que contiene los archivos creados por los módulos (el default/filesdirectorio) debe ser (para el usuario asignado a los procesos del servidor web, que es el usuario asignado a los scripts PHP que se ejecutan en ese servidor web):
    • legible
    • grabable
    • transitable (los módulos deben poder alcanzar default/files/<directory-used-by-the-module>/<sub-directory-used-by-the-module>)
kiamlaluno
fuente
después de leer el hilo en drupal.org/node/244924 y específicamente drupal.org/node/244924#comment-8186447 ninguno de los diferentes métodos proporcionó cómo lograr que los archivos se carguen para tener solo 660 RW-RW ---- es decir. sin bit de ejecución. ¿No es el principal problema de seguridad?
kiranking
8

Permisos recomendados de archivo / directorio:

  • El webroot de Drupal debe ser legible en todo el mundo (ver: Updater.inc ): 0755
  • para directorios de carga públicos: 0755 o 0775
  • para directorios de carga privados: 0750 o 0770
  • para archivos públicos cargados: 0644 o 0664
  • para archivos privados cargados: 0640 o 0660
  • para .htaccess dentro de los directorios de carga (ver: file_create_htaccess () ): 0444 (predeterminado) o 0644
  • para settings.php de solo lectura para todos (y otros archivos confidenciales): 0440
  • para todos los demás directorios web: 0755
  • para todos los demás archivos web: 0644

Propiedad recomendada de archivo / directorio:

  • el propietario de todos los directorios / archivos de carga debe establecerse como usuario de Apache,
  • el propietario de todos los directorios / archivos web / fuentes debe establecerse como usuario no Apache,
  • (opcionalmente) el grupo de todas las fuentes debe establecerse en el grupo Apache,

Estas son las variables que controlan los permisos predeterminados de directorio / archivo para nuevos elementos:

file_chmod_directory: 0775
file_chmod_file: 0664

Aquí hay algunas secuencias de comandos para corregir permisos: fix-permissions.sh


Lee mas:


Aquí está la secuencia de comandos que estoy usando para corregir los permisos en el host remoto para directorios públicos / privados:

#!/bin/sh -e
# Script to correct public/private directory and files permissions.
[ -z "$1" ] && { echo Usage: $0 @remote.dst; exit 1; }

DST="$1" && shift
GET_HTTP_GROUP='ps axo user,group,comm | egrep "(apache|httpd)" | grep -v ^root | uniq | cut -d\  -f 1'

drush $* $DST ssh 'PUB=$(drush dd %files) && PRIV=$(drush dd %private) && AGROUP=$('"$GET_HTTP_GROUP"') && chgrp -vR $AGROUP $PUB $PRIV && chmod -vR u+rwX,g+rwX,o+rX $PUB $PRIV'

Nota: el código anterior intentará recuperar el grupo Apache y establecerlo en GET_HTTP_GROUPvariable.

kenorb
fuente
Muy bonita hoja de trucos, marcada. Buen trabajo ..
kiranking
4

Este script de shell se encuentra al final de esta página: https://www.drupal.org/node/244924

Lo ejecuto ocasionalmente para asegurarme de que mis permisos estén configurados correctamente.

#!/bin/bash
# Help menu
print_help() {
cat <<-HELP
This script is used to fix permissions of a Drupal installation
you need to provide the following arguments:
1) Path to your Drupal installation.
2) Username of the user that you want to give files/directories ownership.
3) HTTPD group name (defaults to www-data for Apache).
Usage: (sudo) bash ${0##*/} --drupal_path=PATH --drupal_user=USER --httpd_group=GROUP
Example: (sudo) bash ${0##*/} --drupal_path=/usr/local/apache2/htdocs --drupal_user=john --httpd_group=www-data
HELP
exit 0
}
if [ $(id -u) != 0 ]; then
  printf "**************************************\n"
  printf "* Error: You must run this with sudo. *\n"
  printf "**************************************\n"
  print_help
  exit 1
fi
drupal_path=${1%/}
drupal_user=${2}
httpd_group="${3:-www-data}"
# Parse Command Line Arguments
while [ $# -gt 0 ]; do
  case "$1" in
    --drupal_path=*)
      drupal_path="${1#*=}"
      ;;
    --drupal_user=*)
      drupal_user="${1#*=}"
      ;;
    --httpd_group=*)
      httpd_group="${1#*=}"
      ;;
    --help) print_help;;
    *)
      printf "***********************************************************\n"
      printf "* Error: Invalid argument, run --help for valid arguments. *\n"
      printf "***********************************************************\n"
      exit 1
  esac
  shift
done
if [ -z "${drupal_path}" ] || [ ! -d "${drupal_path}/sites" ] || [ ! -f "${drupal_path}/core/modules/system/system.module" ] && [ ! -f "${drupal_path}/modules/system/system.module" ]; then
  printf "*********************************************\n"
  printf "* Error: Please provide a valid Drupal path. *\n"
  printf "*********************************************\n"
  print_help
  exit 1
fi
if [ -z "${drupal_user}" ] || [[ $(id -un "${drupal_user}" 2> /dev/null) != "${drupal_user}" ]]; then
  printf "*************************************\n"
  printf "* Error: Please provide a valid user. *\n"
  printf "*************************************\n"
  print_help
  exit 1
fi
cd $drupal_path
printf "Changing ownership of all contents of "${drupal_path}":\n user => "${drupal_user}" \t group => "${httpd_group}"\n"
chown -R ${drupal_user}:${httpd_group} .
printf "Changing permissions of all directories inside "${drupal_path}" to "rwxr-x---"...\n"
find . -type d -exec chmod u=rwx,g=rx,o= '{}' \;
printf "Changing permissions of all files inside "${drupal_path}" to "rw-r-----"...\n"
find . -type f -exec chmod u=rw,g=r,o= '{}' \;
printf "Changing permissions of "files" directories in "${drupal_path}/sites" to "rwxrwx---"...\n"
cd sites
find . -type d -name files -exec chmod ug=rwx,o= '{}' \;
printf "Changing permissions of all files inside all "files" directories in "${drupal_path}/sites" to "rw-rw----"...\n"
printf "Changing permissions of all directories inside all "files" directories in "${drupal_path}/sites" to "rwxrwx---"...\n"
for x in ./*/files; do
    find ${x} -type d -exec chmod ug=rwx,o= '{}' \;
    find ${x} -type f -exec chmod ug=rw,o= '{}' \;
done
echo "Done setting proper permissions on files and directories"
Copy the code above to a file, name it "fix-permissions.sh" and run it as follows:
sudo bash fix-permissions.sh --drupal_path=your/drupal/path --drupal_user=your_user_name

Note: The server group name is assumed "www-data", if it differs use the --httpd_group=GROUP argument.
Richard Robinson
fuente
2

Además, si está ejecutando fastcgi, el php se ejecuta como el usuario, y tendrá acceso a todos los archivos a los que el usuario tiene acceso a menos que intente evitarlo deliberadamente.

G.Martin
fuente
1

Esto me ayudó con mis problemas de permisos OSX. Lo encontré en https://www.drupal.org/node/244924#comment-3741738 por el usuario de protoplasma. Era como si tuviera problemas después de una migración.

[root@localhost]cd /path_to_drupal_installation/sites
[root@localhost]find . -type d -name files -exec chmod ug=rwx,o= '{}' \;
[root@localhost]find . -name files -type d -exec find '{}' -type f \; | while read FILE; do chmod ug=rw,o= "$FILE"; done
[root@localhost]find . -name files -type d -exec find '{}' -type d \; | while read DIR; do chmod ug=rwx,o= "$DIR"; done
cayerdis
fuente
-3

Hay un módulo llamado Revisión de seguridad que verifica si su sitio es seguro o no. También encontré un muy buen enlace para configurar los permisos del sitio.

Manikandan
fuente