Sécuriser votre serveur Web avec 2 modules apache : suEXEC et suPHP

6 Commentaires

Dans ce tuto vidéo (sommaire ici), nous allons voir comment installer et configurer 2 extensions apache, suEXEC et suPHP, qui permettent d’augmenter la sécurité de votre serveur. Par défaut, lorsque apache travaille sur un fichier ou un script php, il le fait en tant qu’utilisateur www-data (l’utilisateur apache du système, qui possède des droits particuliers). Le problème, c’est que si un de ces scripts est mal conçu et possède une faille de sécurité, un pirate peut avoir accès à cet utilisateur système qui possède des droits importants.

Les extensions suEXEC et suPHP permettent de remédier à ce problème. En effet, avec ces extensions le serveur web travaille sur ces fichiers avec l’utilisateur propriétaire des fichiers (qui possèdent des droits classiques). Si vous avez suivi depuis le début de mes vidéos sur le serveur dédié, vous devriez déjà avoir une configuration similaire, c’est-à-dire : un site = un utilisateur. C’est maintenant que ça prend tout sont sens, car ça va nous simplifier grandement les choses.

En plus d’améliorer la sécurité, ces 2 modules permettent de régler certains problèmes avec vos scripts et CMS comme WordPress. En effet, sur WordPress pour mettre à jour son blog ou ajouter des extensions, on peut utiliser un script qui le fait de manière automatique. Le problème, c’est que ce script doit pouvoir créer des fichiers sur votre serveur, ce qui n’est pas possible si l’utilisateur qui exécute le script est www-data (puisque le dossier appartient à l’utilisateur qui possède le site).


(Pour la version Dailymotion, cliquez sur ce lien)

Vous pouvez télécharger la vidéo en cliquant sur l’image ci-dessous.

Installation de suEXEC

Le premier module à installer est suEXEC, c’est lui qui permet de lancer les scripts de types CGI avec l’utilisateur qui possède le script. L’installation se fait en 2 temps :

apt-get install apache2-suexec
apt-get install apache2-suexec-custom

En ce qui concerne la configuration c’est très simple, un fichier à éditer ici /etc/apache2/suexec/www-data. Sur la première ligne vous placer le chemin du dossier qui contient tout vos sites web, dans notre cas « /home ». Sur la seconde ligne, vous placer le dossier qui contient tout les fichiers du site web, par défaut c’est « public_html » mais comme nous avons modifié /etc/apache2/mods-available/userdir.conf, c’est « www ».

Installation de suPHP

On doit ensuite installer suPHP qui permet d’exécuter les scripts php avec l’utilisateur propriétaire. Il est dépendant de suEXEC, vous devez donc installer et configurer suEXEC d’abord.

apt-get install libapache2-mod-suphp

Au niveau de la configuration, encore une fois c’est très simple, il suffit d’éditeur /etc/suphp/suphp.conf.

# Le nom de l'user qui lance apache
webserver_user=www-data
# Le chemin de vos scripts
docroot=/var/www:${HOME}/www
# Des vérif qui pose des soucis par la suite
# notamment lorsqu'on essaye d'accéder
# à un site avec site.com/~username
check_vhost_docroot=false

Modification des virtualhosts

On doit modifier tout les fichiers virtualhosts de nos différents sites pour préciser à suPHP avec quel utilisateur et groupe il doit exécuter les scripts. C’est à cette étape que ça devient compliqué si vous n’avez pas suivi mes conseils de « 1 site = 1 utilisateur ».

Avant de faire les modif, vous devez désactiver le module php5 d’apache pour que suPHP prenne la relève. Pour cela un petit a2dismod php5 fait l’affaire.

Vous devez donc ajouter sur chaque fichier virtualhost de vos sites (sauf default), cette ligne :

# Nom d'utilisateur, nom du groupe, généralement identique
SuexecUserGroup tutorielvideo tutorielvideo

Problèmes avec les htaccess && erreur 500

Lorsqu’on installe suEXEC et suPHP on rencontre plusieurs problèmes. Comme on est obligé de désactiver php5 pour que suPHP prenne le relais, on doit refaire tout nos fichiers .htaccess. En effet, toute les directives spécifiques à php (donc celle qui commence par php_flag ou php_value) feront planter le .htaccess et provequera une erreur 500. Ça vient tout simplement du fait qu’apache ne sait pas quoi faire, pour lui php n’est pas installé, donc il ne connaît pas ces directives.

La solution est de créer un fichier php.ini à la racine de votre site avec toutes les configurations pour php et de placer ce bout de code dans votre fichier .htaccess en prenant garde de bien noter le chemin absolue vers la racine de votre site.

<IfModule mod_suphp.c>
suPHP_ConfigPath /home/roundcube/www
</IfModule>

Et voici, par exemple, la ligne qu’il faut ajouter dans le fichier php.ini pour Roundcube : suhosin.session.encrypt=Off. La syntaxe est légèrement différentes des .htaccess, donc si vous avez du mal à comprendre, je vous renvoie sur cette page de la documentation PHP qui explique toutes les directives que l’on peut mettre dans un fichier php.ini.

