web-dev-qa-db-fra.com

Quel utilisateur Apache et PHP doivent être exécutés en tant que? Quelles autorisations doivent avoir les fichiers / var / www?

Je viens de lancer une boîte Ubuntu 11.10, puis j'ai exécuté apt-get install Apache2 php5 pour installer Apache2 et PHP 5 sur la boîte. Maintenant, il fonctionne comme un "serveur Web" et il charge la page "Ça marche!". Maintenant j'essaye de resserrer la sécurité et j'ai les questions suivantes sur les serveurs Web Linux:

  1. Avec qui Apache devrait-il fonctionner?
  2. Dans quel (s) groupe (s) cet utilisateur doit-il être?
  3. Quels packages peuvent faire fonctionner PHP (et Apache?) En tant que propriétaire des fichiers? (Comme sur les hébergeurs Web partagés) Dois-je utiliser ces packages? Sont-ils faciles/réalisables à maintenir sur un petit système?
  4. Quelles devraient être les autorisations par défaut pour les fichiers et dossiers servis sur le Web avec Apache exécuté en tant que www-data? Pour Apache/php fonctionnant en tant qu'utilisateur?

J'ai fait les choses suivantes lors de l'examen de la configuration par défaut:

Structure des fichiers

Quand je cd / et faites un ls -al liste du contenu, je vois /var:

drwxr-xr-x 13 root root  4096 2012-02-04 20:47 var/

Si je cd dans var et fais ls -al Je vois:

drwxr-xr-x  2 root root  4096 2012-02-04 20:47 www/

Enfin, à l'intérieur /var/www Je vois:

drwxr-xr-x  2 root root 4096 2012-02-04 20:47 ./
drwxr-xr-x 13 root root 4096 2012-02-04 20:47 ../
-rw-r--r--  1 root root  177 2012-02-04 20:47 index.html

Ma leçon à retenir est que jusqu'à présent, tous ces fichiers appartiennent à root:root, les fichiers ont des autorisations de 644 et les répertoires ont des autorisations de 755.

Autorisations d'Apache

Si je crée un fichier en tant que root dans /var/www/test.php avec le contenu:

<?php echo Shell_exec('whoami');

et charger ce fichier dans un navigateur, il me dit www-data, qui est le même que dans le /etc/Apache2/envvars fichier:

export Apache_RUN_USER=www-data
export Apache_RUN_GROUP=www-data

Si je fais ps aux | grep -i Apache Je vois ce qui suit:

root      1916  1.2 104664  7488 Ss   20:47 /usr/sbin/Apache2 -k start
www-data  1920  0.8 105144  5436 S    20:47 /usr/sbin/Apache2 -k start
www-data  1921  1.0 105144  6312 S    20:47 /usr/sbin/Apache2 -k start
www-data  1922  0.7 104688  4624 S    20:47 /usr/sbin/Apache2 -k start
www-data  1923  0.7 104688  4624 S    20:47 /usr/sbin/Apache2 -k start
www-data  1924  0.7 104688  4624 S    20:47 /usr/sbin/Apache2 -k start
www-data  1925  0.7 104688  4624 S    20:47 /usr/sbin/Apache2 -k start

Alors qui est Apache? Il semble que le premier processus soit comme root, peut-être à partir de /etc/init.d/Apache script au démarrage du système, et les autres comme www-data est né du premier. Est-ce exact?

Ensuite, si je tape groups www-data alors je vois www-data : www-data - il semble donc être uniquement dans le www-data groupe. Je suppose que c'est également une pratique standard.

Hébergement et sécurité partagés

Donc, si je comprends bien, si Apache fonctionne comme www-data et je veux qu'Apache puisse lire un répertoire, le bit x doit être défini pour le groupe world (other) (o+x), et cela doit également être défini sur tous les répertoires parents tout au long de la chaîne (www, var). Et si je veux qu'Apache puisse lire à partir d'un fichier, alors le o+r le bit doit être défini.

Malheureusement, je pense que cela introduit une faille de sécurité pour plusieurs applications et/ou plusieurs utilisateurs sur la même boîte Linux: tous les fichiers Web doivent être lisibles par le monde, et ils sont donc également accessibles par d'autres applications et d'autres utilisateurs du système. Si une application installée sur le système avait une vulnérabilité de sécurité qui permettait une entrée utilisateur brute et non validée, qui était ensuite exécutée par PHP, un attaquant distant pourrait alors parcourir tous les autres fichiers du système Web qui étaient lisibles par tous. De même, si la boîte avait plusieurs utilisateurs et qu'un utilisateur connaissait le chemin des fichiers Web d'un autre utilisateur, il pourrait alors lire le contenu du fichier (et voir des choses sensibles comme les chaînes de connexion à la base de données, etc.).

