Un charmant développeur m’a fait remarqué que depuis le site web sur lequel nous travaillons, il avait accès à tous les fichiers du serveurs !
Pour cela, il suffisait de faire un fopen et de mettre une adresse absolue par exemple /etc/apache2/apache2.conf.
Voici donc la méthode pour empêcher la lecture des dossiers et fichiers du serveur et même comment limiter un site web à lire uniqpement dans son dossier.
Apache2 – Restreindre l’accès au dossier web
Nous allons éditer le fichier /etc/apache2/sites-available/default et mettre les informations comme ci-dessous.
<Directory /> Order Deny,Allow Deny from all Options None AllowOverride None </Directory> <Directory /home/web> Order Allow,Deny Allow from all </Directory>
Comme c’est marqué, nous allons interdire l’accès à tous fichiers n’étant pas dans le dossier /home/web. De plus il faudra autoriser l’accès pour tous les sites virtuels au cas par cas.
PHP – Limitation globale
Dans un premier temps, nous allons éditer le fichier /etc/php5/apache2/php.ini pour limiter d’une manière générale ce que php peut faire.
Cherchez dans le fichier la ligne avec le mot « open_basedir », dé-commentez la renseigné le dossier où se trouve tous vos fichiers PHP.
open_basedir = /home/web/
PHP – Limitation par site web
Maintenant que la limitation globale est faite, il faut limiter plus précisément un site web à son dossier. Cela évite lors d’hébergement mutualisé que le petit copain liste les fichiers là où il ne devrait pas…
<VirtualHost *:80> ServerName www.domain.tld ServerAdmin webmaster@domain.tld DocumentRoot /home/web/toto/www/ php_admin_value open_basedir "/home/web/toto/" </VirtualHost>
Avec cette nouvelle règle, les fichiers du site web ne pourront pas aller plus loin que le dossier marqué dans la configuration.
L’upload de fichier ne fonctionne plus !
Si vous avez un site (ou un blog comme celui-ci), avec vos nouvelles règles vous ne pourrez plus uploader de fichier !
Cela vient du fait qu’il utilisent sûrement la fonction copy hors le fichier étant sauvegardé lors de l’upload dans un dossier temporaire, il ne se trouve pas dans la limite de ce que nous avons autorisé.
Alors soit dans vos scripts vous utilisez la fonction « move_uploaded_file » qui permet d’outrepasser ce problème soit vous faites comme moi et vous modifier encore un peu votre configuration.
Pour résoudre ce problème, rendez-vous dans le fichier /etc/php5/apache2/php.ini.
Cherchez la ligne contenant le mot « upload_tmp_dir », dé-commentez la ligne puis mettez le même chemin que pour la variable open_basedir.
upload_tmp_dir = /home/web/tmp-upload/
phpmyadmin ?
De la même manière, phpmyadmin qui se trouve dans /usr/share/phpmyadmin ne doit plus fonctionner… Alors soit vous le déplacez soit vous éditez sont fichier virtualhost et vous ajouté la fameuse ligne ci-dessous comme expliqué précédemment.
php_admin_value open_basedir "/usr/share/phpmyadmin/"
Une fois toutes ces modifications faites, vous pouvez redémarrer apache ou simplement recharger la configuration : /etc/init.d/apache2 reload