Je travaille avec l'administration des systèmes dans une université et je suis juste tombé sur quelque chose qui est probablement commun, mais qui a été un choc pour moi.
Tous les répertoires public_html et les zones Web sont stockés sur afs, avec des autorisations de lecture pour les serveurs Web. Étant donné que les utilisateurs sont autorisés à avoir des scripts php dans leur public_html, cela signifie qu'ils peuvent accéder aux fichiers des autres depuis php (et les principaux fichiers Web!).
Non seulement cela rend toute protection par mot de passe .htaccess complètement inutile, mais cela permet également aux utilisateurs de lire des fichiers source php contenant des mots de passe de base de données mysql et des informations sensibles similaires. Ou s'ils découvrent que d'autres personnes ont des répertoires où les serveurs Web ont un accès en écriture (par exemple pour les journaux personnels ou pour enregistrer les données de formulaire soumises), ils peuvent stocker des fichiers dans ces comptes.
Un exemple simple:
<?
header("Content-type: text/plain");
print file_get_contents("/afs/example.com/home/smith/public_html/.htpasswd");
?>
Est-ce un problème courant? Et comment le résolvez-vous généralement?
METTRE À JOUR:
Merci pour la contribution. Malheureusement, il semble qu'il n'y ait pas de réponse simple. Dans un grand environnement partagé comme celui-ci, les utilisateurs ne devraient probablement pas avoir autant de choix. La meilleure approche à laquelle je peux penser est de définir "open_basedir" dans la configuration principale pour tous les répertoires "public_html", d'exécuter suphp et de n'autoriser que le php propre (pas de scripts cgi, exécution de commandes externes avec des astuces, etc.).
Changer la politique comme ça casserait beaucoup de choses cependant, et inciterait très probablement les utilisateurs à saisir leur fourche et à nous poursuivre ... J'en discuterai avec mes collègues et je mettrai à jour ici si nous décidons comment changer la configuration.
la source
open_basedir
solution ci-dessous sur les systèmes d'hébergement partagé de production, mais nous avons divisé tout le monde en leur propre vhost - Je ne sais pas si cela fonctionne pour les répertoires uniques ...Réponses:
On peut utiliser suphp qui exécute le script php avec l'uid de son propriétaire.
http://www.suphp.org
la source
check_vhost_docroot
, mais AFAIK qui ne s'applique qu'au script en cours d'exécution (? Je pourrais me tromper à ce sujet)Ma suggestion serait de limiter l'accès de PHP aux fichiers (via
open_basedir
des directives similaires, sur une base par hôte): vous voulez que les utilisateurs puissent ouvrir / lire / écrire des fichiers sous leur racine Web, et peut-être un niveau au-dessus (pour zéro espace), mais pas un répertoire où ils seraient par exemple stocker deshtpasswd
fichiers.Une structure de répertoires comme:
Répondrait à cette exigence:
open_basedir
pourrait être pointé en/Client/site
toute sécurité et leshtpasswd
fichiers stockés dans/Client/auth
(avec des.htaccess
fichiers ouhttpd.conf
modifiés pour pointer à l'emplacement approprié à la place).Cela empêche vos clients d'ouvrir les fichiers de quelqu'un d'autre ET, comme avantage, les utilisateurs malveillants ne peuvent pas lire le contenu
/Client/auth
(ou quoi que ce soit d'autre sur votre système, comme/etc/passwd
:-)Voir http://php.net/manual/en/ini.core.php pour plus de détails sur l'implémentation open_basedir et per-vhost.
la source
suphp
comme indiqué par cstamas est également une très bonne idée dans un environnement d'hébergement partagé - Il y a un peu de temps pour le configurer, mais je dirais que le gain de sécurité en vaut la peine. À moins de sandboxer tous vos sites PHP dans quelque chose comme une prison FreeBSD ou une machine virtuelle dédiée qui est l'une des plus grandes victoires en matière de sécurité.open_basedir
intérieur d'une directive <Directory>, mais je pense que cela devrait être permis ("essayez-le et voyez" - le pire qu'il puisse faire ne fonctionne pas :)Non, ce n'est pas un problème commun car la plupart des hôtes partagés définiraient une configuration open_basedir dans le fichier htaccess du répertoire public_html de chaque utilisateur (ou dans le vhost si chaque utilisateur a son propre vhost).
par exemple du fichier .htaccess:
Mais assurez-vous de définir les bonnes autorisations sur le fichier .htaccess pour empêcher l'utilisateur de modifier l'open_basedir (s'il essaie de le remplacer dans subdir / .htaccess, cela ne devrait pas fonctionner - mais vous devriez probablement le tester pour vous en assurer) .
HTH
C.
la source
AFS ignore les autorisations utilisateur Unix simples. suPHP exécute un setuid avant d'exécuter le programme php, mais cela ne donne pas au processus les jetons Kerberos nécessaires pour accéder à AFS et être limité à ses autorisations. suPHP devrait être modifié d'une manière ou d'une autre pour obtenir ces jetons avant de pouvoir se présenter au système AFS en tant qu'utilisateur. Pour autant que je sache, cela n'a pas été fait. (En fait, j'ai trouvé cette question en cherchant à voir si quelqu'un d'autre l'avait fait.)
la source