J'ai entendu parler de deux packages, suphp et phpsuexec qui permettent de permettre aux fichiers des utilisateurs d'être servis "comme eux" sur un système partagé. L'un des avantages de cela est qu'il permet aux applications Web (comme Wordpress) de créer et de modifier des fichiers - très utiles pour ajouter des thèmes, des plugins et mettre à niveau le logiciel. Bien sûr, il est probablement plus sûr de faire ces choses manuellement, mais un compromis peut-il être fait avec l'un des packages mentionnés ci-dessus? Ou en utilisant éventuellement chown pour que le groupe de répertoires wordpress appartienne à www-data et définissez le bit collant sur le groupe (g+s)?

Je ne les ai utilisés qu'en tant qu'utilisateur final d'une société d'hébergement Web, et donc je ne connais pas leurs tenants et aboutissants, et s'ils sont même raisonnables à installer sur un petit système, ou s'il y en a d'autres des mesures de sécurité que je devrais utiliser à la place, mais j'ai pensé les mentionner ici car elles semblent être un moyen possible de répondre à certaines de mes préoccupations.

Retour aux questions

  1. Avec qui Apache devrait-il fonctionner?
  2. Dans quel (s) groupe (s) cet utilisateur doit-il être?
  3. Quels packages peuvent faire fonctionner PHP (et Apache?) En tant que propriétaire des fichiers? (Comme sur les hébergeurs Web partagés) Dois-je utiliser ces packages? Sont-ils faciles/réalisables à maintenir sur un petit système?
  4. Quelles devraient être les autorisations par défaut pour les fichiers et dossiers servis sur le Web avec Apache exécuté en tant que www-data? Pour Apache/php fonctionnant en tant qu'utilisateur?
41
cwd
  1. pas rooté
  2. pas rooté
  3. SuEXEC
  4. Dépend. 644 pour les fichiers et 755 pour les dossiers sont des valeurs par défaut sûres.

Ne changez pas la propriété de quoi que ce soit en www-data à moins que vous ne vouliez que php puisse modifier le contenu de ce fichier/dossier

Indépendamment de tout ce que vous faites: les dossiers nécessitent des autorisations de lecture et d'exécution pour que l'utilisateur puisse trouver des fichiers; les fichiers nécessitent des autorisations de lecture pour que l'utilisateur puisse les lire. Si vous obtenez des erreurs d'autorisation lors de la modification des choses - vous avez réussi à supprimer ces autorisations fondamentalement requises.

Si vous n'écrivez aucun fichier via votre application php, vous pouvez laisser les fichiers qui vous appartiennent: vous. Dans ce cas, l'autorisation du monde (xx4/5) est celle qui s'applique.

Si vous laissez les fichiers en votre possession: vous avec des autorisations de fichiers de 644 (fichiers), cela signifierait que seulement vous pouvez modifier les fichiers du site Web - www-data n'est pas vous - donc il ne peut pas modifier les fichiers.

Si vous souhaitez restreindre l'accès à Apache + vous et bloquer tous les autres accès chown -R you:www-data *. Avec des autorisations de fichier de 640 et des autorisations de dossier de 750 que vous pouvez modifier, www-data peut lire - car Apache lit alors l'autorisation de groupe (x4/5x).

Limitez au minimum les chemins sur lesquels vous autorisez Apache/php à écrire - s'il y a un répertoire tmp dans lequel l'application doit écrire - autorisez-la à écrire dans ce dossier uniquement - et pour tous les emplacements accessibles en écriture dans la mesure du possible, assurez-vous que c'est à l'extérieur la racine du document ou prenez des mesures pour vous assurer que ce chemin accessible en écriture n'est pas accessible sur le Web.

Notez que "vous" devez pas être root. Autoriser l'accès direct à ssh en tant que root est un indicateur d'autres failles de sécurité (telles que pas interdisant la connexion par mot de passe), mais c'est tout un tas de questions en soi.

17
AD7six

Donc, si je comprends bien, si Apache fonctionne en tant que www-data et que je veux qu'Apache puisse lire un répertoire, le bit x doit être défini pour le groupe mondial (autre) (o + x), et cela aussi doit être défini sur tous les répertoires parents tout au long de la chaîne (www, var). Et si je veux qu'Apache puisse lire à partir d'un fichier, le bit o + r doit être défini.

Ce n'est pas vrai, vous n'avez pas besoin de définir rwx pour 'autre'. Vous devez changer le propriétaire et/ou le groupe du dossier/fichier particulier que vous essayez de protéger. Par exemple.:

chown -R cwd:www-data /var/www/cwd.com
chmod 750 /var/www/cwd.com

Maintenant, seuls les membres du groupe www-data peut lire /var/www/cwd.com. Et vous seul (cwd) pouvez y écrire. Si vous souhaitez autoriser vos applications (via Apache) à écrire/modifier des fichiers dans ce répertoire, vous devez le modifier en 770.

Je pense que cela couvre tous vos problèmes, je ne vois aucune raison de changer l'utilisateur sous lequel Apache est exécuté.

10
Rob Wouters