Vous ne devriez jamais avoir à gérer un site web à partir de votre répertoire personnel. . EVER. Dans le cas contraire, vous devriez donner au serveur web la possibilité de passer par /home/
pour voir la structure du répertoire, mais aussi dans /home/$USER/
(le répertoire personnel de votre utilisateur, où nous pouvons essayer de voir ce qui existe d'autre dans votre répertoire utilisateur), ainsi que tous les autres sous-dossiers qui s'y trouvent. Un serveur web mal configuré ou non corrigé peut provoquer une fuite massive de données de cette manière, ou la perte d'informations d'identification, ce qui mettrait en péril vos données personnelles et vos identifiants de connexion à d'autres systèmes. L'approche par lien symbolique que vous utilisez ne sert à rien non plus, pour la même raison que d'essayer de donner à Apache des autorisations de lecture. /home/andre/www/moodle
- le serveur web doit être capable de traverser votre répertoire personnel pour atteindre l'emplacement du lien symbolique en /var/www/html
ce qui constitue toujours un risque pour la sécurité.
Tout d'abord, utilisez sudo cp -r /home/andre/www/moodle/ /var/www/html/
. Cette opération copiera vos fichiers sur /var/www/html
et gardez-le à l'écart de votre propre répertoire personnel. Nous allons ensuite modifier les autorisations pour que vous et le serveur web puissiez accéder à tout ce qui se trouve dans ce répertoire, et pour que votre utilisateur ait accès à tous les fichiers et répertoires en lecture/écriture. Ainsi, vous n'aurez jamais à travailler qu'à partir de /var/www/html
pour votre site.
Il s'agit en fait de quatre étapes, après que vous avez recopié vos données sur /var/www/html
:
- Donnez à Apache l'accès aux dossiers et aux fichiers, afin qu'il puisse servir le site sans erreurs 403.
- Donnez à votre utilisateur le statut de "propriétaire" des fichiers et des dossiers, et donnez-vous le droit de lire et d'écrire sur tous les fichiers et dossiers, ainsi que la possibilité de parcourir les répertoires.
-
(Facultatif mais recommandé) Configurez-le de manière à ce que tout fichier ou dossier créé à partir de maintenant dans l'ensemble de la structure du répertoire ait le groupe défini comme étant
www-data
.
-
(optionnel) Nettoyage final de la sécurité : nous définissons les autorisations de sorte que vous et le serveur web puissiez voir les données du site, mais que les autres utilisateurs ne puissent pas accéder aux fichiers ou à la structure des répertoires du site.
(1) Autoriser Apache à accéder aux dossiers et aux fichiers.
sudo chgrp -R www-data /var/www/html
sudo find /var/www/html -type d -exec chmod g+rx {} +
sudo find /var/www/html -type f -exec chmod g+r {} +
Cette opération définit récursivement le "groupe" comme étant www-data
pour les dossiers et les fichiers. Le serveur web est alors autorisé à rechercher et à accéder à la structure des répertoires racine du document du site ( +x
pour les répertoires uniquement). Il s'assure également que le serveur web dispose des autorisations de lecture pour tous les fichiers, afin que les données du site puissent être reçues.
Dans certains cas, il peut être nécessaire d'accorder au serveur web des droits d'écriture sur un fichier ou un répertoire. sudo chmod g+w /var/www/html/PATH
(où PATH
est le chemin d'accès au fichier ou au dossier de la structure de répertoires où vous devez appliquer les droits d'écriture pour le serveur web).
AVIS : Dans de nombreux cas, cela peut exposer des informations "sécurisées" sur la configuration d'un site (comme les identifiants d'accès à la base de données, etc.), et vous devez supprimer les "autres" autorisations d'accès à ces données sur ces fichiers ou répertoires individuels avec ce qui suit : sudo chmod o-rwx /var/www/html/FILEPATH
(remplaçant FILEPATH
avec le chemin d'accès relatif au /var/www/html
pour le fichier).
Notez également que vous devrez peut-être réexécuter ces commandes à l'avenir si les "nouveaux fichiers" obtiennent des problèmes 403, afin de donner les autorisations correctes au serveur web pour qu'il puisse continuer à accéder aux fichiers et dossiers qui sont créés ou copiés et qui n'obtiennent pas l'autorisation d'accès. www-data
correctement paramétré.
(2) Accordez à votre propriétaire des privilèges de lecture/écriture sur les dossiers et les fichiers, et autorisez l'accès aux dossiers pour parcourir la structure des répertoires.
sudo chown -R USER /var/www/html/
sudo find /var/www/html -type d -exec chmod u+rwx {} +
sudo find /var/www/html -type f -exec chmod u+rw {} +
Remplacer USER
dans la première commande avec votre propre nom d'utilisateur !
Nous faisons trois choses ici. Premièrement, nous définissons votre utilisateur comme étant le "propriétaire" de tous les fichiers et répertoires de /var/www/html
. Ensuite, nous définissons les droits de lecture et d'écriture sur les dossiers, et nous vous permettons d'accéder aux dossiers pour y entrer (l'option +x
sur les éléments du répertoire). Nous définissons ensuite pour tous les fichiers des autorisations de lecture/écriture pour le propriétaire, que nous venons de définir.
(3) (optionnel) Assurez-vous que tous les nouveaux fichiers créés par la suite le soient avec la mention www-data
en tant qu'utilisateur 'access'.
sudo find /var/www/html -type d -exec chmod g+s {} +
Cela permet d'activer le bit "set gid" pour le groupe sur les répertoires. Les fichiers et dossiers créés à l'intérieur de ces répertoires auront toujours l'attribut www-data
en tant que groupe, autorisant l'accès au serveur web.
(4) (optionnel) Nettoyage de sécurité final, si vous ne voulez pas que d'autres utilisateurs puissent voir les données
Nous avons besoin de votre utilisateur pour voir les répertoires et les fichiers. Nous avons également besoin que le serveur web puisse le faire. Il se peut que nous ne voulions pas que d'autres utilisateurs du système (à l'exception de root) voient les données. Ne leur donnons donc pas cet accès et faisons en sorte que seuls votre utilisateur et le serveur web puissent voir les données.
sudo chmod -R o-rwx /var/www/html/
NOTE : Vous n'aurez pas à réexécuter cette opération ultérieurement, ni à modifier les autorisations pour la catégorie d'autorisations "autres". Si les "autres" utilisateurs ne peuvent pas accéder à /var/www/html/
(ils ne disposent pas des +x
bit sur /var/www/html
pour parcourir la structure des fichiers et des répertoires, ni la fonction +r
pour lire les listes de fichiers), les autorisations sur les éléments situés sous ce répertoire pour d'autres utilisateurs ou groupes n'auront pas beaucoup d'importance.
Il existe également une solution un peu moins invasive, bien qu'il ne soit pas garanti qu'elle fonctionne pour tous les nouveaux fichiers, ni qu'elle fonctionne sur tous les systèmes de fichiers. qui impliquent des listes de contrôle d'accès aux fichiers. Cela vous permet de laisser la propriété des fichiers à www-data
mais vous donne des droits de propriétaire effectifs, à toutes fins utiles, même si vous ne possédez pas personnellement les fichiers.
Cette solution est un peu moins invasive, et vous permet d'avoir un répertoire et tous les fichiers qui s'y trouvent appartenant à www-data:www-data
o root:www-data
mais aussi de s'en donner l'accès. Il utilise Listes de contrôle d'accès qui permet à plusieurs utilisateurs d'avoir des autorisations sans avoir à créer des groupes individuels. Cela permet également au root
o www-data
permet aux utilisateurs du système de posséder des fichiers, mais aussi d'ajouter des permissions supplémentaires au cas par cas, et d'affiner les permissions pour certains utilisateurs afin qu'ils puissent lire des choses mais pas les modifier, etc.
En supposant que nous travaillions toujours avec /var/www/html/
et que nous ne voulons pas que des utilisateurs espions autres que nous et le système (et la racine bien sûr) puissent voir nos données, nous devrons faire les choses suivantes :
-
Redonner la propriété à l'utilisateur du système du serveur web www-data
.
sudo chown -R www-data:www-data /var/www/html
-
Recursivement, vous avez accès aux fichiers en lecture/écriture, tandis que les autres utilisateurs (à l'exception de www-data
y root
bien sûr) aucun accès aux fichiers.
sudo find /var/www/html -type f -exec setfacl -m u:YOURUSERNAME:rw -m other::--- {} \;
-
Recursivement, donnez-vous les droits de lecture/écriture/traversée sur les répertoires, supprimez l'accès aux dossiers pour les autres utilisateurs (à l'exception de www-data
y root
) et la définir comme ACL "par défaut" pour les nouveaux fichiers dans les répertoires.
sudo find /var/www/html -type d -exec setfacl -d -m u:YOURUSERNAME:rwx -m o::--- {} \;
-
Nous devons également définir le paramètre setgid
pour tous les répertoires, de sorte que si vous créez un fichier, le serveur web peut toujours y accéder en tant que www-data
par le biais des autorisations de groupe.
sudo find /var/www/html -type d -exec chmod g+x {} \;
Vous avez maintenant accès à tous les répertoires, et vous n'aviez pas besoin de retirer l'accès aux www-data
ce qui permet au serveur web de continuer à créer des fichiers partout où il en a besoin (par exemple, les frontaux basés sur PHP ont leurs propres répertoires de cache et autres qui doivent être créés et écrits pour fonctionner correctement).
Seul bémol : si vous créez manuellement de nouveaux fichiers, vous devez les chowner en conséquence pour en donner la propriété au serveur web. Il s'agit d'un simple sudo chown www-data:www-data filename
et les listes de contrôle d'accès devraient toujours vous permettre d'avoir des droits de propriétaire effectifs sur le fichier.
Il y a de nombreux cas où j'ai dû faire cela en tant qu'administrateur système pour un certain type d'accès non standard sans changer les propriétaires d'un fichier donné. Cela fonctionne, mais comporte ses propres problèmes, car tous les systèmes de fichiers soutiens les listes d'accès aux fichiers.