Installation et configuration d’un serveur Web complet sous Debian 7

Publié le 7 janvier 2014 Par WOoOinux

Dans ce tutoriel, nous allons mettre en place un serveur Web (donc destiné à héberger des sites Internet) avec une configuration similaire à celle d’un hébergement mutualisé. Nous verrons donc comment installer LAMP ainsi qu’un serveur FTP. Attention ce tutoriel nécessite tout de même des connaissances de base en administration de système Linux.

LAMP c’est quoi ?

Un serveur LAMP est un serveur Web. Historiquement, l’acronyme « LAMP » fait référence aux quatre composantes d’un tel serveur Web :

  • Linux : le système d’exploitation constituant la base du système.
  • Apache : le serveur HTTP qui gère la communication avec le client.
  • MySQL : le système de gestion de base de données.
  • PHP : le langage de script utilisé pour générer les pages dynamiques.

1 – Installation d’Apache :

Dans un terminal (en tant qu’utilisateur root), entrez la commande suivante :

apt-get install apache2

Afin de tester le bon fonctionnement d’Apache, lancez votre navigateur et saisissez l’une des adresses ci-dessous :

http://localhost (si vous êtes en local, donc si votre ordinateur fait office de serveur)

http://adresse_ip_de_votre_serveur (si votre serveur est à distance)

Si vous voyez le message “It works !” votre serveur Apache fonctionne :

lamp00Par défaut, Apache affiche certaines informations sur les pages par défaut (comme la page d’erreur par exemple)

lamp01On constate ici que le système d’exploitation, la version d’Apache et de PHP sont clairement affichés ce qui n’est pas appréciable dans la mesure où ces informations peuvent servir à un éventuel pirate. Nous allons donc demander à Apache de ne plus afficher ces informations :

nano /etc/apache2/apache2.conf 

Ajoutez-y la ligne suivante en fin de fichier :

ServerSignature Off

Faites CTRL+O puis ENTRÉE pour sauvegarder

Faites CTRL+X puis ENTRÉE pour quitter

Et voilà :

lamp02

Nous allons maintenant activer des modules supplémentaires d’Apache :

Le module Rewrite : Permet d’activer la réécriture d’URl (URL rewriting) et donc d’obtenir des URL plus propres.

Le module Userdir : Permet de créer un utilisateur système par site. Chaque site sera donc attribué à un utilisateur et se situera dans le répertoire /home/utilisateur/public_html de ce dernier.

On active les modules

a2enmod rewrite
a2enmod userdir

On redémarre Apache pour que les modules soient pris en compte

/etc/init.d/apache2 restart

2 – Installation de PHP

Notre serveur Web fonctionne mais, pour le moment, n’est pas capable de gérer des pages dynamiques ce qui peut très vite nous limiter (notamment si vous souhaitez héberger des CMS comme Joomla, Drupal ou Wordpress par exemple).

On va donc installer PHP ainsi que tous les modules qui vont bien :

apt-get install libapache2-mod-php5 php5 php5-common php5-curl php5-dev php5-gd php5-idn php-pear php5-imagick php5-imap php5-json php5-mcrypt php5-memcache php5-mhash php5-ming php5-mysql php5-ps php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl

On va aussi installer PHP-APC (Alternatice PHP Cache) qui va permettre d’accélérer PHP en générant un cache du code PHP.

apt-get install php-apc

On redémarre Apache pour valider les nouveaux réglages :

/etc/init.d/apache2 restart

Configurons maintenant un peu notre serveur PHP :

nano /etc/php5/apache2/php.ini

Quelques valeurs à modifier :

# Taille maximum des fichiers à uploader (2MB par défaut)
upload_max_filesize = 10M

# Activation de l'UTF-8 par défaut
mbstring.language=UTF-8
mbstring.internal_encoding=UTF-8
mbstring.http_input=UTF-8
mbstring.http_output=UTF-8
mbstring.detect_order=auto

On redémarre Apache pour valider les nouveaux réglages :

/etc/init.d/apache2 restart

Nous allons maintenant tester le bon fonctionnement du serveur PHP. Pour cela, nous allons créer un utilisateur système et un mini site Internet.

adduser phpinfo

Attribuez lui un mot de passe puis validez.

Nous allons maintenant créer le répertoire public_html de l’utilisateur phpinfo dans lequel on placera le mini site

mkdir /home/phpinfo/public_html

Ensuite, créons le seul et unique fichier de notre mini site

