Exemples de configuration
Sur de nombreux systèmes, le processus Apache s'exécute sous la forme d'un utilisateur appelé "www-data" qui fait partie d'un groupe appelé "www-data". Cet utilisateur doit être en mesure de lire tous les fichiers de votre répertoire Drupal, soit par des permissions de groupe, soit par des permissions "autres". Il ne doit pas avoir de droits d'écriture sur le code de votre répertoire Drupal. Si vous utilisez des fonctionnalités de Drupal qui nécessitent le répertoire "files", donnez à l'utilisateur www-data le droit d'écrire des fichiers uniquement dans ce répertoire.
Voici un exemple de liste de fichiers d'une configuration sécurisée montrant deux fichiers dans un site où les fichiers téléchargés sont stockés dans le répertoire "files". Afin de voir les autorisations de fichiers définies pour votre configuration, allez à la ligne de commande et tapez : ls -al.
drwxrwx--- 7 www-data greg-group 4096 2008-01-18 11:02 files/ drwxr-x--- 32 greg-user www-data 4096 2008-01-18 11:48 modules/ -rw-r----- 1 greg-user www-data 873 2007-11-13 15:35 index.php
Dans l'exemple ci-dessus, l'utilisateur du serveur web a la possibilité d'écrire dans le répertoire files, tous les utilisateurs du groupe "greg" peuvent également lire et écrire les données, mais les autres utilisateurs ne sont pas autorisés à interagir avec ces données. Le fichier "index.php" (représentatif de tous les fichiers de code) peut être modifié par "greg" et peut être lu par le groupe www-data (nous supposons que l'utilisateur www-data fait partie du groupe www-data). Aucun autre utilisateur ne peut lire ce fichier. Il s'agit d'une méthode assez sûre pour configurer votre site. En général, vous ne voulez pas que des utilisateurs aléatoires ayant la possibilité de lire des fichiers sur votre serveur puissent voir l'intérieur de ces fichiers, d'où les trois dernières permissions --- au lieu de r-x.
Voici une configuration non sécurisée :
NOTE: THIS IS AN INSECURE CONFIGURATION drwxrwx--- 7 www-data www-data 4096 2008-01-18 11:02 files/ drwxrwx--- 32 greg-user www-data 4096 2008-05-16 11:48 modules/ -rw-rw-rw- 1 www-data www-data 873 2007-11-13 15:35 index.php
Cette configuration permet à l'utilisateur www-data de modifier le fichier index.php (et comme il est représentatif des autres fichiers, nous supposons que tous les fichiers qui composent le site Drupal). Cette configuration est dangereuse pour les raisons exposées ci-dessous. Si vous utilisez une telle configuration, veuillez la modifier immédiatement pour qu'elle ressemble davantage à la première version. Les instructions pour effectuer les changements nécessaires sont données ci-dessous pour les serveurs Linux.
Avertissement : Ne prenez pas le risque de suivre ces instructions à l'aveuglette ; chaque système a ses propres particularités et, de ce fait, les instructions ici DOIVENT être modifiées pour répondre à vos besoins. Toutes les instructions ici sont destinées aux personnes qui sont familières avec les permissions des systèmes de fichiers et qui savent exactement ce que signifient toutes les commandes écrites ici. Si vous essayez de suivre ces instructions sans faire attention à ce que vous faites, vous risquez d'avoir des problèmes. Ces instructions sont conçues pour modifier les permissions du système de fichiers en tant qu'utilisateur root, alors soyez prudent !
Note pour les installations Drupal hébergées
Cette méthode d'installation suppose un noyau Drupal partagé et de nombreux sous-domaines installés sous celui-ci. Supposons donc que vous êtes le propriétaire d'un service d'hébergement qui a une installation Drupal déjà préconfigurée et que vous voulez vendre un site Drupal hébergé avec un noyau Drupal préconfiguré à vos clients. Ainsi, lorsque vous le vendez, vous créez leur utilisateur sur le serveur et les laissez configurer leur propre site Drupal en entrant simplement l'adresse de leur site pour ouvrir la page d'installation. De la manière dont ce document suggère la configuration, cela empêchera les clients de modifier et d'accéder aux fichiers du noyau Drupal et aux fichiers et répertoires des sites des autres clients.
Il est important de noter que la propriété utilisateur des répertoires/sous-répertoires et fichiers de base de Drupal est attribuée à l'utilisateur qui administre Drupal (généralement root) et que la propriété du groupe est attribuée au groupe sur lequel tourne votre apache. Pour les fichiers et répertoires du répertoire "sites", l'utilisateur qui héberge le site sur votre serveur est leur propriétaire. Une façon de procéder est de supprimer le répertoire "sites" sous le répertoire racine de Drupal et d'en faire un lien symbolique vers /home ou un autre chemin que vous utilisez pour stocker les répertoires personnels des utilisateurs. De cette façon, si vous créez des noms d'utilisateurs qui correspondent à l'URL du site du client, aucune permission ne devra être modifiée. La seule chose à faire est de changer la propriété du groupe du répertoire au groupe sur lequel tourne votre apache.
cd /path_to_drupal_installation mv sites/* /home rmdir sites ln -s /home sites useradd www.example.com chown -R www.example.com:www-data /home/www.example.com
L'autorisation requise par Apache est donnée par le biais d'une autorisation de groupe et les autres n'ont aucun accès aux fichiers et répertoires d'une installation Drupal. Ne donnez aucune permission à "others", sinon si votre système est piraté grâce au mot de passe faible d'un utilisateur, le pirate pourra accéder à tous les fichiers et répertoires de tous les sites installés sur votre serveur, et pas seulement à celui qui a été envahi. Même une autorisation en lecture seule doit être évitée. N'oubliez pas que le nom d'utilisateur et le mot de passe pour se connecter à la base de données de chaque site sont stockés dans settings.php. Pire encore, si vous donnez le droit d'écriture à d'autres personnes, le pirate pourra modifier les fichiers pour endommager votre site ou télécharger des scripts malveillants sur votre serveur.
Les instructions de ce guide supposent une installation non hébergée, modifiez donc la propriété en fonction de votre situation, par exemple, lorsque vous voyez "greg" dans ces instructions, remplacez "greg" par le nom de l'utilisateur (souvent root, mais pas nécessairement) qui administre votre installation de Drupal.
Serveurs Linux
Les permissions pour les fichiers et les répertoires sur un système Linux sont ajustées à l'aide de la commande chmod. L'identité de l'utilisateur-propriétaire et du groupe-propriétaire des fichiers et des répertoires est ajustée à l'aide de la commande chown.
Le code ci-dessous démontre une méthode pour changer la propriété et les permissions des fichiers et des répertoires dans le répertoire racine de Drupal pour confirmer la propriété et les permissions selon les recommandations ci-dessus. Nous supposons dans l'exemple ci-dessous que l'utilisateur greg fait partie du groupe greg et que l'utilisateur greg est le propriétaire du site. Nous supposons également que vous exécutez Drupal sur un serveur qui ne se trouve pas dans un environnement d'hébergement qui fournit des services d'hébergement de sites Web à plusieurs clients.
Assurez-vous que vous exécutez les commandes suivantes depuis le répertoire racine de Drupal ! Si vous exécutez ces commandes à partir d'un autre répertoire, soit vous n'apporterez pas de modifications à tous les fichiers et répertoires de l'installation Drupal, soit vous apporterez des modifications à des fichiers et répertoires autres que ceux de l'installation Drupal. Aucune de ces alternatives n'est votre objectif.
[root@localhost]cd /path_to_drupal_installation
[root@localhost]chown -R greg:www-data .
[root@localhost]find . -type d -exec chmod u=rwx,g=rx,o= '{}' \;
[root@localhost]find . -type f -exec chmod u=rw,g=r,o= '{}' \;
La deuxième commande fait de l'utilisateur greg l'utilisateur-propriétaire et du groupe www-data le groupe-propriétaire de tous les fichiers et répertoires du répertoire racine de Drupal et de tous les sous-répertoires et fichiers de ces sous-répertoires (le commutateur -R signifie récursif). Notez que dans un environnement d'hébergement à clients multiples, l'utilisateur-propriétaire des fichiers et répertoires de Drupal doit être root.
La troisième commande de l'exemple trouve tous les répertoires et sous-répertoires du répertoire racine de Drupal et exécute la commande chmod sur tous ces répertoires et sous-répertoires (-type d signifie que les entités du système de fichiers sont des répertoires). La commande change les permissions en lecture, écriture et accès pour l'utilisateur greg et en lecture et accès pour les utilisateurs du groupe www-data. Les utilisateurs qui ne sont pas greg et qui ne font pas partie du groupe www-data ne peuvent pas lire, écrire ou accéder aux répertoires ou sous-répertoires du répertoire racine de Drupal. En notation numérique, la permission attribuée à ces répertoires et sous-répertoires est 750.
La quatrième commande trouve tous les fichiers dans le répertoire racine de Drupal et ses sous-répertoires et change les permissions sur ces fichiers en lecture et écriture pour l'utilisateur greg et en lecture seule pour le groupe www-data. Les autres utilisateurs n'ont aucun accès à ces fichiers. La notation numérique de cet ensemble de permissions est 640.
Pour le répertoire "files" dans le répertoire sites/default et tout autre répertoire de site dans une installation multisite, les autorisations sont légèrement différentes car l'utilisateur www-data doit avoir le droit d'écriture sur le répertoire :
[root@localhost]cd /path_to_drupal_installation/sites
[root@localhost]find . -type d -name files -exec chmod ug=rwx,o= '{}' \;
[root@localhost]for d in ./*/files
do
find $d -type d -exec chmod ug=rwx,o= '{}' \;
find $d -type f -exec chmod ug=rw,o= '{}' \;
done
La deuxième commande ci-dessus trouve tous les sous-répertoires nommés fichiers sous le répertoire sites et change les permissions pour l'utilisateur propriétaire et le groupe propriétaire en lecture, écriture et accès. Tous les autres utilisateurs ne peuvent ni lire, ni écrire, ni accéder à ces sous-répertoires de fichiers.
La boucle "for" ci-dessus est écrite pour un shell de style sh (sh, bash, ksh). Si vous utilisez csh ou tcsh, tapez bash avant d'exécuter la commande. Ces commandes dans la boucle donnent des permissions de lecture, d'écriture et d'accès à l'utilisateur greg et au groupe www-data pour tous les sous-répertoires et fichiers à l'intérieur des fichiers, mais pas d'accès aux autres utilisateurs. Le code numérique des permissions est 770.
N'oubliez pas que les permissions de tout module/thème nouvellement installé ou de tout autre module complémentaire doivent également être modifiées. Il est préférable de le faire AVANT d'installer le module, le thème ou le module complémentaire dans son répertoire Drupal approprié.
Considérations spéciales pour settings.php
Le fichier settings.php contient le mot de passe et le nom d'utilisateur de la base de données en texte clair et, une fois créé, il doit être configuré de manière à ce que seuls les utilisateurs appropriés puissent le lire. Cela signifie généralement la suppression des droits de lecture pour l'utilisateur "autre".
Résumons les permissions
drupal_admin : l'utilisateur sur le serveur qui administre Drupal, pas nécessairement la racine.
site_admin : le propriétaire du site hébergé (un client)
Propriété
Fichiers et répertoires des modules/thèmes de base : drupal_admin:www-data Fichiers et répertoires des modules/thèmes/fichiers des sites hébergés : site_admin:www-data
Droits d'accès
Répertoires des modules/thèmes du noyau : rwxr-x--- Fichiers des modules/thèmes de base : rw-r----- Répertoires des modules/thèmes des sites hébergés : rwxr-x--- Fichiers des modules/thèmes des sites hébergés : rw-r----- Répertoire "files" des sites hébergés : rwxrwx--- Fichiers des sites hébergés sous les répertoires "files" : rw-rw---- Sous-répertoires des sites hébergés sous les répertoires "files" : rwxrwx---
Suivez ce guide à la lettre pour rendre votre installation Drupal aussi sûre que possible. Ce guide a été testé et fonctionne. Si quelque chose ne va pas avec votre installation, revoyez les étapes - vous avez peut-être manqué quelque chose. Si cela ne fonctionne vraiment pas, postez un commentaire avec votre problème, et quelqu'un corrigera ce guide.
Script basé sur les directives données ci-dessus
Si vous avez besoin de fixer les permissions à plusieurs reprises, le script suivant vous aidera, il est basé sur les directives données ci-dessus et effectue quelques vérifications avant toute modification pour s'assurer qu'elle n'est pas appliquée sur des fichiers/répertoires en dehors de votre installation Drupal.
#!/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 or root *\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"
Copiez le code ci-dessus dans un fichier, nommez-le "fix-permissions.sh" et exécutez-le comme suit :
sudo bash fix-permissions.sh --drupal_path=votre/drupal/path --drupal_user=votre_nom_d'utilisateur
Note : Le nom du groupe du serveur est supposé être "www-data", s'il diffère, utilisez l'argument --httpd_group=GROUP.
Si vous avez des privilèges suffisants sur votre serveur
- Placez le fichier dans /usr/local/bin
- sudo chown root:root /usr/local/bin/fix-permissions.sh
- sudo vi /etc/sudoers.d/fix-permissions et entrez la ligne suivante dans le fichier
- user1, user2 ALL = (root) NOPASSWD : /usr/local/bin/fix-permissions.sh
- Sauvegardez le fichier et ensuite sudo chmod 0440 /etc/sudoers.d/fix-permissions
Remarque : Remplacez la liste d'utilisateurs séparés par des virgules que vous souhaitez par user1, user2 ci-dessus. Vous pouvez également entrer un ALIAS pour une liste d'utilisateurs. Exécutez man sudoers pour plus d'informations sur le formatage de la ligne.
Ce que le fichier /etc/sudoers.d/fix-permissions accomplit est de rendre le script disponible à un ensemble d'utilisateurs via la commande sudo sans avoir à entrer un mot de passe.
En supposant que /usr/local/bin se trouve dans le chemin d'accès de l'utilisateur (ce qui devrait être le cas), le script peut être exécuté de n'importe où à l'aide de la commande
sudo fix-permissions.sh \ --drupal_path=/path/to/the/drupal/install \ --drupal_user=votre_utilisateur_désiré
Remarque : le "\" est utilisé ici pour éviter les sauts de ligne dans l'affichage de la page.
Source : https://www.drupal.org/node/244924