Apache2

De Wiki NCad
Aller à : navigation, rechercher

Module proxy

Cas d'usage

Utilisation du module proxy http pour rediriger des requêtes - de manière transparente - sur des ports différents du port standard 80.

Par exemple, nous disposons d'une adresse IP publique derrière laquelle le port HTTP 80 est redirigé sur notre serveur web 192.168.0.10. Nous avons un second serveur web qui a pour adresse 192.168.0.20 et dont nous souhaitons y accéder également par Internet depuis le port tcp HTTP 80.

Fonctionnement sans Proxy

Dans un cas sans proxy, pour avoir accès au second serveur web on doit ouvrir un port tcp sur le routeur puis le rediriger sur notre second serveur web. Par exemple, on ouvre le port TCP 8080 qui, avec une règle PAT, pointera sur le port TCP 80 du serveur web 192.168.0.20. Ainsi, depuis l'adresse http://<mon_ip_publique>:8080/ on atteindra le second serveur web.

ICON Light.png
L'inconvénient de cette méthode est le faite qu'il faut renseigner le port d'écoute du serveur web directement dans l'url.

Fonctionnement avec Proxy

Dans une configuration avec proxy on définit sur notre serveur web principal un hôte virtuel. Par exemple, monsite2.fr. On fait pointer cet hôte virtuel sur le serveur d'hébergement 192.168.0.20 au lieu de le faire pointer sur un dossier à la racine du serveur web hôte. On fait pointer le domaine monsite2.fr (ou un sous domaine) sur l'adresse IP publique du serveur web 192.168.0.10. Ainsi, depuis l'adresse http://monsite2.fr/ on atteindra le second serveur web.


ICON Light.png
Le serveur web primaire se charge de rediriger la requête vers le second serveur web. Pour l'internaute, ceci est totalement transparent. En revanche, en cas de panne du serveur web principal, le second serveur n'est plus accessible depuis Internet.

Activation du mode Proxy

  • Depuis le serveur web principal, on active les modules proxy et proxy_http.
ICON Terminal.png

sudo a2enmod proxy proxy_http

  • On redémarre le serveur web pour appliquer les changements.
ICON Terminal.png

sudo service apache restart

Configuration du Vhost

Nous allons créer l'hôte virtuel monsite2.fr sur le serveur web primaire. Ce dernier pointera sur notre second serveur web. Pour cela, on va créer le fichier /etc/apache2/sites-enable/monsite2.fr.conf avec les informations suivantes :

<VirtualHost *:80>
    ServerAdmin postmaster@domaine.tld
    ServerName monsite2.fr
    ProxyPass / http://192.168.0.20:80/
    ProxyPassReverse / http://192.168.0.20:8000/
    ProxyPreserveHost On
</VirtualHost>
Cas d'un serveur nécessitant une connexion chiffrée https
  • Si le serveur sur lequel est renvoyé la requête attend une connexion chiffrée via le protocole https, une erreur de type 500 apparaîtra. Il faut procéder à l'activation du moteur SSL pour le proxy http via SSLProxyEngine.
  • Pour cela, il faut ajouter dans la configuration du fichier /etc/apache2/sites-enable/monsite2.fr.conf l'élément suivant (avant la balise de fermeture </VirtualHost>) :
SSLProxyEngine On
  • Si vous utilisez un certificat auto-signé, l'erreur suivante apparaîtra lorsque vous tenterez d'accéder au site :
Reason: Error during SSL Handshake with remote server http_proxy
  • Il sera donc nécessaire de désactiver les contrôles de certificat opéré par le serveur web principal. Pour cela, après la ligne ProxyPreserveHost On il faut ajouter les éléments suivants :
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off
  • Rechargez la configuration du serveur Apache2 pour prendre en compte les modifications.
ICON Terminal.png

sudo service apache2 reload

Module ssl

Un certificat SSL permet de crypter les échanges entre le client et le serveur. Ce type de certificat est utilisé par le protocole http sécurisé (https) pour sécurisé les échanges dans le cadre d'échange de données sensibles (paiement en ligne, banque en ligne, sites gouvernementaux).

Les certificat SSL sont délivrés par une autorité dédiée et reconnu de tous. Cela est visible dans le navigateur web où le cas échéant, un message d'avertissement apparaît. Il est possible de générer ses propres certificats sans faire appel aux services d'une autorité. Dans ce cas, on dira que le certificat est auto-signé.

