Skip to main content

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