nano /home/phpinfo/public_html/index.php

Insérez-y le code PHP suivant :

<?php phpinfo(); ?>

Faites CTRL+O puis ENTRÉE pour sauvegarder

Faites CTRL+X puis ENTRÉE pour quitter

Maintenant donnons les bonnes permissions au répertoire public_html de l’utilisateur phpinfo ainsi qu’au fichier qu’il contient :

chown phpinfo:phpinfo -R /home/phpinfo/public_html/
chmod -R g-w,o-w /home/phpinfo/public_html/

Dans votre navigateur, entrez l’une des adresse suivantes :

http://localhost/~phpinfo (si vous êtes en local)

http://adresss_ip_de_votre_serveur/~phpinfo (si votre serveur est à distance)

Vous devriez voir apparaître la configuration de votre serveur PHP

lamp03

Si vous ne voyez pas cette page et que votre navigateur vous propose de télécharger un fichier PHP :

Ouvrez le fichier /etc/apache2/mods-enabled/php5.conf

nano /etc/apache2/mods-enabled/php5.conf

Et commentez les lignes ci-dessous :

[..]
# <IfModule mod_userdir.c>
# <Directory /home/*/public_html>
# php_admin_value engine Off
# </Directory>
# </IfModule>
[..]

Faites CTRL+O puis ENTRÉE pour sauvegarder

Faites CTRL+X puis ENTRÉE pour quitter

Redémarrez le serveur Apache :

/etc/init.d/apache2 restart

Entrez à nouveau l’adresse dans votre navigateur. La page devrait s’afficher normalement à présent.

3 – Installation de la base de données MySQL

La plupart des sites Internet utilisent une base de données pour stocker toutes sortes d’informations comme les articles ou les comptes utilisateurs par exemple. Il va donc falloir installer MySQL qui est un Système de Gestion de Bases de Données (SGBD). Il existe d’autres SGBD comme PostgreSQL et Oracle mais nous nous arrêterons sur MySQL ici.

apt-get install mysql-server

Pendant l’installation, vous devrez choisir le mot de passe administrateur de MySQL. Choisissez un mot de passe suffisamment solide et notez-le bien !

lamp04

Côté configuration de MySQL on va simplement lui demander d’encoder les bases de données en UTF-8 par défaut.

Éditez le fichier /etc/mysql/my.cnf

nano /etc/mysql/my.cnf

Puis modifiez les valeurs suivantes

# Activer l'utf-8 par default sur le serveur [mysqld]
default-character-set = utf8
default-collation = utf8_general_ci
# Activer l'utf-8 par default sur le client [client]
default-character-set = utf8

Faites CTRL+O puis ENTRÉE pour sauvegarder

Faites CTRL+X puis ENTRÉE pour quitter

Redémarrez le serveur MySQL pour valider les modifications

/etc/init.d/mysql restart

Le serveur de base de données MySQL est prêt à l’emploi. Nous allons maintenant installer phpMyAdmin, une application qui va nous permettre de gérer nos bases de données via le navigateur et une interface graphique simple.

Installez phpMyAdmin

apt-get install phpmyadmin

Pendant l’installation, phpMyAdmin va vous demander le mot de passe de l’administrateur de la base de données MySQL (que je vous ai demandé de bien noter tout à l’heure). Ce mot de passe lui permettra de se connecter aux bases de données. Saisissez ce mot de passe puis faites OK

lamp05

phpMyAdmin va ensuite vous demander de choisir un mot de passe pour vous connecter à l’interface phpMyAdmin. Saisissez ce mot de passe (deux fois en tout) puis faites OK

lamp06

Voilà ! L’installation de phpMyAdmin est terminé ! Vous pouvez y accéder en saisissant l’une des adresses ci-dessous dans votre navigateur :

http://localhost/phpmyadmin (si vous êtes en local)

http://adresse_ip_de_votre_serveur/phpmyadmin (si votre serveur est à distance)

Si tout s’est bien passé vous devriez arriver à l’écran de connexion de phpMyAdmin

lamp07Connectez-vous avec le mot de passe que vous avez choisi lors de l’installation pour vous connecter à l’interface phpMyAdmin

lamp08

Et voila !

4 – Sécurisation du serveur Web avec Suexec et Suphp

