Skip to main content

Configuration HAProxy

IMPORTANT : Cette section concerne le serveur HAProxy mutualisé séparé, pas le serveur Foreman.

1 Installation de HAProxy

# Sur le serveur HAProxy (serveur séparé du serveur Foreman)
sudo dnf install -y haproxy

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

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

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/

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

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

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