Certificat auto-signé

  • Le certificat est généré par l'utilisateur. Pour pouvoir générer ses propres certificats, il faut installer le paquet openssl.
ICON Terminal.png

sudo apt-get install openssl

  • Génération de la clé ssl. La clé peut avoir les longueurs de 512, 1024 ou 2048. Cependant, on préférera une longueur de 2048 qui est la plus complexe et donc la plus difficile à corrompre. L'algorithme de cryptage utilisé pour créer notre clé est le RSA (algorithme de cryptage asymétrique).
ICON Terminal.png

sudo openssl genrsa -out mon-site.fr.key 2048


ICON Information.png

Le dossier /etc/ssl/private est présent pour contenir vos clés et certificats privés.

  • Ensuite, il s'agit de créer le certificat qui sera récupéré par le navigateur web avec toutes les données relatives à l'autorité fournissant le certificat ainsi que la clé de partage :
ICON Terminal.png

sudo openssl req -new -key mon-site.fr.key -out mon-site.fr.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.



Country Name (2 letter code) [AU]:FR
State or Province Name (full name) [Some-State]:France
Locality Name (eg, city) []:Paris
Organization Name (eg, company) [Internet Widgits Pty Ltd]:NCad Wiki
Organizational Unit Name (eg, section) []:Article SSL
Common Name (e.g. server FQDN or YOUR name) []:www.mon-site.fr
Email Address []:tech@ncad.fr

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:Une jolie passe phrase pour tout crypter, décrypter !
An optional company name []:Article SSL

  • Enfin, on signe le certificat précédemment crée pour une durée de validité de 1 an (365 jours) :
ICON Terminal.png

sudo openssl x509 -req -days 365 -in mon-site.fr.csr -signkey mon-site.fr.key -out mon-site.fr.crt

Certificat fournie par une autorité

L'autorité fournit la clé privée qui a été cryptée par le mot de passe que vous avez saisie au préalable. Pour éviter que le serveur web ne demande à chaque redémarrage le mot de passe pour pouvoir lire la clé, on va la déchiffrer et la stocker sur le serveur.

  • Récupérez la clé depuis le site de l'autorité et sauvegardez là dans le fichier /etc/ssl/mon-site.fr.key.
  • Nous procédons au décryptage de la clé.
ICON Terminal.png

sudo openssl rsa -in mon-site.fr.key -out mon-site.fr.key

  • Il faut également récupérer le certificat qui a été généré par l'autorité et le sauvegarder dans le fichier /etc/ssl/mon-site.fr.crt.

Maintenant on peut configurer l'hôte virtuel Apache pour utiliser notre certificat et sa clé privée.

Utilisation dans Apache2

Le protocole https écoute sur le port 443. Il faudra donc modifier la configuration d'Apache2 pour répondre aux conditions suivantes :

  • Écouter sur le port 443.
  • Permettre des hôtes virtuels sur le port 443.

Configuration de /etc/apache2/ports.conf

  • Nous allons y ajouter les éléments suivants (activation du module pour les hôtes virtuels et écoute sur le port 443) :
NameVirtualHost *:443
Listen *:443
  • Et, à la fin, si ce dernier n'existe déjà pas :
<IfModule mod_gnutls.c>
   Listen 443
</IfModule>
  • On redémarre Apache2 pour prendre en compte ces modifications :
ICON Terminal.png

sudo service apache2 restart

Création du site web SSL

Dans notre exemple, nous créons le site www.mon-site.fr accessible via https://.

  • Création du fichier /etc/apache2/sites-available/mon-site.fr.conf.
ICON Terminal.png

sudo touch /etc/apache2/sites-available/mon-site.fr.conf

  • On édite le fichier et on y renseigne les lignes suivantes :
<VirtualHost *:443>
 DocumentRoot /var/www/mon-site.fr/www/
 ServerName www.mon-site.fr
 <Directory /var/www/mon-site.fr/www/>
  allow from all
  Options +Indexes
 </Directory>

 SSLEngine on
 SSLCertificateFile /etc/ssl/private/mon-site.fr.crt
 SSLCertificateKeyFile /etc/ssl/private/mon-site.fr.key

</VirtualHost>
  • On redémarre Apache2 pour prendre en compte ces modifications :
ICON Terminal.png

sudo service apache2 restart