Howto HAProxy - ACL

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 :

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 /foo et http-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 (ou ACL1 || 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