====== Configuration d'un serveur web avec Apache ======
===== Installation d'Apache =====
===== Création de site virtuels (vhosts) =====
Sur un serveur web, les sites virtuels ou virtual hosts (vhosts) permettent d'héberger sur la même machines différents sites web avec des noms de domaines et d'autres paramètres qui leur sont propres (certificats SSL, réécriture d'URL, répertoire cible, etc...).
Sous Apache, tous les vhosts sont stockés dans le répertoire ''/etc/apache2/sites-available'' sous forme de fichiers texte. La commande ''a2ensite'' permet d'activer ces vhosts et de les publier. Une fois un vhost activé, un lien symbolique vers le fichier correspondant est créé dans le répertoire ''/etc/apache2/sites-enabled''. La commande inverse permettant de désactiver un vhost (et donc de supprimer le lien symbolique dans ''sites-enabled'') est ''a2dissite''.
Rien n'empêche l'administrateur de créer directement ses vhosts dans le répertoire ''sites-enabled'', mais par convention, il est préférable de d'abord créer le vhost dans ''sites-available'', puis de l'activer afin qu'il apparaisse dans ''sites-enabled''.
Il est recommandé de supprimer le vhost par défaut nommé ''000-default.conf'' dans ''/etc/apache2/sites-available'' pour des raisons de sécurité.
Imaginons que l'on doivent publier un site web répondant à l'adresse **test.fr**.
Commencer par créer un nouveau vhost sur le serveur où est installé apache :
nano /etc/apache2/sites-available/test.fr.conf
:!: Ne pas oublier l'extension ''.conf'' du fichier.
Puis y insérer ces premières directives :
#rendre le site accessible par toutes les adresse IP sur serveur sur le port 80
ServerName test.fr #nom de domaine principal du site
ServerAlias www.test.fr #nom de domaine secondaire
ServerAdmin admin@test.fr #mail de contact administrateur
DocumentRoot /var/www/test #répertoire cible à publier
Et voilà ! Le site Web **test.fr** est configuré, il n'y a plus qu'a l'activer pour le rendre accessible. Mais ce n'est pas tout, on pourra pas la suite activer des fonctions supplémentaires, affiner les permissions d'accès au site, et bien d'autres choses.
__Explication :__
* '''' et '''' permettent de délimiter les lignes qui servent à la configuration du vhost dans le fichier. On remarquera le ''*:80'' qui indique au serveur l'adresse IP et le port affectés au site web. Dans cet exemple, le site est accessible depuis toutes les adresses IP du serveur avec le port TCP 80 (''*'' signifie toutes les adresses et ''80'' est le port de transport).
* ''ServerName'' définit le nom d'hôte du site, c'est-à-dire le nom de domaine qui sera utilisé pour le joindre.
* ''ServerAlias'' offre la possibilité de définir des noms de domaines supplémentaires au site, et peut être utilisé plusieurs fois dans le même fichier.
* ''ServerAdmin'' ne sert qu'a spécifier l'adresse e-mail de l'administrateur pour des raisons techniques et n'est pas important.
* ''DocumentRoot'' indique au serveur le répertoire cible du site web (où sont stockés les fichiers du site web). Par défaut, ils sont stockés dans ''/var/www/''.
==== Appliquer des réglages uniquement à un répertoire spécifique ====
Pour ce faire, on utilise les balises et entre lesquelles on insère les directives à appliquer au répertoire.
:!: Attention à bien remplacer ''/chemin/repertoire'' par le répertoire où l'on souhaite définir les réglages.
__Exemple :__
#Les réglages ci-dessous s'appliquent uniquement au répertoire /web/site1
Options All
AllowOverride all
Require all granted
Ensuite, l'activation du vhost se fait comme ceci :
a2ensite test.fr.conf
Sans oublier de relancer le service Apache2 afin d'appliquer les réglages :
service apache2 restart
Ou bien avec :
apache2ctl restart
Pour vérifier que les fichiers de configuration des vhosts soient fonctionnels, on peut exécuter la commande suivante, qui va lister les erreurs trouvées :
apache2ctl -t
Enfin pour désactiver le site virtuel, afin de modifier ses paramètres par exemple, faire :
a2dissite test.fr.conf
Sans oublier de relancer le service apache pour appliquer.
===== Sécurisation du serveur web =====
==== Interdire le listing des répertoires web, les liens symboliques et ignorer les fichiers .HTACCESS ====
Depuis le fichier de configuration du vhost, ajouter les directives suivantes soit entre des balises afin de cibler un répertoire particulier, soit directement entre les balises .
Pour bloquer le listing des répertoires :
Options -Indexes
Pour bloquer les liens symboliques (attention certaines application en ont besoin!) :
Options -FollowSymLinks
:!: Remarque : ces deux dernières directives peuvent être combinées sur une seule ligne :
Options -Indexes -FollowSymLinks
:!: Pour réactiver ces options, retirer le ''-'' devant.
Et pour ignorer les fichiers .HTACCESS :
AllowOverride None
Pour réactiver cette options, passer ''AllowOverride'' à ''All''.
==== Mettre en place SSL/TLS (HTTPS) ====
HTTPS est l'implémentation du protocole HTTP à l'intérieur d'un tunnel SSL/TLS. Il permet de chiffrer les données transmises entre le client et le serveur web via HTTP.
Pour mettre en place HTTPS pour un site, créer un vhost dédié à ce protocole pour ce site, en spécifiant bien un port d'écoute différent de celui utilisé par le vhost dédié à HTTP. Ne pas oublier de renseigner la directive ''servername'' avec le même nom que sur le certificat SSL/TLS (CN).
Voici les deux directives à ajouter afin d'indiquer au serveur le certificat et la clé qu'il doit utiliser :
SSLCertificateFile /etc/letsencrypt/live/cloud.mdekoninck.fr/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/cloud.mdekoninck.fr/privkey.pem
==== Activer l'en-tête HSTS ====
HSTS permet d'indiquer aux navigateurs clients se connectant à un site via HTTP qu'ils doivent impérativement s'y connecter en HTTPS. Ainsi, on force l'utilisation de SSL/TLS, par conséquent les navigateurs incompatibles avec HTTPS ne pourront pas afficher le site en question.
Une fois HTTPS activé, ajouter le code suivant dans la configurations des vhosts HTTP et HTTPS :
Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains"
Redémarrer le service apache, HSTS est activé !
==== Autoriser ou Interdire l'accès à un site à des hôtes ====
Le module ''mod_authz_core'' d'Apache permet de définir des permissions spécifiques à des hôtes précis ou des hôtes de certains réseaux précis.
Pour cela, il suffit d'ajouter l'une des 3 balises suivantes à l'intérieur d'une balise '''' :
* : Toutes les règles doivent concorder pour s'appliquer.
* : Au moins une des règles doivent concorder pour s'appliquer.
* : Aucune des règles ne doivent concorder pour s'appliquer.
A l'intérieur de ces balises, on utilisera les directives suivantes :
* Require ip xx.xx.xx.xx/xx : Permet d'autoriser un hôte précis ou un hôte sur un réseau précis (adresse IP simple ou adresse de réseau en notation CIDR).
* Require not ip xx.xx.xx.xx/xx : L'inverse de ci-dessus, on bloque l'hôte ou le réseau indiqué (adresse IP simple ou adresse de réseau en notation CIDR).
* Require all granted : Autoriser tout le monde à accéder au répertoire web.
* Require all denied : Interdire à tout le monde à accéder au répertoire web.
Pour interdire l'accès au site à un hôte ou à un hôte depuis un réseau spécifique, on utiliseras une règle pour tout autoriser, puis bloquera l'adresse IP ou l'hôte concerné (le site ici est stocké dans ''/var/www'') :
Require all granted #Autorise tous les hôtes à accéder au répertoire web
Require not ip 192.168.1.0/24 #Interdit aux hôtes du réseau mentionné d'accéder au répertoire web
Ici, tout le monde, à l'exception des hôtes du réseau 192.168.1.0/24 pourront accèder au répertoire web.
Cette fois-ci, on souhaite interdire l'accès à tout le monde sauf aux hôtes sur 2 réseaux différents :
#On utilise RequireAny car cette fois toutes les règles n'ont pas besoin de matcher pour s'appliquer.
Require all denied #Interdit à tout le monde à accéder au répertoire web
Require ip 192.168.1.0/24 #Autorise les hôtes du réseau mentionné à accéder au répertoire web
Require ip 10.50.0.0/16 #Autorise les hôtes du réseau mentionné à accéder au répertoire web
Seuls les hôtes sur les réseaux 192.168.1.0/24 ou 10.50.0.0/16 pourront auront accès à ce répertoire web.
:!: Pour que ces réglages soient pris en compte, ne pas oublier de redémarrer le service Apache2.
==== Redirection HTTP/HTTPS via Apache mod_proxy ====
Activer le module Proxy d'Apache :
a2enmod proxy proxy_http
Relancer le serveur pour initialiser les modules :
service apache2 restart
Créer un hôte virtuel (virtual hosts) dans ''/etc/apache2/sites-enabled/'' :
nano /etc/apache2/sites-enabled/test.conf
Y ajouter ces lignes :
ServerName nocterie.fr
ProxyPass /site1 http://nocterie.fr/site2
ProxyPassReverse /site1 http://nocterie.fr/site2
ProxyRequests Off
Redémarrer Apache et c'est gagné !
Les directives ''ProxyPass'' et ''ProxyPassReverse'' indiquent l'URL du proxy à rediriger vers l'URL de la page Web (le / au début des deux lignes correspond à la racine Web du proxy Apache)
L'option ProxyRequests permet d'activer le mode mandataire direct afin d'ajouter des restrictions d'accès ou des règles de redirection supplémentaires. Si cette fonction n'est pas utilisée, il est recommandé de la désactiver.
L'exemple ci-dessus redirige le site nocterie.fr/site1 vers le second site nocterie.fr/site2. Utile pour balader les utilisateurs sur le nouveau site !
:!: Pour les redirections HTTPS : Ajouter la ligne ''SSLProxyEngine On''
===== Sources =====
[[https://www.yapasdequoi.com/apache-varnish/149-desactiver-affichage-index-repertoires.html|Interdiction de lister les fichiers d'un répertoire web]]
[[http://example.com|Configuration du protocole HTTPS]]
[[https://www.justegeek.fr/activer-len-tete-hsts-sur-apache-pour-proteger-son-site-web/|Activation de l'en-tête HSTS]]
[[https://perhonen.fr/blog/2015/05/un-reverse-proxy-apache-avec-mod_proxy-1713|Redirection HTTP/HTTPS avec Mod_Proxy]]