ansibleguy.infra_haproxy

HAProxy Logo

Ansible Rolle - HAProxy Community (mit ACME, GeoIP und einigen WAF-Funktionen)

Rolle zur Bereitstellung von HAProxy (Fokus auf der Community-Version)

Ich finde die frontend => route => backend Abstraktion, die mit dieser Rolle umgesetzt wurde, sehr angenehm zu nutzen. Bitte gebt mir Feedback!

Kauf mir einen Kaffee

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

Molecule Protokolle: Kurz, Voll

Getestet:

  • Debian 12

Installation

# Neueste Version
ansible-galaxy role install git+https://github.com/ansibleguy/infra_haproxy

# Von Galaxy
ansible-galaxy install ansibleguy.infra_haproxy

# oder zu benutzerdefiniertem Rollen-Pfad
ansible-galaxy install ansibleguy.infra_haproxy --roles-path ./roles

Fahrplan

  • Sicherheit
    • Grundlegendes Ratenlimit (GET/HEAD und POST/PUT/DELETE getrennt)
    • Generischer Client-Fingerabdruck
  • 'Schnittstelle' zur Übersetzung/Erstellung von Dict zu Map-Dateien
  • Möglichkeit, IP-Listen einfach herunterzuladen und zu integrieren (z.B. Tor Exit-Knoten)
  • Einfache Möglichkeit, die Standardfehlerdateien zu überschreiben

Nutzung

Möchten Sie eine einfache Ansible GUI? Schauen Sie sich meine Ansible WebUI an.

Beispiele

Hier sind einige detaillierte Konfigurationsbeispiele und deren Ergebnisse:

Konfiguration

Minimales Beispiel

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'

Definieren Sie die Konfiguration nach Bedarf:

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']  # Domains aus Routen werden ebenfalls hinzugefügt

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

      # definieren Sie rohe Konfigurationsabschnitte/Zeilen zum Hinzufügen
      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  # Erstellen und protokollieren Sie den JA3 SSL-Fingerabdruck von Clients
        
        # Sehr grundlegende Filterung von schlechten Bots basierend auf der Benutzer-Agent-Übereinstimmung
        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']

      # definieren Sie rohe Konfigurationsabschnitte/Zeilen zum Hinzufügen
      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:
        # Sehr grundlegende Filterung von schlechten Bots basierend auf der Benutzer-Agent-Übereinstimmung
        block_script_bots: true
        block_bad_crawler_bots: true

      ssl: true
      ssl_verify: 'none'  # Standard; Beispiel: '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'
          
      # definieren Sie rohe Konfigurationsabschnitte/Zeilen zum Hinzufügen
      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'

  # ALLGEMEIN
  stats:
    enable: true  # Aktiviere stats http-Listener
    bind: '127.0.0.1:8404'  # Standard

  geoip:
    enable: true
    provider: 'ipinfo'  # oder 'maxmind'
    token: '<DEIN-TOKEN>'

  # definieren Sie globale/Standardwerte als Schlüssel/Wert-Paare (mehrwertige Listen verwendbar)
  global:
    ca-base: '/etc/ssl/certs'

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

Sie möchten möglicherweise 'ansible-vault' verwenden, um Ihre Passwörter zu verschlüsseln:

ansible-vault encrypt_string

Funktionalität

  • Paketinstallation

  • Konfiguration

    • Standardkonfiguration:

      • Globals/Defaults - wie in Standardinstallationen gesehen
    • Standard-Opt-ins:

      • Frontend
        • HTTP-Modus
          • Nicht-SSL-Verkehr zu SSL umleiten
          • Benutzer-Agent protokollieren
          • Grundlegende Sicherheits-Header setzen
          • TRACE- und CONNECT-Methoden blockieren
    • Standard-Opt-outs:

      • Stats http-Listener

      • Frontend

      • Backend

        • Sticky Sessions
        • Blockierung von TRACE- und CONNECT-Methoden

