Installation d’un serveur web Apache2 et de PHP

Nous allons parcourir l’installation d’un serveur web Apache 2 pour un site internet fictif et un sous domaine de ce site. Vous installerez par la même occasion le nécessaire pour faire des sites web en PHP.

Installation

Nous allons commencer par installer Apache ainsi que les paquets permettant l’utilisation de PHP comme module.

apt install apache2 libapache2-mod-gnutls libapache2-mod-php php-mcrypt php-gd php-curl php-gmp php-mbstring php-curl php-xml

Si vous souhaitez faire de ce serveur un serveur de développement, vous devrez installer le paquet ci-dessus pour avoir des erreurs PHP plus parlantes.

apt install php-xdebug

Pour pouvoir connecter votre application PHP à une base de donnée MySQL, vous avez besoin d’un paquet supplémentaire.

apt install php-mysql

Si vous avez besoin de memcached, voici les paquets nécessaire à installer pour son utilisation.

apt install php-memcached memcached

Déplacer le dossier de travail

Par défaut, le dossier où sont stockée les site est /var/www qui généralement se trouve sur une partition avec peux d’espace. Nous allons donc arrêter Apache2 et déplacer le dossier vers /home/www/ pour ne pas être limité dans le futur.

#Arrêter Apache2
service apache2 stop
#Déplacer le dossier
mv /var/www/ /home/www/
#Créer un lien symbolique au cas où
ln -s /home/www/ /var/www
#Redémarrer Apache2
service apache2 start

Créer un dossier pour les fichiers de log

Dans le même esprit que d’avoir déplacé le dossier contenant les fichiers web, nous allons créer un dossier de log pour apache.

#Création du dossier principal
mkdir -p /home/log/
#Arrêter Apache2
service apache2 stop
#Déplacer le dossier
mv /var/log/apache2/ /home/log/
#Créer un lien symbolique au cas où
ln -s /home/log/apache2/ /var/log/apache2
#Redémarrer Apache2
service apache2 start

Configurations globale

Les fichiers de configuration de Apache2 sont accessible depuis /etc/apache2/ et nous allons effectuer quelques modifications pour augmenter la sécurité du serveur. Le b-a-ba de la sécurité informatique est de ne pas donner les versions des services qui tournent sur votre serveur pour ne pas faciliter l’utilisation d’exploit découvert pour cette version.

Masquer les informations de Apache2

Il faut éditer le fichier /etc/apache2/conf.d/security pour réduire au minimum les informations fournie sur la version du serveur aux gens.

ServerTokens Prod
ServerSignature Off
TraceEnable Off

Masquer la version de PHP

Il faut éditer le fichier /etc/php/7.0/apache2/php.ini et vérifier que la ligne ci-dessous a bien pour valeur Off.

expose_php = Off

Autoriser des modules de apache2

Pour autoriser les modules sur Apache2, il faut utiliser la commande suivante:

a2enmod nom_du_mod

Vous pouvez par exemple activer le module « rewrite » dont nous allons avoir besoin et qui permet l’URL rewriting avec un fichier htaccess.

a2enmod rewrite

Un autre module important est celui qui permet l’utilisation des certificats SSL sur son serveur.

a2enmod ssl
Note : pour désactiver un module, il faut utiliser simplement la commande a2dismod.

Une fois que vous avez fait toutes les modifications de la configuration d’Apache2, vous pouvez charger ces changements sans redémarrer le service.

service apache2 reload

Gestion des Virtual Host

Lors de l’installation du serveur web, un virtualhost par défaut existe de sort que si vous entrez l’adresse IP de votre machine dans un navigateur, vous verrez apparaître une page marqué « It’s Works! ».

L’objectif de cette partie va être de définir deux sites internet (donc deux virtualhost) :

  • domain.lo
  • www.domain.lo
  • files.domain.lo

Nous verrons également comment rediriger www.domain.lo vers domain.lo.

Note : si vous ne savez pas créer ces « faux » noms de domaine, allez consulter l’article expliquant la modification du fichier hosts de votre ordinateur.

Création de l’arborescence des dossiers

Pour commencer, nous allons créer nos dossiers pour les deux sites internet.

mkdir /home/www/domain.lo/
mkdir /home/www/domain.lo/public
mkdir /home/www/domain.lo/tmp
mkdir /home/www/files.domain.lo/
mkdir /home/www/files.domain.lo/public
mkdir /home/www/files.domain.lo/tmp

Maintenant ajoutons un fichier index.php basique dans les deux dossiers

