Quelles sont les autorisations Unix parfaites pour les répertoires de projets Web habituels?

12

Quelles sont les autorisations 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 (fichiers images / swf / js) résideront
  2. Un répertoire où les fichiers statiques téléchargés par l'administrateur (fichiers images / swf / 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 côté serveur exécutables / navigables
  5. Un répertoire où les fichiers déjà existants (txt ou xml) seront édités par code côté serveur

Voici mes suggestions et justifications

  1. 555, tout le monde peut lire et écrire, personne ne peut exécuter
  2. 544, seul le propriétaire peut écrire, tout le monde ne peut que lire, personne ne peut exécuter
  3. 000, personne n'a besoin de lire, écrire ou exécuter, ne sera utilisé que par le serveur web?
  4. 661, le propriétaire peut lire, écrire, tout le monde ne peut qu'exécuter
  5. 600, le propriétaire peut lire, écrire (peut-être pas nécessaire), personne d'autre ne peut rien faire

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

  1. Y a-t-il quelque chose couramment utilisé dans les applications Web que j'ai manqué dans la première liste?
  2. Y a-t-il quelque chose avec lequel vous n'êtes pas d'accord dans la deuxième liste, quelle est votre alternative et pourquoi est-elle meilleure?
user893730
la source
1
Je ne comprends pas pourquoi les gens n'utilisent PAS les ACL ces jours-ci ...
pfo

Réponses:

20

En supposant qu'une `` application Web '' s'exécute sur un serveur (comme apache, nginx, etc.) et qu'elle est écrite dans un langage de script dynamique (comme PHP, Ruby, etc.), vous vous méprenez sur qui est `` l'utilisateur ''.

