375 votes

Quelles permissions doivent avoir les fichiers/dossiers de mon site web sur un serveur web Linux ?

Il s'agit d'un Question canonique sur les permissions de fichiers sur un serveur web Linux.

J'ai un serveur web Linux exécutant Apache2 qui héberge plusieurs sites web. Chaque site web a son propre dossier dans /var/www/.

/var/www/contoso.com/
/var/www/contoso.net/
/var/www/fabrikam.com/

Le répertoire de base /var/www/ appartient à root:root. Apache est exécuté sous www-data:www-data. Le site web de Fabrikam est maintenu par deux développeurs, Alice et Bob. Les deux sites Web de Contoso sont maintenus par un développeur, Eve. Tous les sites Web permettent aux utilisateurs de télécharger des images. Si un site Web est compromis, l'impact doit être aussi limité que possible.

Je souhaite connaître la meilleure façon de configurer les autorisations afin qu'Apache puisse servir le contenu, que le site Web soit protégé contre les attaques et que les développeurs puissent toujours apporter des modifications. L'un des sites Web est structuré comme suit :

/var/www/fabrikam.com
    /cache
    /modules
    /styles
    /uploads
    /index.php

Comment les permissions doivent-elles être définies sur ces répertoires et fichiers ? J'ai lu quelque part qu'il ne faut jamais utiliser les autorisations 777 sur un site Web, mais je ne comprends pas quels problèmes cela pourrait causer. Pendant les périodes d'affluence, le site Web met automatiquement en cache certaines pages et stocke les résultats dans le dossier cache. Tout le contenu soumis par les visiteurs du site est enregistré dans le dossier "uploads".

8 votes

Il s'agit d'un canonique réponse à toutes les questions que nous recevons sur les autorisations de sites web.

1 votes

"J'ai lu quelque part qu'il ne faut jamais utiliser les autorisations 777 sur un site web, mais je ne comprends pas..." - le lecteur sera-t-il alors en mesure de comprendre ou du moins de comparer les mérites des réponses données ici ? Toute solution devrait être basée sur des exigences spécifiques - les exigences ici ne sont pas assez spécifiques (quel est le modèle de menace).

8 votes

J'aime bien que vous posiez des questions sur Apache, mais que vous utilisiez les domaines que Microsoft utilise généralement comme exemples.

407voto

DaRKoN_ Points 4098

Lorsque vous décidez des autorisations à utiliser, vous devez savoir exactement qui sont vos utilisateurs et ce dont ils ont besoin. Un serveur Web interagit avec deux types d'utilisateurs.

Authentifié Les utilisateurs disposent d'un compte d'utilisateur sur le serveur et peuvent se voir attribuer des privilèges spécifiques. Il s'agit généralement des administrateurs système, des développeurs et des comptes de service. Ils apportent généralement des modifications au système en utilisant SSH ou SFTP.

Anonyme Les utilisateurs sont les visiteurs de votre site web. Bien qu'ils n'aient pas le droit d'accéder directement aux fichiers, ils peuvent demander une page web et le serveur web agit en leur nom. Vous pouvez limiter l'accès des utilisateurs anonymes en faisant attention aux autorisations dont dispose le processus du serveur web. Sur de nombreuses distributions Linux, Apache s'exécute en tant que programme www-data utilisateur mais il peut être différent. Utilisez ps aux | grep httpd o ps aux | grep apache pour voir quel utilisateur Apache utilise sur votre système.


Notes sur les permissions linux

Linux et les autres systèmes conformes à POSIX utilisent les permissions traditionnelles d'Unix. Il existe un excellent article sur Wikipedia à propos de Permissions du système de fichiers donc je ne vais pas tout répéter ici. Mais il y a quelques éléments dont vous devez être conscient.

Le bit d'exécution
Les scripts interprétés (par exemple Ruby, PHP) fonctionnent très bien sans la permission d'exécution. Seuls les binaires et les scripts scripts ont besoin du bit execute. Pour pouvoir traverser (entrer) un répertoire, vous devez avoir la permission d'exécuter sur ce répertoire. Le serveur web a besoin de cette permission pour lister un répertoire ou servir les fichiers qu'il contient.