echo "<?php echo $_SERVER['HTTP_HOST'];" > /home/www/domain.log/public/index.php
echo "<?php echo $_SERVER['HTTP_HOST'];" > /home/www/files.domain.log/public/index.php

Création des virtualhost dans Apache

domain.lo

Nous allons créer notre premier virtualhost nommé suivant la règle du plus général au plus précis. Cette manière d’écrire les noms de vos virtualhosts vous fera gagner du temps lorsque vous aurez des dizaines de sites à gérer.

Pour commencer il faut définir si nous sommes en HTTP on note alors « www » ou HTTPS et on note dans ce cas « ssl ». Ensuite vient le nom de domaine à l’envers c’est à dire du plus global (le tld) au plus spécifique (le sous domaine). Cela nous donne donc dans le cas de domain.lo :

nano /etc/apache2/sites-available/www.lo.domain.conf

Vous pouvez-copier coller les lignes ci-dessous que nous allons détailler.

<VirtualHost *:80>
 ServerAdmin webmaster@domain.lo
 ServerName domain.lo
 ServerAlias www.domain.lo
 
 php_admin_value open_basedir "/home/www/domain.lo/"
 php_admin_value upload_tmp_dir "/home/www/domain.lo/tmp/"
 
 RewriteEngine On
 RewriteBase /
 RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
 RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
 
 DocumentRoot /home/www/domain.lo/public/
 <Directory /home/www/domain.lo/public/>
  Options -Indexes +FollowSymLinks
  AllowOverride all
  Require all granted
 </Directory>
 
 ErrorLog /home/log/apache2/error.domain.lo.log
 CustomLog /home/log/apache2/access.domain.lo.log combined
</VirtualHost>

Pour commencer on défini le port d’écoute qui est le port 80 car nous sommes en HTTP et si nous avions été en HTTPS le port aurait été 443.

Vient ensuite trois informations sur le site web :

  • ServerAdmin : Adresse mail du responsable du site.
  • ServerName : Nom de domaine principal pour arriver sur ce site.
  • ServerAlias : La liste de tous les sous-domaines pouvant amener ici. Il faut séparer la liste par des virgules.

Les deux lignes concernant PHP permettent de limiter les accès au site à l’aide des instructions de gestion des fichiers. Ainsi si vous vous faites pirater un site internet et que l’attaquant installer un script pour parcourir les fichiers il sera bloqué dans le dossier /home/www/domain.lo et ne pourra pas aller plus haut dans l’arborescence.

Le bloque avec les commandes Rewrite permet de forcer la redirection de toutes les URL formé de www.domain.lo vers domain.lo en gardant les paramètres. Pour l’utilisateur cette redirection sera donc invisible et de notre côté cette règle nous permet d’assurer une seule URL par contenu ce qui est la règle de base en SEO.

La directive DocumentRoot sert à définir où sera situé le point d’entré du site et le bloc <Directory> sert à définir quelques options de comportement de Apache :

  • -Indexes : Interdit à Apache de lister les dossiers et fichiers si il n’y a pas de fichier index.php ou index.html dans un dossier ou sous dossier. Vous n’aurez donc pas de problème avec les fameuses pages « Indes of / ».
  • +FollowSymLinks : Informe Apache qu’il peut suivre les liens symbolique si il y en a dans les fichiers du site.
  • AllowOverride all : Cette directive permet d’utiliser les rewrite d’url dans les fichiers htaccess notament
  • Require all granted : Autoriser l’accès à ce site à tous. Nous verrons plus loin les différentes alternatives possible.

Enfin les deux dernières lignes indiquent où écrire les fichiers de log et dans notre cas nous allons les écrire avec les autres fichiers de log.

files.domain.lo

Nous allons maintenant nous occuper du second domaine à savoir : files.domain.lo

nano /etc/apache2/sites-available/www.lo.domain.files.conf

Voici le contenu de la configuration avec de légèrement différences pour que vous compreniez les subtilités d’un sous-domaine.

<VirtualHost *:80>
 ServerAdmin webmaster@domain.lo
 ServerName files.domain.lo
 
 php_admin_value open_basedir "/home/www/files.domain.lo/"
 php_admin_value upload_tmp_dir "/home/www/files.domain.lo/tmp/"
 
 DocumentRoot /home/www/files.domain.lo/public/
 <Directory /home/www/files.domain.lo/public/>
  Options -Indexes +FollowSymLinks
  AllowOverride all
  Require all granted
 </Directory>
 
 ErrorLog /home/log/apache2/error.files.domain.lo.log
 CustomLog /home/log/apache2/access.files.domain.lo.log combined
</VirtualHost>

Activer les virtualhost

