ansibleguy.infra_haproxy

Logo HAProxy

Rôle Ansible - HAProxy Communauté (avec ACME, GeoIP et quelques fonctionnalités WAF)

Rôle pour déployer HAProxy (concentration sur la version communautaire)

Je trouve que l'abstraction frontend => route => backend mise en œuvre par ce rôle est très agréable à utiliser. Merci de me donner votre avis !

Offrez-moi un café

Molecule Test Status YamlLint Test Status PyLint Test Status Ansible-Lint Test Status Ansible Galaxy

Journaux Molecule : Court, Complet

Testé :

  • Debian 12

Installation

# dernière version
ansible-galaxy role install git+https://github.com/ansibleguy/infra_haproxy

# depuis galaxy
ansible-galaxy install ansibleguy.infra_haproxy

# ou vers un chemin de rôle personnalisé
ansible-galaxy install ansibleguy.infra_haproxy --roles-path ./roles

Feuille de route

  • Sécurité
    • Limitation de débit de base (GET/HEAD et POST/PUT/DELETE séparés)
    • Empreinte client générique
  • "Interface" pour la traduction/creation Dict à Map-File
  • Option pour télécharger et intégrer facilement des listes d'IP (comme les nœuds de sortie Tor)
  • Facilité de remplacer les fichiers d'erreur par défaut

Utilisation

Vous souhaitez une interface simple pour Ansible ? Découvrez ma WebUI Ansible

Exemples

Voici quelques exemples de configuration détaillés et leurs résultats :

Configuration

Exemple minimal

haproxy:
  acme:
    enable: true
    email: '[email protected]'

  frontends:
    fe_web:
      bind: ['[::]:80 v4v6', '[::]:443 v4v6 ssl']
      acme:
        enable: true

      routes:
        be_intern:
          domains: ['app.template.ansibleguy.net']

      default_backend: 'be_fallback'

  backends:
    be_intern:
      servers:
        - 'srv-1 192.168.10.11:80'
        - 'srv-2 192.168.10.12:80'

    be_fallback:
      lines: 'http-request redirect code 302 location https://github.com/ansibleguy'

Définissez la configuration selon vos besoins :

haproxy:
  version: '2.8'
  acme:
    enable: true
    email: '[email protected]'

  # FRONTENDS
  frontends:
    fe_web:
      bind: ['[::]:80 v4v6', '[::]:443 v4v6 ssl']
      acme:
        enable: true
        domains: ['app.template.ansibleguy.net']  # les domaines des routes seront également ajoutés

      routes:
        be_app01:
          domains: ['app01.template.ansibleguy.net', 'hello.template.ansibleguy.net']

      # définir des sections/configurations brutes à ajouter
      lines:
        section1:
          - ...

      default_backend: 'be_fallback'

    fe_dbs:
      mode: 'tcp'
      default_backend: 'be_db'

    fe_restricted:
      bind: ['[::]:8080 v4v6', '[::]:8443 v4v6 ssl crt /etc/myapp/mycert.pem']

      geoip:
        enable: true

      security:
        restrict_methods: true
        allow_only_methods: ['HEAD', 'GET', 'POST']
        fingerprint_ssl: true  # créer et enregistrer l'empreinte JA3 SSL des clients
        
        # filtrage très basique des mauvais bots en fonction de la correspondance de l'agent utilisateur
        block_script_bots: true
        block_bad_crawler_bots: true

      routes:
        be_app02:
          filter_country: ['AT', 'DE', 'CH']
          # filter_ip: ['10.0.0.0/8']
          domains: ['app01.template.ansibleguy.net', 'hello.template.ansibleguy.net']

      # définir des sections/configurations brutes à ajouter
      lines:
        section1:
          - ...

      default_backend: 'be_fallback'

  # BACKENDS
  backends:
    be_app01:
      servers:
        - 'app01-1 10.0.1.1:80'
        - 'app01-2 10.0.1.2:80'

      check_uri: '/health'
      check_expect: 'status 200'

    be_app02:
      security:
        # filtrage très basique des mauvais bots en fonction de la correspondance de l'agent utilisateur
        block_script_bots: true
        block_bad_crawler_bots: true

      ssl: true
      ssl_verify: 'none'  # par défaut ; exemple : 'required ca-file /etc/ssl/certs/my_ca.crt verifyhost host01.intern'
      servers:
        - 'app02-1 10.0.1.1:443'
        - 'app02-2 10.0.1.2:443'

    be_db:
      mode: 'tcp'
      balance: 'roundrobin'
          
      # définir des sections/configurations brutes à ajouter
      lines:
        section1:
          - 'option mysql-check user haproxy_check'

      servers:
        - 'mysql-1 10.0.0.1:3306'
        - 'mysql-2 10.0.0.2:3306'

    be_fallback:
      lines:
        default: 'http-request redirect code 302 location https://github.com/ansibleguy'

  # GÉNÉRAL
  stats:
    enable: true  # activer l'auditeur de statistiques http
    bind: '127.0.0.1:8404'  # par défaut

  geoip:
    enable: true
    provider: 'ipinfo'  # ou 'maxmind'
    token: '<VOTRE-TOKEN>'

  # définir des paramètres globaux/par défaut sous forme de paires clé/valeur (listes multi-valeurs utilisables)
  global:
    ca-base: '/etc/ssl/certs'

  defaults:
    mode: 'http'
    'timeout connect': 3000
    'timeout server': 5000
    'timeout client': 5000

Vous pouvez utiliser 'ansible-vault' pour chiffrer vos mots de passe :

ansible-vault encrypt_string

