ansibleguy.infra_haproxy

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!
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
- Repository-Abhängigkeiten (minimal)
- HAProxy
- GeoIP
- ACME
- Abhängigkeiten
- Nginx light für die Challenge-Response-Verarbeitung
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
- HTTP-Modus
- Frontend
Standard-Opt-outs:
Stats http-Listener
Frontend
- ACME/LetsEncrypt
- GeoIP-Lookups
- Blockierung bekannter Script-Bots
- SSL-Fingerabdruck (JA3)
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
undfilter_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 undsecurity.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:
- IPInfo: Anmelden/Registrieren
- MaxMind: Anmelden/Registrieren - Setzen Sie das
token
auf<KONTO>:<LIZENZ>
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 undasn.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
Provision HAProxy Community (with ACME, GeoIP and some WAF-Features)
ansible-galaxy install ansibleguy.infra_haproxy