Sous quel utilisateur Apache et PHP doivent-ils fonctionner? Quelles autorisations doivent avoir les fichiers / var / www?


41

Je viens de créer une boîte Ubuntu 11.10 puis apt-get install apache2 php5d’installer apache2 et PHP 5 sur la boîte. Maintenant, il fonctionne comme un "serveur Web" et il charge le "Ça marche!" page. Maintenant, j'essaie de renforcer la sécurité et j'ai les questions suivantes sur les serveurs Web Linux:

  1. Qui devrait fonctionner comme Apache?
  2. Dans quel groupe cet utilisateur devrait-il être?
  3. Quel (s) paquet (s) peut faire fonctionner PHP (et Apache?) En tant que propriétaire des fichiers? (comme sur les hôtes 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 les dossiers servis sur le Web avec Apache exécuté en tant que www-data? Pour Apache / PHP fonctionnant en tant qu'utilisateur?

J'ai effectué les opérations suivantes lors de l'examen de la configuration par défaut:

Structure de fichier

Lorsque je cd /fais une ls -alliste du contenu, je vois /var:

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

Si cdj'entre varet que ls -alje vois:

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

Enfin, à l'intérieur /var/wwwje 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

Ce que je retiens surtout, c’est que jusqu’à présent, tous ces fichiers appartiennent à root:root, ils ont des permissions de 644 et les répertoires ont des permissions de 755.

Autorisations d'Apache

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

<?php echo shell_exec('whoami');

et chargez ce fichier dans un navigateur www-data, me dit-il , qui est le même que dans le /etc/apache2/envvarsfichier:

export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data

Si je le fais, ps aux | grep -i apacheje 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 en cours d'exécution? Il semble que le premier processus soit rootpeut-être le même, peut-être tiré du /etc/init.d/apachescript lorsque le système a démarré et des autres processus www-datacréés à partir du premier. Est-ce exact?

Ensuite, si je saisis, groups www-dataje vois www-data : www-data- cela a donc l'air d'être uniquement dans le www-datagroupe. Je suppose que c'est aussi une pratique courante.

Hébergement partagé et sécurité

Donc, si je comprends bien les choses, si Apache est exécuté en tant que www-dataet que je veux qu’Apache puisse lire un répertoire, le xbit doit être défini pour le monde (autre) group ( o+x), ainsi que pour tous les parents. répertoires tout au long de la chaîne ( www, var). Et si je veux qu'apache soit capable de lire un fichier, le o+rbit 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 machine Linux: Tous les fichiers Web doivent être lisibles par tout le monde, et donc ils sont également accessibles par d'autres applications et d'autres utilisateurs du système. Si une application installée sur le système présentait une vulnérabilité de sécurité autorisant une saisie 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 lisibles par tout le monde. De même, si la boîte comptait plusieurs utilisateurs et si un utilisateur connaissait le chemin d'accès aux fichiers Web d'un autre utilisateur, il pourrait alors lire le contenu du fichier (et voir des informations sensibles telles que les chaînes de connexion à la base de données, etc.).

Je l' ai entendu parler de deux paquets, suphpet phpsuexecqui traitent les dossiers permettant des utilisateurs à être servi « comme les » sur un système partagé. L’une des particularités de ce logiciel est qu’il permet aux applications Web (telles que Wordpress) de créer et de modifier des fichiers, ce qui est très utile pour l’ajout de thèmes, de plug-ins et la mise à niveau du logiciel. Bien sûr, il est probablement plus sûr de faire ces choses manuellement, mais peut-on faire un compromis avec l’un des paquets mentionnés ci-dessus? Ou en utilisant éventuellement chownpour rendre le groupe de répertoires wordpress appartenir www-dataet définir le bit collant sur le groupe ( g+s)?

Je les ai uniquement utilisées en tant qu'utilisateur final d'une société d'hébergement Web. Je ne connais donc pas les tenants et les aboutissants de ces solutions, et même s'il est raisonnable de les installer sur un petit système ou s'il existe un autre système. des mesures de sécurité que je devrais utiliser à la place, mais je pensais les mentionner ici car elles semblaient être un moyen possible de répondre à certaines de mes préoccupations.

Retour aux questions

  1. Qui devrait fonctionner comme Apache?
  2. Dans quel groupe cet utilisateur devrait-il être?
  3. Quel (s) paquet (s) peut faire fonctionner PHP (et Apache?) En tant que propriétaire des fichiers? (comme sur les hôtes 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 les dossiers servis sur le Web avec Apache exécuté en tant que www-data? Pour Apache / PHP fonctionnant en tant qu'utilisateur?

Réponses:


17
  1. pas root
  2. pas root
  3. SuEXEC
  4. Dépend. 644 pour les fichiers et 755 pour les dossiers sont des valeurs sûres par défaut.

Ne changez pas la propriété de quoi que ce soit en www-data sauf si vous voulez que php puisse éditer le contenu de ce fichier / dossier

Indépendamment de tout ce que vous faites: les dossiers ont besoin d’autorisations de lecture et d’exécution pour permettre à l’utilisateur de rechercher des fichiers; les fichiers ont besoin d'autorisations de lecture pour que l'utilisateur puisse les lire. Si vous rencontrez des erreurs d'autorisation lors de la modification, vous avez réussi à supprimer ces autorisations fondamentalement requises.

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

Si vous laissez les fichiers vous appartenant: si vous disposez d'autorisations de fichier de 644 (fichiers), cela signifie que vous seul pouvez éditer les fichiers du site Web - www-data n'est pas vous - et qu'il ne peut donc pas éditer les fichiers.

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

Limitez au minimum les chemins que vous autorisez à écrire à apache / php - s’il existe un répertoire tmp auquel l’application doit écrire - permettez-lui d’écrire dans ce dossier uniquement - et, dans la mesure du possible, assurez-vous qu’il se trouve en dehors du répertoire. racine du document ou prendre des mesures pour que ce chemin d'accès en écriture ne soit pas accessible sur le Web.

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


10

Donc, si je comprends bien les choses, si Apache est exécuté 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 (autre) monde (o + x), et cela également. 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, alors le bit o + r doit être activé.

Ce n'est pas vrai, vous ne devez pas définir rwxpour «autre». Vous devez changer le propriétaire et / ou le groupe du dossier / fichier que vous essayez de protéger. Par exemple:

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

Désormais, seuls les membres du groupe www-datapeuvent 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 également le modifier à 770.

Je pense que cela couvre tous vos problèmes, je ne vois aucune raison de changer l’utilisateur sous lequel fonctionne Apache.


2
Merci. Ce n'est pas une mauvaise solution, mais si un utilisateur connaît le chemin d'accès au fichier d'un autre utilisateur, il pourrait écrire un script qui lirait le contenu du fichier, puis le charger dans le navigateur Web, ce qui l'exécuterait en tant qu'apache - lecture efficace le fichier du répertoire de l'autre utilisateur. Cela a-t-il du sens? Ainsi, même si vous définissez les autorisations de dossier sur 750, il existe toujours une vulnérabilité potentielle en matière de sécurité.
cwd

@cwd avez-vous fini par comprendre cela?
Ricky Boyce

@cwd C'était la question exacte que j'avais. C'est pourquoi j'ai demandé ceci: serverfault.com/questions/807723/…
Nandakumar Edamana
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.