web-dev-qa-db-fra.com

HAProxy ACL multiple OR conditions

Utilisation de Haproxy 1.5.12 exécuté sur Ubuntu 12.04

Je dois restreindre l'accès à mon site Web aux demandes provenant de certaines adresses IP ou ayant un paramètre défini dans la demande.

Ainsi, par exemple, la demande suivante ne devrait fonctionner qu'à partir d'adresses IP autorisées:

http://www-test.example.com/page.php

Et cette demande doit être satisfaite à partir de n'importe quelle adresse IP (y compris celles autorisées):

http://www-test.example.com/page.php?devtool=1

Mes ACL sont:

acl is_test hdr(Host) -m sub test
acl is_allowed src -f /etc/haproxy/allowed_ips
acl is_devtool urlp(devtool) 1
acl is_devtool hdr_sub(Referer) devtool=1

et ils fonctionnent bien s'ils sont utilisés exclusivement:

http-request deny if is_test ! is_allowed

ou

http-request deny if is_test ! is_devtool

Mais si je les combine avec un OR je ne peux pas accéder à l'URL à partir d'une IP autorisée (inverser les tests n'aide pas)):

http-request deny if is_test ! is_allowed || is_test ! is_devtool

Une idée de comment faire ça?

Merci

7
jeremyjr

Le test que vous semblez vouloir imposer est le suivant:

A && !(B || C)

... mais ce n'est pas logiquement équivalent à ce que vous avez écrit, qui est essentiellement ceci ...

(A && !B) || (A && !C)

L'équivalent logique de A && !(B || C) sans utiliser de parenthèses pour la priorité est en fait ceci:

A && !B && !C

Donc, ce que vous cherchez doit être le suivant:

http-request deny if is_test !is_allowed !is_devtool

Ou, pour le reformuler: refuser la demande si -

  • il correspond à is_test, et
  • il ne correspond pas à is_allowed, et
  • il ne correspond pas à is_devtool

Tant que l'une de ces conditions est fausse (n'est pas test, est autorisée, est devtool), votre règle ne correspond pas et ne refuse pas la demande.

13
Michael - sqlbot