ansibleguy.infra_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 !
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
- Dépendances du référentiel (minimales)
- HAProxy
- GeoIP
- ACME
- Dépendances
- Nginx léger pour la gestion du défi/réponse
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
- Mode HTTP
- Frontend
Désactivations par défaut :
Auditeur http des statistiques
Frontend
- ACME/LetsEncrypt
- Recherches GeoIP
- Blocage des bots de script bien connus
- Empreinte SSL (JA3)
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
etfilter_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écifiantsecurity.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 :
- IPInfo: Se connecter/S'inscrire
- MaxMind: Se connecter/S'inscrire - Définissez le
token
en<COMPTE>:<LICENCE>
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éesasn.mmdb
etcountry.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
Provision HAProxy Community (with ACME, GeoIP and some WAF-Features)
ansible-galaxy install ansibleguy.infra_haproxy