Apache : reverse proxy https

Je suis intervenu récemment chez un client dont le certificat https expirait dans les quinze jours, mais dont le serveur webmail est un Lotus Domino, dans une version qui n'est pas compatible avec des certiifcats encodés en autre chose que SHA1.

Leur prestataire ne pouvant générer que des certiicats en SHA256 leur a proposé 2 options  :

  • passer sur une version plus récente de la messagerie (en moins de 2 semaines, c'est un peu risqué...)
  • mettre en place un reverse proxy en rupture de flux, qui portera le nouveau certificat.

Cet article décrit les actions réalisées pour la mise en place de cette architecture reverse proxy, sur un Linux CentOS / RHEL 7

Le serveur CentOS sera positionné dans la DMZ, isolé par le firewall.

Image

Installation du serveur Apache

L'installation du serveur Apache se fait via les commandes yum. On installera le package httpd (serveur apache), ainsi que les modules mod_ssl (SSL) et mod_proxy (pour gérer le mode Proxy / Reverse proxy) :

yum install httpd httpd-tools mod_ssl mod_proxy

Ceci va donc installer les binaires et créer les répertoires /etc/httpd, et les sous-répertoires :

  • /etc/httpd/conf : contient le fichier de configuration principal
  • /etc/httpd/conf.d : contient les fichiers de configuration secondaires (notamment la définition des VirtualHost)
  • /etc/httpd/conf.modules.d : contient la configuration des modules.

Paramétrage Apache

Paramétrage global

Pour que le serveur httpd veuille bien se lancer, j'ai du ajouter le hostname de la machine dans le fichier /etc/httpd/conf/httpd.conf, au niveau de la directive ServerName :

ServerName lnxvmrev1.domaine.fr

Paramétrage du reverse proxy

Le paramétrage du reverse Proxy sera fait dans un fichier de configuration séparé. Un fichier /etc/httpd/conf.d/reverse-proxy.conf sera donc créé, contenant :

#
# Parametrage du reverse Proxy pour le webmail
#
# On redirige les requêtes en https vers le serveur Notes (IP 10.1.2.3)

ProxyRequests Off

<VirtualHost *:443>
# Production
  ServerName webmail.domaine.fr
  DocumentRoot /var/www/html
  CustomLog /var/log/httpd/ssl_reverse.log combined
  
#   SSL Engine Switch , certificate configuration paths:
#   Enable/Disable SSL for this virtual host.
  SSLEngine on
  SSLCertificateFile    "/etc/ssl/certs/https/webmail.pem"
  SSLCertificateKeyFile "/etc/ssl/certs/https/webmail.key"
  SSLStrictSNIVHostCheck Off
  SSLCipherSuite RC4-SHA:AES128-SHA:HIGH:!aNULL:!MD5

# On fait du proxy vers un autre serveur en https
  SSLProxyEngine On
# Disable SSLProxyCheck
  SSLProxyCheckPeerCN Off
  SSLProxyCheckPeerName Off
  SSLProxyVerify none
# On transmet notre certificat au serveur distant (crt + key combiné)
#  SSLProxyMachineCertificateFile "/etc/ssl/certs/https/client.pem"
  ProxyPass / https://10.1.2.3/
  ProxyPassReverse / https://10.1.2.3/
  ProxyPreserveHost On

</VirtualHost>

Quelques explications sur les directives.

Tout d'abord la partie serveur https

  • VirtualHost *:443 : précise que l'on écoute sur le port 443 (https)
  • ServerName : le nom de domaine du serveur (FQDN)
  • CustomLog : le fichier de logs
  • DocumentRoot : c'est juste pour information, car tout le trafic sera redirigé (d'ailleurs on ne met pas de directive Directory)
  • SSLEngineOn, SSLCertificateFile, SSLCertificateKeyFile : paramétrage du SSL, avec le certificat et la clé
  • SSLCipherSuite : on précise les chiffrements autorisés.

Viennent ensuite les directives relatives à la partie Reverse proxy :

  • SSLProxyEngine : activation du mode Proxy en SSL
  • SSLProxyCheckPeerCN et SSLProxyCheckPeerName : permet de ne pas vérifier le CN et le nom du serveur distant
  • SSLProxyVerify : pas de vérification du serveur distant
  • SSLProxyMachineCertificateFile : concaténation de la clé et du certificat de la machine (pas nécessaire si on désactive les vérifications)
  • ProxyPass et ProxyPassReverse : il s'agit du paramétrage "standard" du mode reverse proxy
  • ProxyPreserverHost On : garde le nom DNS du reverse proxy (sinon on récupère l'adresse IP du serveur cible)

On redémarre ensuite avec les commandes systemctl :

systemctl restart httpd

On vérifie que le serveur http s'est ancé :

systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: active (running) since lun. 2016-11-07 14:31:48 CET; 2min 26s ago
     Docs: man:httpd(8)
           man:apachectl(8)
  Process: 14121 ExecStop=/bin/kill -WINCH ${MAINPID} (code=exited, status=0/SUCCESS)
 Main PID: 14126 (httpd)
   Status: "Total requests: 6; Current requests/sec: 0; Current traffic:   0 B/sec"
   CGroup: /system.slice/httpd.service
           ├─14126 /usr/sbin/httpd -DFOREGROUND
           ├─14127 /usr/sbin/httpd -DFOREGROUND
           ├─14128 /usr/sbin/httpd -DFOREGROUND
           ├─14129 /usr/sbin/httpd -DFOREGROUND
           ├─14130 /usr/sbin/httpd -DFOREGROUND
           ├─14131 /usr/sbin/httpd -DFOREGROUND
           ├─14132 /usr/sbin/httpd -DFOREGROUND
           ├─14133 /usr/sbin/httpd -DFOREGROUND
           └─14134 /usr/sbin/httpd -DFOREGROUND

nov. 07 14:31:48 lnxvmrev1.domaine.fr systemd[1]: Starting The Apache HTTP Server...
nov. 07 14:31:48 lnxvmrev1.domaine.fr systemd[1]: Started The Apache HTTP Server.

En cas de souci, les commandes systemctl status et journalctl -xe permettent de débugguer les erreurs.

J'ai notamment eu un cas où le service ne voulait pas démarrer car le ServerName n'était pas renseigné dans le fichier de configuration global.

Génération du certificat SHA1 pour le serveur Domino

La génération en une seule passe d'une clé privée (sans mot de passe) et d'un certificat avec une validité d'un an, et encypté en SHA1 se fait ia la commande :

openssl req -new -x509 -days 365 -sha1 -nodes -out server.pem -keyout server.key

Création du fichier PEM client pour le SSLProxyMachineCertificateFile

Il faut passer par une opération supplémentaire pour générer un fichier PEM acceptable par le serveur httpd.

En partant des fichiers .key et .pem existants, il faut ajouter une entête RSA :

openssl rsa -in webmail.key -out client.key

Puis on concatène les fichiers clé et certificat :

cp webmail.pem client.pem
cat client.key >> client.pem

 

Catégorie