Notre serveur est parfaitement fonctionnel cependant, le fait que chaque site soit la propriété d’un utilisateur peut poser des problèmes. Par exemple, vous hébergez un CMS (Joomla ou Wordpress). Tous les fichiers du site sont la propriété d’un utilisateur or lorsque vous utilisez ce site via votre navigateur c’est l’utilisateur Apache (www-data) qui exécute ces fichiers et donc n’aura pas les droits suffisants pour effectuer certaines actions comme les mises à jour du site où l’installation d’une extension par exemple. La solution de facilité serait de modifier les permissions des fichiers et dossiers du site pour qu’Apache ait le droit d’agir dessus mais cela entraînerait un défaut de sécurité. Pire encore, une autre solution de facilité serait de donner la propriété des fichiers et dossiers du site à l’utilisateur Apache (www-data) mais là aussi cela entraînerait un gros défaut de sécurité car si un hackeur arrive à prendre possession du site il se retrouve avec les droits d’Apache et peut causer des dégâts sur le serveur en plus du site. De plus, vous ne pourriez plus utiliser le site par FTP car vous n’auriez plus les droits adéquats.

Pour remédier à ces problèmes, nous allons installer Suexec et Suphp sur le serveur qui va permettre d’exécuter le site en tant que l’utilisateur propriétaire des fichiers et dossiers de ce dernier et non plus en tant qu’utilisateur Apache (www-data). Cette méthode à plusieurs avantages :

  • Sécuriser le serveur : Si un hackeur prend possession du site, il ne pourra pas causer de dégâts sur le serveur puisqu’il n’aura pas les droits Apache.
  • Régler les problèmes de permissions : Le masque de permissions appliqué lors du transfert des fichiers via FTP sera suffisant et l’utilisateur n’aura pas besoin de les rendre trop permissives. Il pourra effectuer les mises à jour de son site, installer une extension ou bien encore uploader une image via un gestionnaire de média sans aucun problème !

Commencez par installer Suexec :

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

Puis éditez le fichier /etc/apache2/suexec/www-data

nano /etc/apache2/suexec/www-data

Si vous avez suivi ce tutoriel depuis le début vous devez modifiez ce fichier comme ci-dessous :

# Répertoire qui contient tous les sites (/var par défaut)
/home
# Répertoire qui contient les fichiers d'un site (/www par défaut)
/public_html

Faites CTRL+O puis ENTRÉE pour sauvegarder

Faites CTRL+X puis ENTRÉE pour quitter

Installez ensuite Suphp

apt-get install libapache2-mod-suphp

Ensuite, éditez le fichier /etc/suphp/suphp.conf

nano /etc/suphp/suphp.conf

Et modifiez le comme ci-dessous :

# Le nom de l'utilisateur Apache
webserver_user=www-data
# Le répertoire qui contient les fichiers d'un site
docroot=/var/www:${HOME}/public_html
check_vhost_docroot=false
#Le masque de permission par défaut
umask=0022

À ce stade il faut maintenant désactiver le module PHP5 puis activer Suxec et Suphp pour qu’ils prennent le relais.

a2dismod php5
a2enmod suexec
a2enmod suphp

Redémarrez maintenant Apache pour valider le tout

/etc/init.d/apache2 restart

Comme Suphp remplace PHP5 il faut aussi penser à copier la configuration que nous avons fait un peu plus haut dans le fichier /etc/php5/apache2/php.ini vers celui de PHP5-CGI (utilisé par Suphp).

Réalisez d’abord une sauvegarde du fichier de configuration de PHP-CGI

mv /etc/php5/cgi/php.ini /etc/php5/cgi/php.ini-old

Puis copiez la configuration de PHP5 à la place de celle de PHP-CGI

cp /etc/php5/apache2/php.ini /etc/php5/cgi/php.ini

Redémarrez maintenant Apache pour valider les modifications

/etc/init.d/apache2 restart

Voilà ! Suexec et Suphp sont activés.

Pour spécifier le propriétaire d’un site à Apache il faudra ajouter la ligne ci-dessous dans le virtualhost de chaque site :

SuexecUserGroup mon_utilisateur mon_utilisateur

Le problème maintenant c’est que phpMyAdmin n’est plus accessible pour deux raisons :

  • Les fichiers de phpMyAdmin appartiennent à Root
  • Les fichiers de phpMyAdmin sont placés dans /usr/share et ce répertoire n’est pas pris en compte par défaut dans Suphp

Nous allons donc devoir remédier à ce problème en créant un utilisateur phpmyadmin à qui nous donnerons la propriété des fichiers de… phpMyAdmin !

