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:
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:
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.
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.
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.
www-data
? Pour Apache/php fonctionnant en tant qu'utilisateur?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.
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é.