Permissions par défaut des nouveaux fichiers
Lorsqu'un fichier est créé, il hérite normalement de l'identifiant de groupe de celui qui l'a créé. Mais parfois, vous souhaitez que les nouveaux fichiers héritent de l'identifiant de groupe du dossier dans lequel ils ont été créés, et vous devez donc activer le bit SGID sur le dossier parent.

Les valeurs de permission par défaut dépendent de votre umask. L'umask soustrait les permissions des fichiers nouvellement créés. Ainsi, la valeur courante de 022 entraîne la création de fichiers avec 755. Lorsque vous collaborez avec un groupe, il est utile de changer votre umask en 002 afin que les fichiers que vous créez puissent être modifiés par les membres du groupe. Et si vous voulez personnaliser les permissions des fichiers téléchargés, vous devez soit changer le umask d'apache, soit exécuter chmod après le téléchargement du fichier.


Le problème du 777

Quand vous chmod 777 votre site web, vous n'avez aucune sécurité. N'importe quel utilisateur du système peut modifier ou supprimer n'importe quel fichier de votre site Web. Mais plus sérieusement, n'oubliez pas que le serveur Web agit au nom des visiteurs de votre site Web et qu'il est désormais en mesure de modifier les fichiers qu'il exécute. S'il existe des vulnérabilités de programmation dans votre site Web, elles peuvent être exploitées pour défigurer votre site, lancer des attaques de phishing ou voler des informations sur votre serveur sans que vous le sachiez.

