it-swarm-es.com

¿Cuáles son los permisos de directorio recomendados?

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

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

145
ack

Su servidor web debería poder leer todos los archivos pero no escribir en ellos. Si su sitio involucra la carga de archivos, dé permiso al servidor para escribir solo en esa carpeta.

Más información sobre cómo configurarlo, así como algunas cosas que pueden suceder si no lo hace, está disponible en Drupal docs .

68
Paul Jones

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.php y /default/default.settings.php en 444
91
ErichBSchulz

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 de servidores web (típicamente Apache), y que ese usuario posea todos los Drupal archivos. 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 copie 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 Drupal (incluidos .htaccess) archivos).

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 los 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 R W 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 asegurar que todos los usuarios solo tienen 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.

81
q0rban

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

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, el . es para la ruta actual):

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

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

31
mikl

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 Drupal Docs a los que otros se han vinculado son bastante buenos sobre el tema, pero otro recurso es el Módulo de revisión de seguridad que ayuda a garantizar que tenga todo configurado correctamente.

20
greggles

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 Drupal (que incluye también los archivos cargados en el servidor desde el archivo 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 Drupal, pero una vez realizada la instalación, se sugiere que sea de solo lectura (el instalador sugiere que, y Drupal lo hará periódicamente compruebe 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 llegue una próxima versión de Drupal 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 directorio default/files) Debe ser (para el usuario asignado a los procesos del servidor web, que es el usuario asignado al PHP guiones 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>)
9
kiamlaluno

Permisos recomendados de archivo/directorio:

  • El webroot de Drupal debe ser legible en todo el mundo (ver: pdater.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 archivos/directorios 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_GROUP variable.

7
kenorb

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.
4
Richard Robinson

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

3
G.Martin

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

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

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.

0
Manikandan