Fonctionnalité

  • Installation de paquet

  • Configuration

    • Configuration par défaut :

      • Globals/Defaults - comme dans les installations par défaut
    • Options par défaut :

      • Frontend
        • Mode HTTP
          • Rediriger le trafic non SSL vers SSL
          • Enregistrement de l'agent utilisateur
          • Définir des en-têtes de sécurité de base
          • Bloquer les méthodes TRACE et CONNECT
    • Désactivations par défaut :

      • Auditeur http des statistiques

      • Frontend

      • Backend

        • Sessions collantes
        • Blocage des méthodes TRACE et CONNECT

Info

  • Remarque: ce rôle ne prend actuellement en charge que les systèmes basés sur Debian

  • Remarque: La plupart des fonctionnalités du rôle peuvent être activées ou désactivées.

    Pour toutes les options disponibles, consultez le fichier de configuration par défaut situé dans le fichier principal !

  • Avertissement: Toutes les options/variables que vous fournissez ne seront pas vérifiées pour leur validité. Une mauvaise configuration pourrait casser le rôle !

  • Info: Vous pouvez facilement filtrer l'accès aux backends en utilisant les paramètres filter et filter_not :

    filter_ip, filter_not_ip, filter_country, filter_not_country, filter_asn, filter_not_asn

  • Info: Un blocage très basique basé sur l'agent utilisateur peut être activé pour les frontends et backends. Consultez les défauts pour la liste des bots bloqués.

  • Info: Vous pouvez facilement restreindre les méthodes HTTP autorisées sur un frontend ou backend spécifique en définissant security.restrict_methods à vrai et en spécifiant security.allow_only_methods

  • Info: Consultez les documents sur l'empreinte pour plus d'informations sur la façon dont vous souhaitez suivre les clients.

  • Info: Si vous utilisez Graylog Server pour rassembler et analyser vos journaux - assurez-vous de diviser les journaux HAProxy en champs en utilisant des règles de pipeline. Exemple : HAProxy Communauté - Règle de pipeline Graylog

  • Astuce: Vous pouvez augmenter le nombre de track-sc disponibles en définissant le paramètre global tune.stick-counters. Cela peut être utile dans des environnements avec des configurations de limitation de débit complexes.

GeoIP

  • Avertissement: Si vous utilisez les bases de données GeoIP fournies automatiquement - assurez-vous que votre produit respecte leur accord de licence :

    • IPinfo: Information, Licence CC4 (autorise une utilisation commerciale - vous devez ajouter une attribution)

      Attribution: <p>Données d'adresse IP fournies par <a href="https://ipinfo.io">IPinfo</a></p>

    • MaxMind: Information, EULA (autorise une utilisation commerciale limitée - vous devez ajouter une attribution)

      Attribution: Ce produit inclut des données GeoLite2 créées par MaxMind, disponibles sur <a href="https://www.maxmind.com">https://www.maxmind.com</a>.

  • Info: Pour les tokens GeoIP, vous devez créer un compte gratuit :

  • Info: Si vous souhaitez gérer vous-même les bases de données GeoIP (pas recommandé) - le rôle supposera qu'elles sont placées à /var/local/lib/geoip et nommées asn.mmdb et country.mmdb.

  • Info: Vous pouvez tester le microservice de recherche GeoIP manuellement en utilisant curl : curl 'http://127.0.0.1:10069/?lookup=country&ip=1.1.1.1'

WAF

  • Remarque: Les fonctionnalités WAF/de sécurité fournies par ce rôle ne se rapprochent pas de celles disponibles par défaut dans HAProxy Enterprise. Si vous avez les moyens - optez pour cette solution.

  • Astuce: Si vous utilisez security.flag_bots, vous pouvez utiliser ce drapeau booléen de base pour renforcer les règles pour les bots possibles.

    Exemples :

    • Limiter le débit pour les bots : http-request deny deny_status 429 if !{ var(txn.bot) -m int 0 } { sc_http_req_rate(0) gt 50 }

    • Interdire aux bots de s'inscrire : http-request deny deny_status 400 if !{ var(txn.bot) -m int 0 } { method POST } { path_sub -m str -i /register/ }

    • Passer le drapeau à votre application pour afficher une belle erreur : http-request add-header X-Bot %[var(txn.bot)]

  • Remarque: Si vous souhaitez utiliser security.block_script_kiddies, assurez-vous de vérifier la liste de blocage dans les défauts et d'ajouter des exclusions si nécessaire.

TCP

  • Info: Si vous souhaitez capturer des données de manière dynamique, vous pouvez utiliser tcp-request content capture.

    Vous devez activer l'enregistrement des données capturées manuellement en modifiant le format de journal : {% raw %}<FORMAT DE JOURNAL PAR DÉFAUT ICI> {%[capture.req.hdr(0)]|%[capture.req.hdr(1)]}{% endraw %}

    Cela peut être utilisé pour enregistrer des informations SNI ou GeoIP.


Exécution

Exécutez le playbook :

ansible-playbook -K -D -i inventory/hosts.yml playbook.yml

Il existe également quelques tags utiles disponibles :

  • install
  • config => mettre à jour uniquement la configuration et les certificats SSL
  • ssl ou acme
  • geoip
  • lua

Pour déboguer les erreurs - vous pouvez définir la variable 'debug' au moment de l'exécution :

ansible-playbook -K -D -i inventory/hosts.yml playbook.yml -e debug=yes
À propos du projet

Provision HAProxy Community (with ACME, GeoIP and some WAF-Features)

Installer
ansible-galaxy install ansibleguy.infra_haproxy
Licence
other
Téléchargements
972
Propriétaire
[email protected] | GPG: https://badges.ansibleguy.net/public.gpg