De plus, si votre serveur fonctionne sur un serveur port connu (ce qu'il doit faire pour empêcher les utilisateurs non root de créer des services d'écoute accessibles au monde entier), cela signifie que votre serveur doit être démarré par root (bien que tout serveur sain passe immédiatement à un compte moins privilégié une fois le port lié). En d'autres termes, si vous utilisez un serveur Web où l'exécutable principal fait partie du contrôle de version (par exemple, une application CGI), le fait de laisser ses permissions (ou, d'ailleurs, les permissions du répertoire contenant, puisque l'utilisateur pourrait renommer l'exécutable) à 777 permet à cualquier utilisateur pour exécuter cualquier exécutable en tant que root.


Définir les besoins

  • Les développeurs ont besoin d'un accès en lecture/écriture aux fichiers pour pouvoir mettre à jour le site web.
  • Les développeurs ont besoin de lire/écrire/exécuter sur les répertoires afin de pouvoir naviguer dans le système.
  • Apache a besoin d'un accès en lecture aux fichiers et aux scripts interprétés.
  • Apache a besoin d'un accès en lecture/exécution aux répertoires à servir.
  • Apache a besoin d'un accès en lecture/écriture/exécution aux répertoires pour le contenu téléchargé.

Maintenu par un seul utilisateur

Si un seul utilisateur est responsable de la maintenance du site, définissez-le comme propriétaire de l'utilisateur dans le répertoire du site Web et donnez-lui les droits rwx complets. Apache a toujours besoin d'un accès pour pouvoir servir les fichiers, donc définissez www-data comme le groupe propriétaire et donnez au groupe des autorisations r-x.

Dans votre cas, Eve, dont le nom d'utilisateur pourrait être eve est le seul utilisateur qui maintient contoso.com :

chown -R eve contoso.com/
chgrp -R www-data contoso.com/
chmod -R 750 contoso.com/
chmod g+s contoso.com/
ls -l
drwxr-s--- 2 eve      www-data   4096 Feb  5 22:52 contoso.com

Si vous avez des dossiers qui doivent être accessibles en écriture par Apache, vous pouvez simplement modifier les valeurs de permission pour le groupe propriétaire afin que www-data ait un accès en écriture.

chmod g+w uploads
ls -l
drwxrws--- 2 eve      www-data   4096 Feb  5 22:52 uploads

L'avantage de cette configuration est qu'il devient plus difficile (mais pas impossible*) pour les autres utilisateurs du système de fouiner, puisque seuls les propriétaires de l'utilisateur et du groupe peuvent parcourir le répertoire de votre site Web. Ceci est utile si vous avez des données secrètes dans vos fichiers de configuration. Faites attention à votre umask ! Si vous créez un nouveau fichier ici, les valeurs de permission seront probablement par défaut à 755. Vous pouvez exécuter umask 027 afin que les nouveaux fichiers soient par défaut en 640 ( rw- r-- --- ).


Maintenu par un groupe d'utilisateurs

Si plusieurs utilisateurs sont responsables de la maintenance du site, vous devrez créer un groupe à utiliser pour l'attribution des autorisations. Une bonne pratique consiste à créer un groupe distinct pour chaque site Web, et à nommer le groupe d'après ce site.

groupadd dev-fabrikam
usermod -a -G dev-fabrikam alice
usermod -a -G dev-fabrikam bob

Dans l'exemple précédent, nous avons utilisé le groupe owner pour donner des privilèges à Apache, mais maintenant il est utilisé pour le groupe developers. Puisque l'utilisateur owner ne nous est plus utile, le définir comme root est un moyen simple de s'assurer qu'aucun privilège ne sera perdu. Apache a toujours besoin d'un accès, nous donnons donc un accès en lecture au reste du monde.

chown -R root fabrikam.com
chgrp -R dev-fabrikam fabrikam.com
chmod -R 775 fabrikam.com
chmod g+s fabrikam.com
ls -l
drwxrwxr-x 2 root     dev-fabrikam   4096 Feb  5 22:52 fabrikam.com

Si vous avez des dossiers qui doivent être accessibles en écriture par Apache, vous pouvez faire en sorte qu'Apache soit l'utilisateur propriétaire ou le groupe propriétaire. Dans les deux cas, il aura tous les accès dont il a besoin. Personnellement, je préfère qu'il soit le propriétaire de l'utilisateur afin que les développeurs puissent toujours parcourir et modifier le contenu des dossiers de téléchargement.

chown -R www-data uploads
ls -l
drwxrwxr-x 2 www-data     dev-fabrikam   4096 Feb  5 22:52 uploads

Bien que cette approche soit courante, elle présente un inconvénient. Étant donné que tous les autres utilisateurs du système ont les mêmes privilèges qu'Apache pour votre site web, il est facile pour les autres utilisateurs de naviguer sur votre site et de lire les fichiers qui peuvent contenir des données secrètes, comme vos fichiers de configuration.

Vous pouvez avoir votre gâteau et le manger aussi

Cela peut encore être amélioré. Il est parfaitement légal pour le propriétaire d'avoir moins de privilèges que le groupe, donc au lieu de gaspiller le propriétaire de l'utilisateur en l'assignant à root, nous pouvons faire d'Apache le propriétaire de l'utilisateur sur les répertoires et les fichiers de votre site web. Il s'agit d'une inversion du scénario du mainteneur unique, mais cela fonctionne tout aussi bien.

chown -R www-data fabrikam.com
chgrp -R dev-fabrikam fabrikam.com
chmod -R 570 fabrikam.com
chmod g+s fabrikam.com
ls -l
dr-xrwx--- 2 www-data  dev-fabrikam   4096 Feb  5 22:52 fabrikam.com

Si vous avez des dossiers qui doivent être accessibles en écriture par Apache, vous pouvez simplement modifier les valeurs de permission pour l'utilisateur propriétaire afin que www-data ait un accès en écriture.

chmod u+w uploads
ls -l
drwxrwx--- 2 www-data  dev-fabrikam   4096 Feb  5 22:52 fabrikam.com

Une chose à laquelle il faut faire attention avec cette solution est que l'utilisateur propriétaire des nouveaux fichiers correspondra au créateur au lieu d'être défini comme www-data. Ainsi, les nouveaux fichiers que vous créerez ne seront pas lisibles par Apache tant que vous ne les aurez pas chownés.


*Séparation de privilège d'Apache

J'ai mentionné précédemment qu'il est en fait possible pour d'autres utilisateurs de fouiner sur votre site web, quel que soit le type de privilèges que vous utilisez. Par défaut, tous les processus Apache s'exécutent sous le même utilisateur www-data, de sorte que tout processus Apache peut lire les fichiers de tous les autres sites web configurés sur le même serveur, et parfois même y apporter des modifications. Tout utilisateur qui peut faire en sorte qu'Apache exécute un script peut obtenir le même accès qu'Apache lui-même.

Pour combattre ce problème, il existe différentes approches pour séparation des privilèges dans Apache. Cependant, chaque approche présente des inconvénients en termes de performances et de sécurité. À mon avis, tout site ayant des exigences de sécurité plus élevées devrait être exécuté sur un serveur dédié plutôt que d'utiliser des VirtualHosts sur un serveur partagé.


Considérations supplémentaires

Je ne l'ai pas mentionné auparavant, mais c'est généralement une mauvaise pratique que d'avoir des développeurs qui modifient directement le site Web. Pour les sites plus importants, il est préférable d'avoir une sorte de système de publication qui met à jour le serveur Web à partir du contenu d'un système de contrôle de version. L'approche du mainteneur unique est probablement idéale, mais au lieu d'une personne, vous avez un logiciel automatisé.

Si votre site Web autorise des téléchargements qui n'ont pas besoin d'être servis, ces téléchargements doivent être stockés quelque part en dehors de la racine Web. Sinon, vous risquez de constater que des personnes téléchargent des fichiers qui étaient censés être secrets. Par exemple, si vous autorisez les étudiants à soumettre des travaux, ceux-ci doivent être enregistrés dans un répertoire qui n'est pas servi par Apache. C'est également une bonne approche pour les fichiers de configuration qui contiennent des secrets.

Pour un site web dont les exigences sont plus complexes, vous pouvez envisager l'utilisation de Listes de contrôle d'accès . Ceux-ci permettent un contrôle beaucoup plus sophistiqué des privilèges.

Si votre site Web a des exigences complexes, vous pouvez écrire un script qui configure toutes les autorisations. Testez-le minutieusement, puis gardez-le en sécurité. Il pourrait valoir son pesant d'or si vous vous trouvez un jour dans l'obligation de reconstruire votre site Web pour une raison quelconque.

17 votes

"chmod -R 775 fabrikam.com". Très peu de fichiers à l'intérieur de la plupart des sites web doivent être exécutables ; par exemple php script peut être 0640 tant que le serveur web peut les lire. chmod -R a+X fabrikam.com donnerait les droits d'exécution à tout le monde uniquement sur les répertoires.

8 votes

Notez bien qu'Apache fonctionne en tant qu'utilisateur apache sur les systèmes dérivés de Red Hat.

0 votes

C'est excellent, mais il y a une chose que je n'ai pas comprise : Je ne comprends pas l'objectif ou l'avantage de la stratégie consistant à faire d'apache l'utilisateur/propriétaire d'un répertoire ou d'un fichier s'il a déjà la propriété du groupe sur le fichier.

23voto

Fox Points 922

Je me demande pourquoi tant de gens utilisent (ou recommandent) la partie "autre" (o) des droits Linux pour contrôler ce qui peut faire Apache (et/ou PHP). En définissant cette partie des droits à autre chose que "0", vous autorisez simplement le monde entier à faire quelque chose sur le fichier/répertoire.

Mon approche est la suivante :

  • Je crée deux utilisateurs séparés. Un pour l'accès SSH/SFTP (si nécessaire), qui possédera tous les fichiers, et un pour l'utilisateur PHP FastCGI (l'utilisateur sous lequel le site web sera exécuté). Appelons ces utilisateurs respectivement bob y bob-www .
  • bob aura tous les droits ( rwx sur les dossiers, rw- sur les fichiers), afin qu'il/elle puisse lire et modifier l'ensemble du site web.
  • Le processus PHP FastCGI a besoin de r-x sur les dossiers et r-- les droits sur les fichiers, sauf pour des dossiers très spécifiques comme cache/ o uploads/ où la permission "write" est également nécessaire. Pour donner à PHP FastCGI cette capacité, il sera exécuté en tant que bob-www y bob-www seront ajoutés à la liste automatiquement créée bob groupe.
  • Nous nous assurons maintenant que le propriétaire et le groupe de tous les répertoires et fichiers sont bob bob .
  • Il manque quelque chose : même si nous utilisons FastCGI, Apache a toujours besoin d'un accès en lecture, pour le contenu statique, ou les fichiers .htaccess qu'il essaiera de lire s'il le souhaite. AllowOverride a une autre valeur que None . Pour éviter d'utiliser le o partie des droits, j'ajoute le www-data l'utilisateur au bob groupe.

Maintenant :

  • Pour contrôler ce que le développeur peut faire, nous pouvons jouer avec l'option u une partie des droits (mais voir la note ci-dessous).
  • Pour contrôler ce qu'Apache et PHP peuvent faire, nous pouvons jouer avec le paramètre g une partie des droits.
  • El o est toujours définie à 0, de sorte que personne d'autre sur le serveur ne peut lire ou modifier le site Web.
  • Il n'y a pas de problème lorsque bob crée de nouveaux fichiers, puisqu'il appartiendra automatiquement à son groupe principal ( bob ).

C'est un récapitulatif, mais dans cette situation, bob est autorisé à SSH. Si aucun utilisateur ne devrait être autorisé à modifier le site web (par exemple, le client ne modifie le site web que par le biais d'un panneau d'administration CMS et n'a pas de connaissances de Linux), créez quand même deux utilisateurs, mais donnez /bin/false comme Shell pour bob également, et désactiver sa connexion.

    adduser --home /var/www/bobwebsite --shell /bin/bash bob
    adduser --no-create-home --shell /bin/false --disabled-login --ingroup bob bob-www
    adduser www-data bob
    cd /var/www/bobwebsite
    chown -R bob:bob .
    find -type d -exec chmod 750 {} \;
    find -type f -exec chmod 640 {} \;

Note : les gens ont tendance à oublier que limiter la u (propriétaire) est la plupart du temps inutile et non sécurisée, puisque le propriétaire d'un fichier peut exécuter le programme chmod commande, même les droits sont 000.

Dites-moi si mon approche présente des problèmes de sécurité, car je n'en suis pas sûr à 100 %, mais c'est ce que j'utilise.

Je pense que cette configuration a un problème : lorsque PHP/Apache crée un nouveau fichier (ex. upload), il appartient à bob-www:bob y bob ne pourra que le lire. Peut-être que setuid sur le répertoire peut résoudre le problème.

0 votes

Linux ignore setuid . Les nouveaux fichiers sont toujours la propriété de leur créateur.

0 votes

Je ne comprends pas quelque chose. Cela ne semble pas intégrer la situation où plusieurs développeurs travaillent simultanément sur le site web, puisque le seul utilisateur est bob . Comment gérez-vous cela ? Par exemple, via ssh, les deux utilisateurs se connectent sous le nom de bob. bob (1) pense qu'il/elle ne peut pas se souvenir du mot de passe et le change pour un autre, mais toujours sécurisé. bob (2) essaie de se connecter la fois suivante, et il/elle ne peut pas.

2 votes

@naxa Tout système un tant soit peu bon ne devrait jamais voir ses développeurs modifier directement le site web. Dans l'idéal, le site Web est soumis à un contrôle de version tel que le compte utilisateur "bob" extrait et déploie automatiquement chaque version (stable). Ainsi, les développeurs effectuent le développement hors site, et les modifications sont déployées dès qu'elles sont poussées vers le serveur de déploiement. Bob est un utilisateur système qui doit avoir des autorisations réseau très limitées, qui n'incluent pas la connexion à distance ; iptables vous permet en fait de filtrer par UID pour ce genre de choses.

11voto

Paul Points 2607

Compte tenu du classement Google de l'excellente réponse ci-dessus, je pense qu'il y a une chose à noter, et je n'arrive pas à laisser une note après la réponse.

En continuant avec l'exemple, si vous prévoyez d'utiliser www-data comme propriétaire et dev-fabrikam comme groupe avec des permissions 570 sur le répertoire (ou le fichier), il est important de noter que Linux ignore setuid Ainsi, tous les nouveaux fichiers appartiendront à l'utilisateur qui les a créés. Cela signifie qu'après avoir créé de nouveaux répertoires et fichiers, vous devrez utiliser quelque chose de similaire à :

chown -R www-data /newdirectory/
chmod -R 570 /newdirectory/

Dans Ubuntu 12.04 pour Rackspace OpenStack, j'avais un problème étrange où je ne pouvais pas faire fonctionner les permissions 570 jusqu'à ce que je redémarre le serveur, ce qui a magiquement réglé le problème. Je perdais des cheveux à un rythme croissant sur ce problème apparemment simple....

0 votes

S'il vous plaît, faites que cela soit googlé : Dans Raspbian (aka sur un raspberry pi, si vous voulez changer la propriété de /var/www sous lighttpd (ou un autre navigateur web), vous DEVEZ redémarrer.

0 votes

@gbronner S'il s'agit d'un problème difficile à résoudre, vous pourriez envisager de le publier sous forme de question et d'y répondre. Cependant, il est probablement plus approprié de le faire sur un autre site de questions-réponses sur les SE. A mon avis Unix et Linux pourrait être un bon endroit pour faire ça.

1 votes

Il y a aussi raspberrypi.stackexchange.com ; il semble que les sites SE fragmentent un peu les connaissances.

5voto

Manolo Points 492

Je vais avec cette configuration :

  1. Tous les répertoires, à l'exception de celui des téléchargements, ont été mis en place par le propriétaire. root et le groupe root les autorisations de 0755 .
  2. Tous les fichiers sont attribués au propriétaire root et le groupe root les autorisations de 0644 .
  3. Télécharge le répertoire défini par le propriétaire root groupe www-data les autorisations de 1770 . La partie adhésive ne permet pas au propriétaire du groupe de supprimer ou de renommer le répertoire et les fichiers qu'il contient.
  4. A l'intérieur du dossier uploads, un nouveau répertoire avec www-data l'utilisateur et le groupe propriétaire, et 0700 les autorisations pour chaque www-data l'utilisateur qui télécharge des fichiers.
  5. Configuration d'Apache :

Refuser AllowOverride y Index dans le répertoire uploads, pour qu'Apache ne lise pas .htaccess et l'utilisateur d'Apache ne peut pas indexer le contenu du dossier uploads :

<Directory /siteDir>
   Options -Indexes
</Directory>

<Directory /siteDir/uploadDir>
   AllowOverride none
</Directory>

6. php.ini configuration :

open_basedir = /siteDir:/tmp:/usr/share/phpmyadmin
post_max_size = 5M
file_uploads = On
upload_max_filesize = 3M
max_file_uploads = 20

Avec cette configuration, le www-data l'utilisateur ne pourra pas pénétrer dans les répertoires autres que le répertoire siteDir/ /tmp y /usr/share/phpmyadmin . Vous pouvez également contrôler la taille maximale des fichiers, la taille maximale des messages et le nombre maximal de fichiers à télécharger dans une même requête.

5voto

Krishan Gopal Points 131

Si vous avez un utilisateur FTP appelé "leo" qui a besoin de télécharger des fichiers dans le répertoire web de example.com et que vous avez également besoin que votre utilisateur "apache" soit capable de créer des fichiers uploa-files/sessions/cache dans le répertoire cache, procédez comme suit :

Cette commande assigne leo comme propriétaire et le groupe comme apache à exemple.com, l'utilisateur apache fait partie du groupe apache donc il hérite des permissions du groupe apache.

chown -R leo:apache exemple.com

Une autre commande qui assure la bonne permission et répond aux préoccupations de sécurité également.

chmod -R 2774 exemple.com

Ici le premier chiffre 2 est pour le répertoire et assure que chaque nouveau fichier créé restera dans les mêmes permissions de groupe et de propriétaire. 77 est pour le propriétaire et le groupe signifie qu'ils ont un accès complet. 4 pour les autres signifie qu'ils peuvent seulement lire.

Les éléments suivants sont utiles pour comprendre les numéros d'autorisation

Number  Octal Permission Representation
0   No permission
1   Execute permission
2   Write permission
3   Execute and write permission: 1 (execute) + 2 (write) = 3
4   Read permission
5   Read and execute permission: 4 (read) + 1 (execute) = 5
6   Read and write permission: 4 (read) + 2 (write) = 6
7   All permissions: 4 (read) + 2 (write) + 1 (execute) = 7

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X