Tout est bien configuré, maintenant il faut dire à Apache qu’il peut s’occuper de ces deux domaines à l’aide de la commande ci-dessous :

a2ensite www.lo.domain.conf
a2ensite www.lo.domain.files.conf
Pour désactiver un virtualhost, la commande à utiliser est a2dissite suivit du nom de fichier de configuration.

Pour terminer il faut recharger la configuration de Apache comme ceci.

service apache2 reload

En tapant les deux noms de domaines dans un navigateur, vous devriez arriver sur vos sites web. Dans notre exemple, il s’agit d’une page blanche avec le nom de domaine écrit.

Résoudre un problème

Si jamais vous avez des problèmes dans l’accès d’un des deux sites web, vous pouvez essayer de diagnostic ce qui ne va pas en consultant les fichiers de log à l’aide de la commande suivante :

tail -f /home/log/apache2/error.domain.lo.log

La commande tail -f vous permet d’afficher toutes les nouvelles lignes de façon dynamique sans avoir à relancer une commande. Pratique lorsqu’on surveille un serveur de mail ou dans notre cas un serveur web !

Conclusion

Nous avons vu le processus pour l’installation d’un site internet et d’un sous domaine de façon sécurisé sur un serveur web Apache2.

Si vous avez des questions rendez-vous dans les commentaires de cet article ou sur la documentation officielle de Apache.

Aller plus loin

Si vous voulez aller encore plus sur ce sujet, voici quelques techniques supplémentaire qui pourront vous être utile lors de la configuration de votre serveur pour certains cas particulier.

Gestion alternative des fichiers de log

Une autre gestion possible des fichiers de log serait de les stocker dans le dossier /home/www/domain.lo/log/ pour avoir vraiment tous les fichiers du site disponible au même endroit. Cette configuration demande toutefois de définir à logrotate les chemins de ces dossiers pour qu’il les compressent régulièrement.

Commencez par éditer le fichier de configuration de logrotate.

nano /etc/logrotate.d/apache2

Puis ajoutez les lignes ci-dessous qui vont permettre de faire ce travail pour tous les fichiers présent dans l’arborescence /home/www/*/log/*.log

/home/www/*/log/*.log {
 daily
 missingok
 rotate 14
 compress
 delaycompress
 notifempty
 create 640 root adm
 sharedscripts
 postrotate
 if /etc/init.d/apache2 status > /dev/null ; then \
 /etc/init.d/apache2 reload > /dev/null; \
 fi;
 endscript
 prerotate
 if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
 run-parts /etc/logrotate.d/httpd-prerotate; \
 fi; \
 endscript
}

Limiter l’accès à un site web

Dans la configuration précédente, nous avons donné accès au site sans restriction. Et si nous voulions limiter à une adresse ip ou à une liste d’utilisateurs ?

Limiter l’accès à une ou plusieurs adresse IP

Dans votre configuration, repérez la ligne ci-dessous :

Require all granted

Et remplacez par la ligne suivante en remplaçant par une adresse IP.

Require ip xxx.xxx.xxx.xxx

Il ne vous reste plus qu’à recharger la configuration d’apache et votre site sera accessible uniquement par les utilisateurs de cette adresse IP.

service apache2 reload

Limiter l’accès à l’aide d’un login mot de passe

Solution légèrement plus complexe à mettre en place, nous allons voir comment définir un nom d’utilisateur et un mot de passe pour notre site internet.

Commençons par créer le compte utilisateur nommé foxinou à l’aide de la commande suivante :

htpasswd -c /home/www/domain.lo/.htpasswd foxinou

Maintenant nous allons éditer la configuration du virtualhost en retirant la ligne ci-dessous.

Require all granted

A la place, ajoutez le bloc ci-dessous.

AuthType Basic
AuthName "Restricted Content"
AuthUserFile /home/www/domain.lo/.htpasswd
Require valid-user

Il ne vous reste plus qu’à recharger la configuration.

service apache2 reload

Si vous vous rendez sur votre site, une boite de dialogue va apparaître pour vous demander d’entrer un identifiant et un mot de passe.

Verrouiller la partie administration d’un WordPress

Admettons que votre site est un WordPress (ou autre) et que nous souhaitons limiter l’accès à l’interface d’administration. La configuration ci-dessous à ajouter dans votre Virtualhost permet de limiter l’accès au script qui vous connectera à une seule adresse IP. Ce contrôle similaire à iptables est géré par notre serveur Apache.

<FilesMatch "wp-login.php">
 Require ip xxx.xxx.xxx.xxx
</FilesMatch>

 

 

Laisser un commentaire