10 votes

Insécurité courante de la configuration de PHP ?

Je travaille avec l'administration des systèmes dans une université et je viens de tomber sur quelque chose qui est probablement commun, mais qui m'a beaucoup choqué.

Tous les répertoires public_html et les zones web sont stockés sur afs, avec des permissions de lecture pour les serveurs web. Puisque les utilisateurs sont autorisés à avoir des scripts php dans leur public_html, cela signifie qu'ils peuvent accéder aux fichiers des autres à partir de php (et des fichiers web principaux !).

Non seulement cela rend toute protection par mot de passe .htaccess complètement inutile, mais cela permet également aux utilisateurs de lire les fichiers source php contenant les mots de passe des bases de données mysql et d'autres informations sensibles similaires. S'ils constatent que d'autres personnes disposent de répertoires dans lesquels les serveurs web ont un accès en écriture (par exemple, pour les journaux personnels ou pour enregistrer les données des formulaires soumis), 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"); 
?>

S'agit-il d'un problème courant ? Et comment le résolvez-vous généralement ?

UPDATE :

Merci pour votre 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 puisse penser est de définir "open_basedir" dans la configuration principale pour tous les répertoires "public_html", de lancer suphp et de n'autoriser que du php propre (pas de cgi scripts, d'exécution de commandes externes avec des backticks, etc).

Changer la politique de cette manière briserait beaucoup de choses, et pourrait bien inciter les utilisateurs à prendre leurs fourches et à nous poursuivre... J'en discuterai avec mes collègues et je ferai le point ici si nous prenons une décision sur la manière de modifier la configuration.

8voto

gimel Points 30150

On peut utiliser suphp qui exécute le script php script avec l'uid de son propriétaire.

http://www.suphp.org

4voto

voretaq7 Points 78924

Ma suggestion serait de limiter l'accès de PHP aux fichiers (par l'intermédiaire de open_basedir & directives similaires, sur une base individuelle) : Vous voulez que les utilisateurs puissent ouvrir/lire/écrire des fichiers sous leur webroot, et peut-être un niveau au-dessus (pour l'espace de stockage), mais pas un répertoire où ils stockeraient par exemple htpasswd des dossiers.

Une structure de répertoire comme :

/Client
    /auth
    /site
        /www_root
        /www_tmp

Cette mesure répondrait à cette exigence : open_basedir pourrait être pointé du doigt /Client/site en toute sécurité, et htpasswd Les fichiers stockés dans la base de données /Client/auth (avec .htaccess ou httpd.conf modifié pour pointer à la place sur l'emplacement approprié).
Cela empêche vos clients d'ouvrir les fichiers de quelqu'un d'autre, ET les utilisateurs malveillants ne peuvent pas lire les données contenues dans le fichier /Client/auth (ou tout autre élément de votre système, comme /etc/passwd :-)

Véase http://php.net/manual/en/ini.core.php pour plus de détails sur l'implémentation d'open_basedir et de per-vhost.

1voto

MagicAndi Points 10128

Non, ce n'est pas un problème courant car la plupart des hôtes partagés définissent une configuration open_basedir dans le fichier htaccess du répertoire public_html de chaque utilisateur (ou dans le serveur virtuel si chaque utilisateur a son propre serveur virtuel).

par exemple un fichier .htaccess :

# Assuming these are not set globally - its good practice to limit:
  php_flag magic_quotes_gpc off
  php_flag magic_quotes_runtime off
  php_flag register_globals off
  php_flag short_open_tag off
  php_value max_execution_time 60

# These set the user-specific paths
  php_value open_basedir /afs/example.com/home/smith:/usr/share/php/include
  php_value session.save_path /afs/example.com/home/smith/tmp
  php_value upload_tmp_dir /afs/example.com/home/smith/tmp

Mais assurez-vous de définir les bonnes permissions sur le fichier .htaccess pour éviter que l'utilisateur ne modifie l'open_basedir (s'il essaie de le remplacer dans subdir/.htaccess, cela ne devrait pas fonctionner - mais vous devriez probablement tester cela pour vous en assurer).

HTH

C.

1voto

Charles B Points 11

AFS ignore les simples permissions des utilisateurs Unix. suPHP exécute un setuid avant de lancer le programme php, mais cela ne donne pas au processus les jetons kerberos nécessaires pour accéder à AFS et être limité à ses permissions. 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 à savoir si quelqu'un d'autre l'avait fait).

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X