Info

  • Hinweis: Diese Rolle unterstützt derzeit nur debian-basierte Systeme

  • Hinweis: Die meisten Funktionen der Rolle können ein- oder ausgeschaltet werden.

    Für alle verfügbaren Optionen - siehe die Standardkonfiguration in der Hauptstandarddatei!

  • Warnung: Nicht jede Einstellung/Variable, die Sie angeben, wird auf Gültigkeit überprüft. Falsche Konfiguration könnte die Rolle brechen!

  • Info: Sie können den Zugriff auf Backends einfach filtern, indem Sie die Einstellungen filter und filter_not verwenden:

    filter_ip, filter_not_ip, filter_country, filter_not_country, filter_asn, filter_not_asn

  • Info: Eine sehr grundlegende Benutzer-Agent-basierte Blockierung von Script- und schlechten Crawler-Bots kann für Frontends und Backends aktiviert werden. Schauen Sie sich die Defaults für die Liste der blockierten Bots an.

  • Info: Sie können die erlaubten HTTP-Methoden für ein bestimmtes Frontend oder Backend leicht einschränken, indem Sie security.restrict_methods auf true setzen und security.allow_only_methods angeben.

  • Info: Überprüfen Sie die Fingerprinting-Dokumentation für detaillierte Informationen, wie Sie möglicherweise Clients verfolgen möchten.

  • Info: Wenn Sie Graylog Server verwenden, um Ihre Protokolle zu sammeln und zu analysieren - stellen Sie sicher, dass Sie Ihre HAProxy-Protokolle mit Hilfe von Pipeline-Regeln in Felder aufteilen. Beispiel: HAProxy Community - Graylog Pipeline-Regel

  • Tipp: Sie können die Anzahl der verfügbaren track-sc's erhöhen, indem Sie die globale Einstellung tune.stick-counters festlegen. Dies kann in Umgebungen mit komplexen Ratenlimit-Setups nützlich sein.

GeoIP

  • Warnung: Wenn Sie die automatisch bereitgestellten GeoIP-Datenbanken verwenden - stellen Sie sicher, dass Ihr Produkt die Lizenzvereinbarung befolgt:

    • IPinfo: Information, CC4-Lizenz (erlaubt kommerzielle Nutzung - Sie müssen eine Attribution hinzufügen)

      Attribution: <p>IP-Adressdaten bereitgestellt von <a href="https://ipinfo.io">IPinfo</a></p>

    • MaxMind: Information, EULA (erlaubt eingeschränkte kommerzielle Nutzung - Sie müssen eine Attribution hinzufügen)

      Attribution: Dieses Produkt umfasst GeoLite2-Daten, die von MaxMind erstellt wurden und verfügbar sind unter <a href="https://www.maxmind.com">https://www.maxmind.com</a>.

  • Information: Für GeoIP-Tokens müssen Sie ein kostenloses Konto erstellen:

  • Information: Wenn Sie die GeoIP-Datenbanken selbst verwalten möchten (nicht empfohlen) - geht die Rolle davon aus, dass sie in /var/local/lib/geoip abgelegt sind und asn.mmdb & country.mmdb genannt werden.

  • Information: Sie können den GeoIP Lookup Mikrodienst manuell mit curl testen: curl 'http://127.0.0.1:10069/?lookup=country&ip=1.1.1.1'

WAF

  • Hinweis: Der WAF/Sicherheits-Funktionsumfang, den diese Rolle bietet, kommt nicht annähernd an den Standardumfang der HAProxy Enterprise. Wenn Sie das Geld haben - machen Sie es.

  • Tipp: Wenn Sie security.flag_bots verwenden, können Sie dieses grundlegende boolesche Flag verwenden, um Regeln für mögliche Bots zu verschärfen.

    Beispiele:

    • Niedrigeres Ratenlimit für Bots: http-request deny deny_status 429 if !{ var(txn.bot) -m int 0 } { sc_http_req_rate(0) gt 50 }

    • Bots daran hindern, Konten zu registrieren: http-request deny deny_status 400 if !{ var(txn.bot) -m int 0 } { method POST } { path_sub -m str -i /register/ }

    • Flags an Ihre Anwendung weitergeben, um einen hübschen Fehler anzuzeigen: http-request add-header X-Bot %[var(txn.bot)]

  • Hinweis: Wenn Sie security.block_script_kiddies verwenden möchten, stellen Sie sicher, dass Sie die Blockliste in den Defaults überprüfen und nach Bedarf Ausnahmen hinzufügen.

TCP

  • Info: Wenn Sie Daten dynamisch erfassen möchten, können Sie tcp-request content capture verwenden.

    Sie müssen das Protokollieren der erfassten Daten manuell aktivieren, indem Sie das Log-Format ändern: {% raw %}<DEFAULT LOG FORMAT HERE> {%[capture.req.hdr(0)]|%[capture.req.hdr(1)]}{% endraw %}

    Dies kann verwendet werden, um SNI- oder GeoIP-Informationen zu protokollieren.


Ausführung

Führen Sie das Playbook aus:

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

Es gibt auch einige nützliche Tags:

  • install
  • config => nur Konfiguration und SSL-Zertifikate aktualisieren
  • ssl oder acme
  • geoip
  • lua

Um Fehler zu debuggen - können Sie die 'debug'-Variable zur Laufzeit festlegen:

ansible-playbook -K -D -i inventory/hosts.yml playbook.yml -e debug=yes
Über das Projekt

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

Installieren
ansible-galaxy install ansibleguy.infra_haproxy
GitHub Repository
Lizenz
other
Downloads
972
Besitzer
[email protected] | GPG: https://badges.ansibleguy.net/public.gpg