L'utilisateur n'est pas la personne qui est connectée à votre application - cela, et son rôle dans l'application (admin, etc.) est complètement hors de propos pour le scénario. L'utilisateur est l'utilisateur système Linux sous lequel le processus s'exécute. Le code de votre site Web est exécuté comme un seul utilisateur - il peut s'agir de l'utilisateur de votre serveur Web (ce qui n'est pas vraiment une bonne chose), ou il peut s'agir d'un utilisateur spécifique à votre site (ce qui est beaucoup mieux).

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

Une bonne configuration aura votre serveur exécuté comme un seul utilisateur (appelons cet utilisateur «serveur Web») et votre langage de script dynamique exécuté (par exemple via FastCGI) comme 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 'webserver' doivent pouvoir lire vos fichiers. Cependant, un seul d'entre eux peut «posséder» les fichiers. Le propriétaire est l '«utilisateur» (utilisateur, groupe, autre). Nous avons également besoin de notre langage de script pour pouvoir écrire dans le répertoire (et lire les fichiers qu'il a écrits). L'utilisateur 'site1' a donc besoin d'autorisations de lecture et d'écriture. Puisque nous voulons que les autorisations de groupe et autres soient aussi restrictives que possible, notre «propriétaire» sera «site1», et les autorisations d'utilisateur correspondantes seront lues et écrites.

Étant donné que nous ne pouvons pas spécifier les autorisations pour notre serveur Web en tant qu’autre «utilisateur», nous ajouterons «serveur Web» au groupe «site1» (vous pouvez bien sûr créer un groupe différent contenant à la fois «site1» et «serveur Web». Tout les membres de ce groupe se verront attribuer les mêmes autorisations. Les autorisations les plus laxistes (de l'utilisateur, du groupe ou d'un autre ensemble) seront appliquées à n'importe quel utilisateur pour déterminer ses autorisations.

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 exécutés directement, mais sont plutôt lus dans un interpréteur - seules les autorisations de lecture sont nécessaires pour exécuter un script typique (celui qui n'écrit rien).

L'autorisation «exécuter» sur les répertoires a une signification différente - elle permet la traversée sans pouvoir lire le contenu. Afin de pouvoir lire un fichier dans un répertoire, un utilisateur doit avoir des autorisations «exécuter» sur CHAQUE répertoire au-dessus.

Pour une application Web, chaque fichier doit avoir des autorisations 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) a besoin d'autorisations d'écriture. Une configuration efficace tentera de servir des fichiers statiques directement via le serveur Web, car les langues dynamiques ont tendance à être lentes à lire des fichiers volumineux et à reproduire le contenu. Le serveur Web a donc besoin d'un accès en lecture à vos fichiers statiques.

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

  • Un fichier dans un répertoire où les fichiers statiques téléchargés par l'utilisateur (fichiers images / swf / js) résideront: 640
  • Un fichier dans un répertoire où les fichiers statiques téléchargés par l'administrateur (fichiers images / swf / js) résideront: 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 côté serveur exécutables / navigables: 400 (ou 440)
  • Un fichier dans un répertoire où les fichiers déjà existants (txt ou xml) seront édités par code côté serveur: 640 ou 600
    • (dépend si le serveur Web les affichera, parfois non modifiés)

Tandis que les autorisations minimales de répertoire peuvent être:

  • Un répertoire où les fichiers statiques téléchargés par l'utilisateur (fichiers images / swf / js) résideront: 750
  • Un répertoire où les fichiers statiques téléchargés par l'administrateur (fichiers 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 au moins 510]
  • Un répertoire où résideront les scripts côté serveur exécutables / navigables: 500 (ou 550) [devrait être au moins 510]
  • Un répertoire où les fichiers déjà existants (txt ou xml) seront édités par code côté serveur: 750 ou 700
    • (dépend si le serveur Web servira des fichiers d'ici, non modifiés parfois)

Encore une fois - votre serveur Web doit avoir des autorisations «exécuter» sur chaque répertoire au-dessus de celui auquel il doit accéder - donc même si le serveur Web ne sert pas les fichiers d'un répertoire donné, nous devons lui accorder des autorisations d'exécution.

Il est assez courant de donner au serveur Web un accès en lecture à la plupart des fichiers (modifiez donc ces 500 à 550). Les autorisations par défaut `` assez sécurisées '' sont généralement 755 pour les répertoires et 644 pour les fichiers - pas d'autorisations 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 autorisations.

Gardez à l'esprit que les «autres» autorisations se réfèrent à tout utilisateur du système qui n'est pas le propriétaire ou dans le groupe (c'est-à-dire tous les autres utilisateurs du système). Garder vos «autres» autorisations restrictives est bon, car ces utilisateurs sont inconnus - vous ne leur avez pas explicitement donné l'autorisation. Les autres autorisations sont souvent les plus faciles à utiliser sur un système compromis (par exemple, l'une des raisons pour lesquelles / tmp est une cible commune).

Dans le contexte de ce qui précède, je ne pense pas que vos deux dernières questions soient pertinentes. Définissez vos autorisations de répertoire sur 550 (et les autorisations de fichier sur 440), puis accordez à l'utilisateur les autorisations d'écriture pour tous les répertoires dans lesquels votre application va écrire (par exemple, répertoire: 750; fichier: 640).

(Vous aurez évidemment besoin d'autorisations en écriture pour télécharger les fichiers - mais si vous le souhaitez, vous pouvez les supprimer par la suite - sans doute cependant, si quelqu'un écrit dans un répertoire que seul le propriétaire peut écrire - votre compte a été compromis - qui en est un des raisons du maintien des autorisations restrictives).

cyberx86
la source
@Iain: Absolument - je pensais aux autorisations de fichiers à ce moment - corrigera cela - merci.
cyberx86
1

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

  1. 555 r-xr-xr-xne l' est pas rw-rw-rw. Comme il s'agit d'un répertoire, pour créer / supprimer des fichiers, vous devez les avoir xdéfinis afin que 750 rwxr-x---soit un bon point de départ. Cela permet à l'utilisateur propriétaire du répertoire d'ajouter / supprimer des fichiers et à tous les membres du groupe commun d'y accéder.
  2. Identique à 1. ci-dessus.
  3. S'ils sont vraiment des fichiers statiques, 050 donnerait l'accès au serveur Web, mais pour créer les fichiers, 750 serait au minimum.
  4. Identique à 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.
Iain
la source
Le serveur Web n'aurait-il pas besoin d'exécuter des autorisations sur le répertoire pour lire les fichiers (points # 1 (740?), 3, 5)?
cyberx86
Ah! en effet x est nécessaire pour accéder aux fichiers r vous permet juste de les lister ... ambles off pour plus de café.
user9517
0

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 que l'association de groupe de nouveaux fichiers correspondra aux paramètres du répertoire parent plutôt que GID par défaut du créateur du fichier). Cela permet à tous les utilisateurs de parcourir (chdir vers et à travers) et de lire (exécuter la commande ls ou effectuer 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 à conserver 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 groupe ou non). Évidemment, pour les scripts CGI et les binaires, il faut ajouter le x-bit; et pour certaines situations spéciales, avec des binaires extrêmement bien testés, on peut ajouter des bits SUID ou SGID. Normalement, UNIX et Linux ignoreront le bit SUID / SGID des scripts et n'honoreront que sa sémantique pour les binaires exécutables compilés natifs. Cependant, vous pouvez exécuter votre site sous quelque chose comme Apache avec un module comme le "setuidhack" qui peut être utilisé pour que le serveur Web honore les bits SUID / SGID même sur des scripts interprétés. (Cela se fait par le démon HTTP stat () ing chaque fichier et en utilisant son propre code fork () / execve () personnalisé, en interpolant la chaîne d'interpréteur correctement dans le vecteur execve () plutôt qu'en passant simplement l'exécutable '

Ce ne sont que les lignes directrices les plus générales. Ils ne sont pas "parfaits" dans toutes les situations et vous devez absolument consulter les documents de votre serveur Web et de toute application ou infrastructure Web que vous installez et configurez ... et vous voudrez probablement consulter un expert en sécurité UNIX avant vous exposez tous vos fichiers, code ou serveurs à l'Internet public.

Jim Dennis
la source