Droits harmonieux des fichiers d'un serveur
Pour disposer d'un dépôt de fichier possèdant des droit pas trop laxistes et pas trop restrictifs, j'utilise INotify sur mes serveurs web. �a permet de ne pas tout mettre en root (si, si, j'en connais beaucoup qui font ça) et de ne pas tout mettre en 0777 (�a c'est pour Magento et ses problèmes de droits imbéciles). Pour mettre ça en place, il suffit d'utiliser INotify et d'exécuter le script qui suit et tout est magique :)
#!/bin/bash
(inotifywait -mqr --format "%w%f" --excludei ".*\.log" -e create /home/www |
while read item; do
echo "$item";
DirName=`dirname "$item"`;
#Tous les éléments fils de /home/www doivent avoir www-data comme propriétaire (Apache) et www-coder comme groupe ou le groupe du dossier parent
ParentGroup=`stat -c '%G' "$DirName"`
chown www-data:$ParentGroup "$item";
#
chmod 0460 "$item";
#
[[ -d "$item" ]] && chmod ug+x "$item";
#Si le dossier parent possède un droit en écriture pour le propriétaire, alors on règle le même droit pour le nouveau fichier (dossiers d'uploads, logs etc)
IsParentFolderWritable=`stat -c '%A' "$DirName" | cut -c 3`;
[[ $IsParentFolderWritable == "w" ]] && chmod u+w "$item";
done
) &Le résultat ? Dès qu'un fichier est créé dans un (sous-)dossier quelconque de mon espace regroupant tous mes sites web, il possède automatiquement les droits 460. Pour un dossier ça sera 570. Le propriétaire est toujours www-data (L'utilisateur exécutant Apache) et le groupe est toujours www-coder. Ainsi si l'utilisateur crée un fichier avec un touch ou à l'aide d'un IDE comme Kate ou Coda et que cet utilisateur fait partie du groupe www-coder, toutes les opérations sont transparentes et il n'aura pas besoin de faire le moindre chmod/chown. Liberté...
�a n'est pas tout : par défaut Apache ne peut pas modifier un nouveau fichier et ne peut pas non plus créer quoi que ce soit dans un nouveau dossier (le propriétaire, Apache, peut juste lire l'élément). C'est important car ça évite beaucoup de problèmes). Que faire si on a un dossier "upload" dans lequel Apache doit pouvoir écrire des choses ? Il suffit de faire un chmod u+w sur ce dossier et tous les fichiers/dossiers qui seront créés disposeront également de ce droit. Magique je vous dit :)
L'étape d'après est que chaque site sous /home/www puisse avoir un groupe différent et que chaque dossier/fichier créé à l'intérieur au lieu d'être affecté à www-data:www-coder puisse être affecté au groupe de son parent. Ainsi, chaque fichier continuera d'avoir pour propriétaire www-data mais aura codersite1 ou codersite2 comme groupe. La granularité est (?) optimale.
Faire la suite avec ma nouvelle version :#!/bin/bash
killCommand() {
kill $INotifyPID
rm -f $PipePath
exit
}
handleItem() {
item=$1
echo "$item";
DirName=`dirname "$item"`;
#Tous les éléments fils de /home/www doivent avoir www-data comme propriétaire (Apache) et www-coder comme gro ou le groupe du dossier parent
ParentGroup=`stat -c '%G' "$DirName"`
chown www-data:$ParentGroup "$item";
#
chmod 0460 "$item";
#
[[ -d "$item" ]] && chmod ug+x "$item";
#Si le dossier parent possède un droit en écriture pour le propriétaire, alors on règle le même droit pour le nouveau fichier
IsParentFolderWritable=`stat -c '%A' "$DirName" | cut -c 3`;
[[ $IsParentFolderWritable == "w" ]] && chmod u+w "$item";
}
PipePath="/tmp/adjustWWW.pipe"
mkfifo $PipePath
inotifywait -mqr --format "%w%f" --excludei ".*\.log" -e create,close_write /home/www > $PipePath &
INotifyPID=$!
trap "killCommand" 2 3 15
while read item; do
handleItem $item &
done < $PipePath
killCommand