Páginas

24 de septiembre de 2015

Como asignar correctamente los permisos en Drupal

Es común que muchas veces nuestro sitio no funcione como es de esperar, muchas veces esto no es más que un síntoma de que hemos asignado mal los permisos.

Esto es mas común en entornos Unix, como Linux y también en Mac, donde estos sistemas son mucho más estrictos con el tema de los permisos que por ejemplo el sistema Windows.


Si en Linux no asignas permiso de escritura a un directorio, será prácticamente imposible que por ejemplo Drupal descargue una actualización y haga alguna modificación, porque son los permisos lo que se lo impiden.

Por supuesto tampoco es cuestión de asignar todos los permisos a todos nuestros directorios y archivos, esto puede parecer bien en tu propia PC, pero cuando muevas el sitio a un servidor vivo,
si este no esta muy bien configurado, suele heredar los permisos de los archivos y directorios que tu le subes, lo cual desde el punto de vista de la seguridad, estas regalado.

La regla de oro de los permisos dice lo siguiente:
Todo los directorios dentro de tu sitio menos el directorio sites, deben ser 750.
Todos los archivos dentro de tu sitio menos en sites, deben ser 640.
Todos los directorios dentro se site deben ser 770
Todos los archivos dentro de site deben ser 660
Pero de que es lo que se esta hablando aquí?

Son términos Geek, y para no darle mucha vuelta básicamente se refiere a esto:
Significado de los signos:
"+" = agrega un permiso a los que ya existen.
"-" = quita el permiso otorgado manteniendo los anteriores.
"=" = ignora los que tiene el mismo y los remplaza por los nuevos.
"u" = usuario.
"g" = grupo.
"o" = otros.
"a" = todo el mundo (usuarios, grupo y otros).
Para archivos:
"r" = read (leer).
"w" = write (escribir).
"x" = execute (ejecutar).
Para directorios:
"r" = list (lee el contenido de los directorios)
"w" = write (escribir)
"x" = puede acceder al directorio, por otra parte si no contiene una "x" no se puede hacer "cd" (cambiar directorio) en el mismo.
Utilizando chmod sin valores numéricos hace que sea más legible. Aquí algunos ejemplos de cómo usarlo:
chmod legible chmod numerico permiso obtenido
ugo=rwx 777 rwxrwxrwx
u-wx 470 r--rwx---
o+r 774 rwxrwxr--
g-wx,o+r 744 rwxr--r--
u-w,g-wx,o+r 544 r-xr--r--
g=,o=r 704 rwx---r--
a-wx 440 r--r-----

Consideraciones especiales para el archivo settings.php

Este archivo contiene la contraseña de nuestra base de datos como también nuestro nombre de usuario.
Una vez instalado el sitio, debería ajustarse los permisos para que solo los apropiados usuarios puedan leerlo.
Esto significa quitar los permisos de lectura para los usuarios "otros" .

Resumiendo los permisos

  • Drupal Admin: el usuario que administra Drupal en el servidor, no necesariamente es el usuario Root.
  • Administrador del Sitio: es el dueño del sitio alojado (puede ser un cliente).

Propietario

Son los módulos del core, los themes, archivos y directorios: drupal_admin:www-data
Sitio alojado: módulos, temas, archivos y directorios: site_admin:www-data

Permisos

Módulos del core, y directorios de los temas: rwxr-x---
Módulos del core y archivos de los temas: rw-r---
Directorios del servidor, como módulos y temas: rwxr-x---
Archivos del servidor como módulos y temas: rw-r-----
Directorio "files": rwxrwx---
Archivos dentro de "files": rw-rw----
Directorios dentro de "files": rwxrwx---
Script para cambiar los permisos de forma automática
Si necesitas reparar los permisos, puedes utilizar el siguiente script.
Esta basado en estos principios comentados más arriba.
Comprueba bien como se ejecuta para no modificar otros archivos y/o directorios ajenos a Drupal que puedas tener en tu sitio:
#!/bin/bash path=${1%/}
user=${2}
group="www-data"
help="\nHelp: Este script es utilizado para reparar los permisos en una instalación de un sitio Drupal\necesitas proveer la siguiente información:\n\t 1) Ruta de tu instalación de drupal\n\t 2) Nombre del usuario al que quieres otorgar los permisos de propiedad para archivos/directorios\nNote: "www-data" (apache default) is assumed as the group the server is belonging to, if this is different you need to modify it manually by editing this script\n\nUsage: (sudo) bash ${0##*/} drupal_path user_name\n"
if [ -z "${path}" ] || [ ! -d "${path}/sites" ] || [ ! -f "${path}/modules/system/system.module" ]; then
echo "Por favor ingresa una ruta válida de Drupal"
echo -e $help
exit
fi
if [ -z "${user}" ] || [ "`id -un ${user} 2> /dev/null`" != "${user}" ]; then
echo "Por favor ingresa un usuario válido"
echo -e $help
exit
fi
cd $path;
echo -e "Cambiando los permisos de propiedad a todo el contenido de "${path}" :\n user => "${user}" \t group => "${group}"\n"
chown -R ${user}:${group} .
echo "Cambiando los permisos de todos los directorios dentro de "${path}" to "750"..."
find . -type d -exec chmod u=rwx,g=rx,o= {} \;
echo -e "Cambiando los permisos de todos los archivos dentro de "${path}" to "640"...\n"
find . -type f -exec chmod u=rw,g=r,o= {} \;
cd $path/sites;
echo "Changing permissions of "files" directories in "${path}/sites" to "770"..."
find . -type d -name files -exec chmod ug=rwx,o= '{}' \;
echo "Changing permissions of all files inside all "files" directories in "${path}/sites" to "660"..."
find . -name files -type d -exec find '{}' -type f \; | while read FILE; do chmod ug=rw,o= "$FILE"; done
echo "Changing permissions of all directories inside all "files" directories in "${path}/sites" to "770"..."
find . -name files -type d -exec find '{}' -type d \; | while read DIR; do chmod ug=rwx,o= "$DIR"; done

Todavía me falta traducirlo más, pero creo yo que te haces ya una idea de lo que hace el mismo.
Como lo ejecutas? bien fácil, en tu directorio de usuario /home/user inicia una consola y pon el siguiente comando:
sudo nano reparar-permisos.sh
Por supuesto este script no lo tienes todavía, pero lo creas al digitar este comando.
creando el script
Dentro de la ventana copia el nuevo script que se encuentra más arriba y pegarlo en la consola, lo puedes hacer con ctrl + shift + insert, o botón derecho, pegar...
completando el script
Ahora guardas el mismo, puedes utilizar F2 o ctrl + O enter y luego salir con ctrl + x, muchos más rápido con F2, pero si cobras por hora, utiliza el 2do. método.

Listo eso es todo, ahora en tu directorio tienes el script llamado reparar-permisos.sh, como lo ejecutas?
Es muy sencillo, supón que tu sitio se encuentra en home/charly/www/sitio1
El script esta en /home/charly
Púes en la consola estando en /home/charly, hago:
sudo bash reparar-permisos.sh www/sitio1 charly
Por supuesto tu tienes que modificar estos valores por los que correspondan.
Ejemplo:
completando el scrip
Ahora ya puedes tener tu sitio con los permisos correctos.
A tener en cuenta:
Es importante que esto lo hagas luego de instalar el sitio y no antes.
Para un sitio vivo, necesitas tener acceso por consola al mismo, pero si cambias los permisos en local y luego subes el sitio, este subirá con los permisos correctos.
Continua...