New Page
2. Configuration HAProxy
IMPORTANT : Cette section concerne le serveur HAProxy mutualisé séparé, pas le serveur Foreman.
2.1 Installation de HAProxy
# Sur le serveur HAProxy (serveur séparé du serveur Foreman)
sudo dnf install -y haproxy
2.2 Génération des certificats SSL
Si vous n'avez pas encore de certificats SSL, vous pouvez utiliser Let's Encrypt ou générer des certificats auto-signés pour les tests :
# Certificats auto-signés (UNIQUEMENT POUR LES TESTS)
sudo mkdir -p /etc/haproxy/certs
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/haproxy/certs/foreman.key \
-out /etc/haproxy/certs/foreman.crt \
-subj "/C=FR/ST=IDF/L=Paris/O=MonOrganisation/CN=foreman.mondomaine.com"
# Combiner la clé et le certificat pour HAProxy
sudo cat /etc/haproxy/certs/foreman.crt /etc/haproxy/certs/foreman.key > /etc/haproxy/certs/foreman.pem
sudo chmod 600 /etc/haproxy/certs/foreman.pem
2.3 Configuration HAProxy
Sauvegarder la configuration par défaut :
sudo cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.backup
Créer la nouvelle configuration :
sudo vim /etc/haproxy/haproxy.cfg
Contenu de /etc/haproxy/haproxy.cfg :
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
# turn on stats unix socket
stats socket /var/lib/haproxy/stats
# SSL/TLS configuration
ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384
ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets
#---------------------------------------------------------------------
# Defaults settings
#---------------------------------------------------------------------
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
#---------------------------------------------------------------------
# Frontend HTTP - Redirection vers HTTPS
#---------------------------------------------------------------------
frontend http_front
bind *:80
mode http
# Redirection de tout le trafic HTTP vers HTTPS
redirect scheme https code 301 if !{ ssl_fc }
#---------------------------------------------------------------------
# Frontend HTTPS - Interface Web Foreman (port 443)
#---------------------------------------------------------------------
frontend https_front
bind *:443 ssl crt /etc/haproxy/certs/foreman.pem
mode http
# Headers de sécurité
http-response set-header Strict-Transport-Security "max-age=31536000; includeSubDomains"
http-response set-header X-Frame-Options "SAMEORIGIN"
http-response set-header X-Content-Type-Options "nosniff"
# ACL pour la WebUI
acl is_foreman_ui hdr(host) -i foreman.mondomaine.com
# Headers pour le backend
http-request set-header X-Forwarded-Proto https
http-request set-header X-Forwarded-Port 443
http-request add-header X-Forwarded-Ssl on
# Route vers le backend Foreman
use_backend foreman_webui if is_foreman_ui
default_backend foreman_webui
#---------------------------------------------------------------------
# Frontend HTTPS - Smart Proxy (port 8443)
#---------------------------------------------------------------------
frontend smartproxy_front
bind *:8443 ssl crt /etc/haproxy/certs/foreman.pem
mode http
# Headers de sécurité
http-response set-header Strict-Transport-Security "max-age=31536000; includeSubDomains"
# ACL pour Smart Proxy
acl is_smartproxy hdr(host) -i foreman.mondomaine.com
# Headers pour le backend
http-request set-header X-Forwarded-Proto https
http-request set-header X-Forwarded-Port 8443
http-request add-header X-Forwarded-Ssl on
# Route vers le backend Smart Proxy
use_backend foreman_smartproxy if is_smartproxy
default_backend foreman_smartproxy
#---------------------------------------------------------------------
# Backend - Foreman WebUI
#---------------------------------------------------------------------
backend foreman_webui
mode http
balance roundrobin
option httpchk GET /
# Configuration du backend
http-request set-header X-Forwarded-Host %[req.hdr(Host)]
# Serveur Foreman backend
# REMPLACER <IP_SERVEUR_FOREMAN> par l'IP réelle de votre serveur Foreman
server foreman1 <IP_SERVEUR_FOREMAN>:80 check inter 5s rise 2 fall 3
# Exemple avec une IP : server foreman1 192.168.1.100:80 check inter 5s rise 2 fall 3
#---------------------------------------------------------------------
# Backend - Smart Proxy
#---------------------------------------------------------------------
backend foreman_smartproxy
mode http
balance roundrobin
option httpchk GET /
# Configuration du backend
http-request set-header X-Forwarded-Host %[req.hdr(Host)]
# Serveur Smart Proxy backend
# REMPLACER <IP_SERVEUR_FOREMAN> par l'IP réelle de votre serveur Foreman
server smartproxy1 <IP_SERVEUR_FOREMAN>:8443 check ssl verify none inter 5s rise 2 fall 3
# Exemple avec une IP : server smartproxy1 192.168.1.100:8443 check ssl verify none inter 5s rise 2 fall 3
#---------------------------------------------------------------------
# Stats page (optionnel)
#---------------------------------------------------------------------
listen stats
bind *:9000
mode http
stats enable
stats uri /stats
stats realm HAProxy\ Statistics
stats auth admin:VotreMotDePasse
stats refresh 30s
2.4 Démarrage et activation de HAProxy
# Vérifier la configuration
sudo haproxy -c -f /etc/haproxy/haproxy.cfg
# Si pas d'erreur, activer et démarrer HAProxy
sudo systemctl enable haproxy
sudo systemctl start haproxy
# Vérifier le statut
sudo systemctl status haproxy
# Configurer le firewall pour HAProxy
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --permanent --add-port=443/tcp
sudo firewall-cmd --permanent --add-port=8443/tcp
sudo firewall-cmd --permanent --add-port=8140/tcp # Si option 1 pour Puppet
sudo firewall-cmd --permanent --add-port=9000/tcp # Stats (optionnel)
sudo firewall-cmd --reload
Test de connectivité HAProxy → Foreman
Avant de continuer, vérifier que HAProxy peut bien communiquer avec le serveur Foreman :
# Depuis le serveur HAProxy, tester la connectivité
ping <IP_SERVEUR_FOREMAN>
# Tester les ports
nc -zv <IP_SERVEUR_FOREMAN> 80
nc -zv <IP_SERVEUR_FOREMAN> 8443
nc -zv <IP_SERVEUR_FOREMAN> 8140
# Tester l'accès HTTP
curl -v http://<IP_SERVEUR_FOREMAN>/
curl -kv https://<IP_SERVEUR_FOREMAN>:8443/
# Si tout fonctionne, tester via HAProxy depuis HAProxy lui-même
curl -kv https://localhost/
curl -kv https://localhost:8443/
2.5 Configuration Foreman pour fonctionner derrière HAProxy
Sur le serveur Foreman, modifier la configuration pour accepter les requêtes via proxy :
sudo vim /etc/foreman/settings.yaml
Ajouter/modifier :
:trusted_proxies:
- <IP_SERVEUR_HAPROXY>
# Remplacer <IP_SERVEUR_HAPROXY> par l'IP réelle de votre serveur HAProxy
# Exemple : - 192.168.1.50
:require_ssl: true
IMPORTANT : Vous devez impérativement ajouter l'IP du serveur HAProxy dans la liste des proxies de confiance, sinon Foreman rejettera les requêtes.
Redémarrer les services Foreman :
sudo systemctl restart foreman
sudo systemctl restart httpd
2.6 Configuration Apache sur le serveur Foreman
Foreman doit être configuré pour accepter les connexions depuis HAProxy et gérer correctement les headers X-Forwarded :
# Éditer la configuration SSL de Foreman
sudo vim /etc/httpd/conf.d/05-foreman-ssl.conf
Ajouter dans le VirtualHost (avant la ligne </VirtualHost>) :
# Configuration pour reverse proxy
RemoteIPHeader X-Forwarded-For
RemoteIPInternalProxy <IP_SERVEUR_HAPROXY>
# Activer les modules nécessaires
<IfModule mod_remoteip.c>
RemoteIPHeader X-Forwarded-For
RemoteIPTrustedProxy <IP_SERVEUR_HAPROXY>
</IfModule>
Vérifier que le module remoteip est activé :
sudo dnf install -y mod_remoteip
sudo systemctl restart httpd
2.7 Configuration réseau et DNS
Puisque HAProxy et Foreman sont sur des serveurs séparés, vous devez configurer correctement le DNS et le routage.
Sur le serveur DNS (ou /etc/hosts des clients)
Le nom foreman.mondomaine.com doit pointer vers l'IP du serveur HAProxy, pas du serveur Foreman :
# DNS ou /etc/hosts
<IP_HAPROXY> foreman.mondomaine.com
Sur le serveur HAProxy
Ajouter l'entrée pour le serveur Foreman :
sudo vim /etc/hosts
<IP_SERVEUR_FOREMAN> foreman-backend.mondomaine.com foreman-backend
Sur le serveur Foreman
Le serveur Foreman doit pouvoir être contacté par HAProxy. Vérifier la configuration réseau :
# Vérifier la connectivité depuis HAProxy
ping <IP_SERVEUR_FOREMAN>
# Vérifier que les ports sont ouverts depuis HAProxy
nc -zv <IP_SERVEUR_FOREMAN> 80
nc -zv <IP_SERVEUR_FOREMAN> 8443
Configuration du hostname Foreman
Sur le serveur Foreman, le hostname doit correspondre au nom public :
sudo hostnamectl set-hostname foreman.mondomaine.com
Le fichier /etc/hosts sur le serveur Foreman :
127.0.0.1 localhost localhost.localdomain
<IP_LOCALE_FOREMAN> foreman.mondomaine.com foreman