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
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.
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 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>