Voilà, ce tutoriel est terminé, n’hésitez pas à faire vos propres recherches pour augmenter la sécurité de votre serveur. Vous pouvez par exemple creuser du côté du module apache pour la sécurité (mod_security), ou bien Chrooter tous les répertoires home des utilisateurs, installer l’application « snort », désactiver les services inutiles, surveiller les logs régulièrement et etc… .

Si vous avez des questions, n’hésitez pas à laisser un commentaire. Si vous avez apprécié le tutoriel, vous pouvez le partager sur Twitter/Facebook et rejoindre la page facebook du blog.

Publié le 31 août 2011 par Madrzejewski Alexis dans Serveur Dédié

Vous avez aimé ce billet ?

Inscrivez-vous au Flux RSS du blog, suivez-moi sur Twitter ou partager simplement cet article avec vos amis sur Twitter ou Facebook

Inscrivez-vous à la newsletter

Inscrivez-vous à la newsletter en précisant votre prénom et votre adresse email pour recevoir les dernières mises à jour du blog et des tutoriels exclusif par email (En savoir plus)

Je vous recommande aussi la lecture des sujets suivants :

6 commentaires

Ajouter un commentaire

  1. Pingback: Installation et configuration d’un serveur dédié | Tutoriels-Video

  2. Paul-Olivier

    Encore une fois un super tutoriel :)
    Moi j’ai juste une question car je trouve ca bizarre venant de ta part. Tu sécurise tout. Mais pas le /phpmyadmin qui est quand même il des plus grosse faille. et une des plus connus accéssible a tout le monde :/

    Comment regler ce probleme? est ce que l’on modifie juste le nom du fichier ? pour le trouvé plus difficilement ? ou d’autre solution ?

    Répondre
    • Sur mon serveur dédié qui va héberger le site, j’ai ajouter un .htaccess avec mot de passe. L’avantage c’est que ça génère des logs dés qu’un utilisateur tente de trouver le mot de passe à l’arrache et fail2ban le bannit au bout de 3-4 essais.
      E puis, il y a à peine une semaine, je ne connaissais pas cette faille (honte sur moi, mais moi aussi je débute :p).

      Répondre
  3. Memphis007

    Bonjour,

    Super tutoriel, moi qui débute aussi ça m’a vraiment aidé pour mon projet. Une petite précision cependant pour phpmyadmin, en ce qui me concerne après l’installation de suphp plus accès à phpmyadmin (puisqu’il appartient à l’utilisateur root) J’ai donc réactivé le module php5 d’apache en ayant pris soin de d’encadrer le ficher /etc/apache2/mods-available/php5.conf comme ceci :

    //Ancien contenu du fichier

    En ayant pris soin de commenter les autres directives directory du fichier qui ne me seront plus utile de toute façon. Depuis tout roule ! Je me suis basé sur le tuto suivant : http://doc.ubuntu-fr.org/suphp

    Une méthode intéressante pour sécuriser phpmyadmin et de n’autoriser que les connections à celui via un tunnel ssh avec putty, voir : http://solutions-architecture.com/node/21

    Petite précision par rapport à ce dernier tutoriel, chez moi l’adresse 127.0.0.1 ne fonctionnait pas, j’ai remplacé par localhost.

    Répondre
  4. Frafro

    Bonjour,
    Super tutoriel, comme d’habitude!!!
    J’ai eu, évidemment, le même problème pour accéder à PhpMyAdmin et j’ai trouvé la solution pour moi sur Internet….http://www.tek-tips.com/viewthread.cfm?qid=1656077.
    C’est simple il faut donner des droits à l’utilisateur « phpmyadmin » (suexec) dans le dossier /var/lib/phpmyadmin
    Avant:
    drwxr-xr-x 2 root root 4096 13 janv. 23:37 .
    drwxr-xr-x 46 root root 4096 18 janv. 19:42 ..
    -rw-r—– 1 root www-data 60 13 janv. 23:37 blowfish_secret.inc.php
    -rw-r—– 1 root www-data 0 13 janv. 23:37 config.inc.php
    Après:
    drwxr-xr-x 2 root root 4096 13 janv. 23:37 .
    drwxr-xr-x 46 root root 4096 18 janv. 19:42 ..
    -rw-r—– 1 root phpmyadmin 60 13 janv. 23:37 blowfish_secret.inc.php
    -rw-r—– 1 root phpmyadmin 0 13 janv. 23:37 config.inc.php

    J’espère que cela fonctionnera pour tous les autres….

    Répondre
  5. Manu86

    Bonjour,
    Tout d’abord un grand merci pour ce super site !
    J’aimerai bien mettre en place cette protection mais j’ai des sites qui ne possèdent pas de nom de domaine. Ils sont donc accessibles seulement par IP_SERVEUR/~NOM_SITE.
    Dans ce cas comment fait-on pour appliquer ce tutoriel ? Car on ne peut pas faire de virtualhost pour y ajouter le SuexecUserGroup. J’ai tenté un ServerName IP_SERVEUR/~NOM_SITE mais ça ne fonctionne pas.
    Si vous avez une idée, d’avance merci !

    Répondre

Ajouter un commentaire


Ici les commentaires sont en DoFollow, profitez-en mais en abusez pas !
Veuillez ne pas poster de code (php, html ou autre) car il sera bloqué par le site.
Les commentaires ne sont pas immédiatement validés.
Merci de faire une recherche sur Google avant de poser une question.