14 votes

Quelles sont les permissions unix parfaites pour les répertoires habituels des projets web ?

Quelles sont les permissions minimales parfaites au format octal pour les éléments suivants dans une application web écrite ?

  1. Un répertoire où les fichiers statiques téléchargés par l'utilisateur (images/swf/fichiers js) résideront.
  2. Un répertoire où l'administrateur a téléchargé des fichiers statiques (images/swf/fichiers js) résideront
  3. Un répertoire où résident les bibliothèques utilisées dans l'application
  4. Un répertoire où résideront les scripts exécutables/navigables côté serveur.
  5. Un répertoire où les fichiers existants (txt ou xml) seront édités par le code du côté serveur.

Voici mes suggestions et justifications

  1. 555, tout le monde peut lire et écrire, personne ne peut exécuter
  2. 544, le propriétaire seul peut écrire, tous les autres ne peuvent que lire, personne ne peut exécuter.
  3. 000, personne n'a besoin de lire, d'écrire ou d'exécuter, il ne sera utilisé que par le serveur web ?
  4. 661, le propriétaire peut lire, écrire, tous les autres ne peuvent qu'exécuter.
  5. 600, le propriétaire peut lire et écrire (ce n'est pas toujours nécessaire), personne d'autre ne peut faire quoi que ce soit.

Maintenant, je suis intéressé par deux choses :

  1. Y a-t-il un élément couramment utilisé dans les applications Web que j'ai oublié dans la première liste ?
  2. Y a-t-il quelque chose que vous désapprouvez dans la deuxième liste, quelle est votre alternative, et pourquoi est-elle meilleure ?

1 votes

Je ne comprends pas pourquoi les gens PAS en utilisant des ACLs ces jours-ci ...

21voto

cyberx86 Points 20450

En supposant qu'une "application web" fonctionne sur un serveur (comme apache, nginx, etc.) et qu'elle est écrite dans un langage de script dynamique (comme PHP, Ruby, etc.), vous avez mal compris qui est l'"utilisateur".

L'utilisateur n'est pas la personne qui est connectée à votre application - cela, ainsi que son rôle dans l'application (administrateur, etc.), n'est absolument pas pertinent pour le scénario. L'utilisateur est l'utilisateur du système linux sous lequel le processus est exécuté. Le code de votre site web est exécuté sous un seul utilisateur - il peut s'agir de l'utilisateur de votre serveur web (ce qui n'est pas vraiment une bonne chose), ou d'un utilisateur spécifique à votre site (ce qui est bien mieux).

Sur linux, les utilisateurs appartiennent à des groupes - nous pouvons ajouter un utilisateur à un autre groupe et attribuer des privilèges à ce groupe.

Dans une bonne configuration, votre serveur s'exécutera sous un seul utilisateur (appelons cet utilisateur "webserver") et votre langage de script dynamique s'exécutera (par exemple via FastCGI) sous son propre utilisateur (un utilisateur par site - appelons notre premier utilisateur "site1").

Pour servir vos fichiers, le serveur web doit y avoir accès, et le langage de script doit y avoir accès. Cela signifie que "site1" et "serveur web" doivent être en mesure de lire vos fichiers. Cependant, un seul d'entre eux peut "posséder" les fichiers. Le propriétaire est l'"utilisateur" (dans user, group, other). Nous avons également besoin que notre langage de script puisse écrire dans le répertoire (et lire les fichiers qu'il a écrits). L'utilisateur 'site1' a donc besoin de droits de lecture et d'écriture. Puisque nous voulons que les permissions de groupe et autres soient aussi restrictives que possible, notre 'propriétaire' sera 'site1', et les permissions d'utilisateur correspondantes seront lecture et écriture.

Puisque nous ne pouvons pas spécifier les permissions pour notre serveur web en tant qu'autre "utilisateur", nous allons ajouter "webserver" au groupe "site1" (vous pouvez bien sûr créer un groupe différent avec à la fois "site1" et "webserver"). Tous les membres de ce groupe recevront les mêmes permissions. Les permissions les plus laxistes (de l'utilisateur, du groupe, d'un autre ensemble) seront appliquées à tout utilisateur donné pour déterminer ses permissions.

Il convient de noter qu'une bonne configuration ne devrait pas exiger que les fichiers aient des autorisations d'exécution pour un langage dynamique. Les fichiers ne sont pas directement exécutés, mais plutôt lus dans un interpréteur - seules des permissions de lecture sont nécessaires pour exécuter un script typique (un qui n'écrit rien).

L'autorisation "execute" sur les répertoires a une signification différente : elle permet de les parcourir sans pouvoir en lire le contenu. Pour pouvoir lire un fichier dans un répertoire, un utilisateur doit avoir les droits d'exécution sur TOUS les répertoires situés au-dessus.

Pour une application web, chaque fichier doit avoir des droits de lecture par son propriétaire - sinon, c'est un fichier assez inutile. Qu'un utilisateur ou un administrateur télécharge des fichiers (via votre application Web), le "propriétaire" (c'est-à-dire le langage dynamique) doit disposer de droits d'écriture. Une configuration efficace essaiera de servir les fichiers statiques directement via le serveur web, car les langages dynamiques ont tendance à être lents à lire les fichiers volumineux et à en restituer le contenu. Le serveur web a donc besoin d'un accès en lecture à vos fichiers statiques.

Par conséquent, les autorisations minimales de fichiers peuvent être :

  • Un fichier dans un répertoire où résideront les fichiers statiques téléchargés par l'utilisateur (images/swf/js) : 640
  • Un fichier dans un répertoire où résideront les fichiers statiques téléchargés par l'administrateur (images/swf/js) : 640
  • Un fichier dans un répertoire où résident les bibliothèques utilisées dans l'application : 400 (ou 440)
  • Un fichier dans un répertoire où résideront les scripts exécutables/navigables côté serveur : 400 (ou 440)
  • Un fichier dans un répertoire où les fichiers déjà existants (txt ou xml) seront édités par le code du côté serveur : 640 ou 600
    • (cela dépend si le serveur web les affiche, parfois sans modification)

Alors que, les permissions minimales du répertoire peuvent être :

  • Un répertoire où les fichiers statiques téléchargés par l'utilisateur (images/swf/js) résideront : 750
  • Un répertoire où les fichiers statiques téléchargés par l'administrateur (images/swf/js) résideront : 750
  • Un répertoire où résident les bibliothèques utilisées dans l'application : 500 (ou 550) [devrait être 510 au moins].
  • Un répertoire où résideront les scripts exécutables/navigables côté serveur : 500 (ou 550) [devrait être 510 au moins].
  • Un répertoire où les fichiers déjà existants (txt ou xml) seront édités par le code côté serveur : 750 ou 700
    • (cela dépend si le serveur web va servir des fichiers à partir d'ici, parfois non modifiés)

Une fois de plus, votre serveur web doit avoir les droits d'exécution sur tous les répertoires situés au-dessus de celui auquel il doit accéder. Ainsi, même si le serveur web ne veut pas servir les fichiers d'un répertoire donné, nous devons lui accorder les droits d'exécution.

Il est assez courant de donner au serveur web un accès en lecture à la plupart des fichiers (changez donc ces 500 en 550). Les permissions par défaut "quelque peu sécurisées" sont généralement 755 pour les répertoires et 644 pour les fichiers - pas de permissions d'exécution, tout le monde peut lire, et seul l'utilisateur peut écrire - vous remarquerez que la grande majorité des fichiers sur un système linux ont ces permissions.

Gardez à l'esprit que les autorisations "autres" font référence à tout utilisateur du système qui n'est pas le propriétaire ou le groupe (c'est-à-dire tous les autres utilisateurs du système). Il est bon de conserver des autorisations restrictives pour les "autres", car ces utilisateurs sont inconnus - vous ne leur avez pas explicitement donné d'autorisation. Les autres permissions sont souvent les plus faciles à exploiter sur un système compromis (c'est l'une des raisons pour lesquelles /tmp est une cible courante).

Dans le contexte de ce qui précède, je ne pense pas que vos deux dernières questions soient très pertinentes. Définissez les droits d'accès aux répertoires à 550 (et les droits d'accès aux fichiers à 440), puis accordez à l'utilisateur des droits d'écriture pour tous les répertoires dans lesquels votre application écrira (c'est-à-dire répertoire : 750 ; fichier : 640).

(Vous aurez évidemment besoin de droits d'écriture pour télécharger les fichiers - mais si vous le souhaitez, vous pouvez les supprimer par la suite - on peut toutefois soutenir que si quelqu'un écrit dans un répertoire où seul le propriétaire peut écrire - votre compte a été compromis - ce qui est l'une des raisons pour lesquelles il faut conserver des autorisations restrictives).

0 votes

@Iain : Absolument - je pensais aux autorisations de fichiers à ce moment-là - je vais corriger cela - merci.

1voto

user9517 Points 113163

Il est normal de disposer de l'ensemble minimal de permissions pour effectuer le travail. Si votre serveur web et les utilisateurs partagent un groupe commun, vous pouvez supprimer la nécessité de donner un accès à o . Les permissions sont également liées aux utilisateurs. Vous semblez avoir mal compris les permissions octales.

  1. 555 est r-xr-xr-x pas rw-rw-rw . Comme il s'agit d'un répertoire, pour créer/supprimer des fichiers, vous devez disposer des éléments suivants x fixé à 750 rwxr-x--- serait un bon point de départ. Cela permet à l'utilisateur qui possède le répertoire d'ajouter/supprimer des fichiers et à tous les membres du groupe commun d'y accéder.
  2. Identique au point 1. ci-dessus.
  3. S'il s'agit vraiment de fichiers statiques, 050 donnerait au serveur web un accès, mais pour créer les fichiers en premier lieu, 750 serait un minimum.
  4. Idem que le point 3 ci-dessus.
  5. 070 serait le minimum pour permettre au serveur web de lire et de modifier les fichiers mais les fichiers doivent être créés donc 770 est probablement plus réaliste.

0 votes

Le serveur web n'aurait-il pas besoin de droits d'exécution sur le répertoire pour lire les fichiers (points 1 (740 ?), 3, 5) ?

0 votes

Doh ! en effet x est nécessaire pour accéder aux fichiers r vous permet juste de les lister... je vais aller chercher plus de café.

0voto

YourMomzThaBomb Points 398

En général, on utilise le mode 0755, 0775 ou 2775 sur les répertoires (le bit SGID sur les répertoires, pour BSD et pour Linux si le système de fichiers est monté avec la sémantique BSD, fera correspondre l'association de groupe des nouveaux fichiers aux paramètres du répertoire parent plutôt qu'au GID par défaut du créateur du fichier). Cela permet à tous les utilisateurs de traverser (chdir dans et à travers) et de lire (exécuter la commande ls ou les appels système readdir/read) les répertoires en question. Les alternatives ajoutent des options de groupe/écriture et, comme indiqué, le bit SGID, sur les répertoires, peut aider à garder tous les fichiers et sous-répertoires associés à un groupe approprié.

Pour les fichiers, on utilise normalement 0644 ou éventuellement 0664 (lisible par le monde et accessible en écriture par le groupe ou non). Évidemment, pour les scripts et les binaires CGI, on doit ajouter le bit x ; et pour certaines situations spéciales, avec des binaires extrêmement bien testés, on pourrait ajouter les bits SUID ou SGID. Normalement, UNIX et Linux ignorent le bit SUID/SGID sur scripts et n'honorent sa sémantique que pour les binaires natifs compilés et exécutables. Cependant, il se peut que vous fassiez tourner votre site sous quelque chose comme Apache avec un module comme "setuidhack" qui peut être utilisé pour que le serveur web honore les bits SUID/SGID même sur les scripts interprétés. (Ceci est fait par le démon HTTP stat()ing chaque fichier et en utilisant son propre code personnalisé fork()/execve(), interpolant la chaîne correctement interprétée dans le vecteur execve() plutôt que de simplement passer le nom de l'exécutable directement à un appel système execve()).

Il ne s'agit là que des directives les plus générales. Elles ne sont pas "parfaites" pour toutes les situations et vous devez absolument consulter la documentation de votre serveur web et de toute application web ou framework que vous installez et configurez ... et vous devriez probablement consulter un expert en sécurité UNIX avant d'exposer vos fichiers, votre code ou vos serveurs à l'Internet public.

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