Howto HAProxy - ACL
- Documentation : https://docs.haproxy.org/2.2/configuration.html#7
- Statut de cette page : test / bookworm
Cet article se focalise sur la manière d’écrire des ACLs pour HAProxy.
Pour une documentation plus générale, consultez la page /HowtoHAProxy.
Liens externes utiles :
- https://www.haproxy.com/documentation/haproxy-configuration-tutorials/proxying-essentials/custom-rules/acls/
- https://www.haproxy.com/blog/introduction-to-haproxy-acls
Quelques bases
On peut définir une ACL avec le mot clé acl (named ACL)
ou écrire directement là où l’on en a besoin (anonymous ACL ou inline
ACL) :
- named ACL :
acl FOO path_beg -i /fooethttp-request deny if FOO - anonymous/inline ACL :
http-request deny if path_beg -i /foo
Dans le suite de cette documentation, on va se concentrer sur les « named ACL ».
Pour une ACL du même nom répétée plusieurs fois, les conditions se cumulent avec un OR.
Par exemple l’ACL ci-dessous va inclure les URL commençant par
/foo et par /bar :
acl ACL1 path -m beg /foo
acl ACL1 path -m beg /bar
On peut aussi grouper ainsi :
acl ACL1 path_beg -i /foo /bar
Les ACLs sont appliquables à différents paramètres (http-request, use_backend, etc.) avec les mots clés :
if <ACL>unless <ACL>
On peut spécifier plusieurs ACLs à la suite :
- Par défaut, ça se cumule en AND :
ACL1 ACL2 - On peut les cumuler avec OR :
ACL1 or ACL2(ouACL1 || ACL2) - On peut prendre la négation :
!ACL1 - On peut grouper après un OR :
ACL1 { or ACL2 ACL3 }
Si l’on veut gérer des combinaisons complexes de OR et AND, on pourra utiliser plusieurs ACLs mais aussi plusieurs instructions pour gérer des exceptions.
Par exemple :
acl STATIC path -m end .jpg .png
acl STATIC path -m beg /static /img
acl PHP path -m end .php
acl CGI path -m end .cgi
use_backend static if STATIC
use_backend dynamic if PHP CGI
use_backend default
Le principe général
Une ACL s’écrit de la façon suivante :
acl NOM_ACL PARAMÉTRE OPÉRATEUR VALEUR(S)
Paramètres
Le paramètre peut être :
- src : IP du client
- path : l’URL sollicitée (sans le query string)
- query : le query string
- pathq : l’URL sollicitée avec le query string
- url_param(foo) : valeur du premier paramètre “foo” du query string
- hdr(foo) : valeur de l’entête HTTP “foo:”, peut aussi être req.hdr() ou res.hdr() si l’on veut les entêtes de la requête ou la réponse
- req.cook(foo) : valeur du dernier cookie “foo” envoyé par le client
- res.cook(foo) : valeur du dernier Set-Cookie envoyé par le serveur
Opérateurs
On fera souvent précéder l’opérateur d’un -i pour rendre
l’évaluation insensible à la casse.
L’opérateur peut être :
- -m str : correspond exactement
- -m beg : commence par
- -m end : finit par
- -m sub : sous-partie inclue
- -m reg : expression régulière (plus couteuse en ressources)
- -m found : la valeur existe, utilisable par exemple avec hdr(foo), cookie(foo) ou url_param(foo)
Valeur(s)
Il peut y avoir une seule valeur, ou plusieurs valeurs séparées par une espace.
Exemples d’ACL
acl wordpress_admin path -i -m beg /wp-admin /wp-cron /wp-login
acl cookie_notice cookie(cookie_notice_accepted) -m found
acl wordpress_cookie req.hdr(cookie) -m sub wordpress_logged_in
acl wordpress_preview query -i -m sub preview=true
acl wordpress_woocommerce url_param(wc-ajax) -m found