Je viens de créer une boîte Ubuntu 11.10 puis apt-get install apache2 php5
d’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:
- Qui devrait fonctionner comme Apache?
- Dans quel groupe cet utilisateur devrait-il être?
- 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?
- 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 -al
liste du contenu, je vois /var
:
drwxr-xr-x 13 root root 4096 2012-02-04 20:47 var/
Si cd
j'entre var
et que 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
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.php
avec 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/envvars
fichier:
export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data
Si je le 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 en cours d'exécution? Il semble que le premier processus soit root
peut-être le même, peut-être tiré du /etc/init.d/apache
script lorsque le système a démarré et des autres processus www-data
créés à partir du premier. Est-ce exact?
Ensuite, si je saisis, groups www-data
je vois www-data : www-data
- cela a donc l'air d'être uniquement dans le www-data
groupe. 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-data
et que je veux qu’Apache puisse lire un répertoire, le x
bit 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+r
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 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, suphp
et phpsuexec
qui 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 chown
pour rendre le groupe de répertoires wordpress appartenir www-data
et 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
- Qui devrait fonctionner comme Apache?
- Dans quel groupe cet utilisateur devrait-il être?
- 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?
- 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:
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.
la source
Ce n'est pas vrai, vous ne devez pas définir
rwx
pour «autre». Vous devez changer le propriétaire et / ou le groupe du dossier / fichier que vous essayez de protéger. Par exemple:Désormais, seuls les membres du groupe
www-data
peuvent 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.
la source