Créez un utilisateur nommé phpmyadmin

adduser phpmyadmin

Créez-lui ensuite son répertoire qui accueillera les fichiers de phpMyAdmin

mkdir /home/phpmyadmin/public_html

Comme je l’expliquais un peu plus haut, Suphp ne prend pas en comptes les sites placés dans /usr/share pour des raisons de sécurité or, les fichiers de phpMyAdmin s’y trouvent donc nous allons copier ces fichiers dans le répertoire public_html de l’utilisateur phpmyadmin afin de résoudre ce problème.

Copiez les fichiers de phpMyAdmin dans le répertoire /home/phpmyadmin/public_html

cp -R /usr/share/phpmyadmin/* /home/phpmyadmin/public_html/

Donnez la propriété des fichiers copiés à l’utilisateur phpmyadmin

chown -R phpmyadmin:phpmyadmin /home/phpmyadmin/public_html/

Enfin, modifiez les permissions des fichiers copiés afin qu’elles correspondent au masque de permission autorisé par Suphp (si vous ne le faites pas Suphp vous renverra une “Internal server error” lorsque vous tenterez d’y accéder avec votre navigateur car il jugera les permissions trop… permissives et donc bloquera l’accès pour des raisons de sécurité)

chmod -R g-w,o-w /home/phpmyadmin/public_html/

Il ne nous reste plus qu’à modifier les virtualhosts afin qu’ils ne redirigent plus vers /usr/share/phpmyadmin mais vers /home/phpmyadmin/public_html. Il y a deux cas de figure possible en fonction de la manière dont vous accédez à votre phpmyadmin :

  • Cas 1 :  Vous y accédez en ajoutant /phpmyadmin après l’adresse IP de votre serveur ou bien un nom de domaine qui pointe vers votre serveur (http://adresse_ip_de_votre_serveur/phpmyadmin ou bien http://mondomaine.tld/phpmyadmin par exemple)
  • Cas 2 : Vous y accédez par le biais d’un sous-domaine qui pointe vers votre serveur (http://phpmyadmin.mondomaine.tld par exemple)

Voyons le cas 1 :

Effectuez une copie préventive de la configuration par défaut

cp /etc/phpmyadmin/apache.conf /etc/phpmyadmin/apache.conf.save

Éditez ensuite le fichier /etc/phpmyadmin/apache.conf

nano /etc/phpmyadmin/apache.conf

Et remplacez toutes les occurrences de /usr/share/phpmyadmin par /home/phpmyadmin/public_html

# phpMyAdmin default Apache configuration

Alias /phpmyadmin /home/phpmyadmin/public_html

<Directory /home/phpmyadmin/public_html>
        Options FollowSymLinks
        DirectoryIndex index.php

        <IfModule mod_php5.c>
                AddType application/x-httpd-php .php

                php_flag magic_quotes_gpc Off
                php_flag track_vars On
                php_flag register_globals Off
                php_value include_path .
        </IfModule>

</Directory>

# Authorize for setup
<Directory /home/phpmyadmin/public_html/setup>
    <IfModule mod_authn_file.c>
    AuthType Basic
    AuthName "phpMyAdmin Setup"
    AuthUserFile /etc/phpmyadmin/htpasswd.setup
    </IfModule>
    Require valid-user
</Directory>

# Disallow web access to directories that don't need it
<Directory /home/phpmyadmin/public_html/libraries>
    Order Deny,Allow
    Deny from All
</Directory>
<Directory /home/phpmyadmin/public_html/setup/lib>
    Order Deny,Allow
    Deny from All
</Directory>

Faites CTRL+O puis ENTRÉE pour sauvegarder

Faites CTRL+X puis ENTRÉE pour quitter

Voyons maintenant le cas 2 :

Créez le fichier virtualhost nommé phpmyadmin dans /etc/apache2/sites-available/

nano /etc/apache2/sites-available/phpmyadmin

Et copiez-y le contenu ci-dessous (prenez soin de modifier la ligne ServerName avec votre sous-domaine) :

<VirtualHost *:80>
        ServerAdmin webmaster@localhost

        ServerName phpmyadmin.mondomaine.tld

        DocumentRoot /home/phpmyadmin/public_html
        # On indique à Suexec qui est le propriétaire du site
        SuexecUserGroup phpmyadmin phpmyadmin
        <Directory /home/phpmyadmin/public_html>
        Options FollowSymLinks
        DirectoryIndex index.php

        <IfModule mod_php5.c>
                AddType application/x-httpd-php .php

                php_flag magic_quotes_gpc Off
                php_flag track_vars On
                php_flag register_globals Off
                php_value include_path .
        </IfModule>

        </Directory>

        # Authorize for setup
        <Directory /home/phpmyadmin/public_html/setup>
            <IfModule mod_authn_file.c>
            AuthType Basic
            AuthName "phpMyAdmin Setup"
            AuthUserFile /etc/phpmyadmin/htpasswd.setup
            </IfModule>
            Require valid-user
        </Directory>

        # Disallow web access to directories that don't need it
        <Directory /home/phpmyadmin/public_html/libraries>
            Order Deny,Allow
            Deny from All
        </Directory>
        <Directory /home/phpmyadmin/public_html/setup/lib>
            Order Deny,Allow
            Deny from All
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

         CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

Faites CTRL+O puis ENTRÉE pour sauvegarder

Faites CTRL+X puis ENTRÉE pour quitter

Le fichier virtualhost est crée mais n’est pas encore actif.

Activez le virtualhost phpmyadmin

a2ensite /etc/apache2/sites-available/phpmyadmin

Puis redémarrez Apache pour valider les modifications

/etc/init.d/apache2 restart

Et voilà ! Votre phpMyAdmin est de nouveau accessible !

5 – Installation d’un serveur FTP

Votre serveur peut maintenant faire fonctionner des sites Internet cependant, si vous souhaitez créer un hébergement pour un ami ou un client par exemple, il va falloir lui donner un moyen de transférer les fichiers de son site sur l’espace de stockage que vous lui aurez créé. On installera pour cela un serveur FTP (File Transfert Protocol) qui, comme son nom l’indique, permet de transférer des fichiers. Il existe plusieurs serveurs FTP sous Linux mais nous verrons VSFTPD car il est très efficace et simple à utiliser.

Commencez par installer le serveur FTP :

apt-get install vsftpd

Configurez ensuite le serveur FTP

nano /etc/vsftpd.conf

Et modifiez les lignes suivantes :

anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022 # Le local_umask doit être le même que celui de suphp !!!
ftpd_banner= Bienvenue sur mon serveur FTP
chroot_local_user=YES # On bloque les utilisateurs dans leur répertoire. Ainsi, ils ne pourront plus remonter l'arborescence du serveur.

Faites CTRL+O puis ENTRÉE pour sauvegarder

Faites CTRL+X puis ENTRÉE pour quitter

Redémarrez ensuite VSFTPD pour que la configuration soit prise en compte :

/etc/init.d/vsftpd restart

Et voilà, le serveur FTP est prêt à l’emploi !

Il se peut que vous obteniez le message d’erreur lors d’une tentative de connexion à l’un de vos comptes FTP :

500 OOPS: vsftpd: refusing to run with writable root inside chroot()

La solution à ce problème dépendra de votre version de VSFTPD (source : http://lindev.fr/index.php?post/2013/04/05/wheezy-vsftpd-et-chroot) :

Tout d’abord, entrez la commande ci-dessous pour connaître votre version de VSFTP :

vsftpd -v

Cas n°1 : La version de VSFTP est supérieure ou égale à 3.

Ouvrez le fichier vsftpd.conf :

nano /etc/vsftpd.conf

Puis ajoutez la ligne ci-dessous :

allow_writeable_chroot=YES

Faites CTRL+O puis ENTRÉE pour sauvegarder

Faites CTRL+X puis ENTRÉE pour quitter

Redémarrez ensuite VSFTPD pour que la configuration soit prise en compte :

/etc/init.d/vsftpd restart

Cas n°2 : La version de VSFTPD est strictement inférieure à 3.

Ajoutez un nouveau dépôt dans le fichier sources.list :

echo "deb http://ftp.fr.debian.org/debian/ sid main" >> /etc/apt/sources.list

Rechargez le liste des dépôts puis installez VFSTPD

apt-get update
apt-get install vsftpd/sid

Reconfigurez VFSTPD en suivant les instructions vues un peu plus haut puis redémarrez ensuite VSFTPD pour que la configuration soit prise en compte :

/etc/init.d/vsftpd restart

Et voilà ! Le problème est résolu !

Ce tutoriel est maintenant terminé ! Votre serveur Web est opérationnel !

Enjoy !