01Oct

Cómo añadir Autenticación Básica de tipo HTTP a los nodos de HAProxy

Este artículo cubre como añadir una capa de seguridad básica Autenticación Básica HTTP sobre un proxy HAProxy a una directiva backend de la configuración…

Este artículo cubre comom añadir una capa de seguridad básica Autenticación Básica HTTP sobre un proxy HAProxy a una directiva backend de la configuración.

Autenticación Básica HTTP

Esta autenticación es la forma más básica de seguridad en una web. Esta dentro de la especificación HTTP y no requiere ninguna acción por parte de nuestra aplicación, ni sesiones, pantalla de conexión, etc… simplemente funciona con cualquier cliente web.

Caso de Uso

Suponemos que tenemos un servicio de HAProxy en un servidor donde tenemos alojadas varias instancias de una aplicación Web: qa, preproducción y producción.

Visible públicamente sólo debe estarlo la aplicación de producción. Los otros dos entornos son de pruebas antes de desplegar la aplicación en producción.

Queremos que los entornos de qa y preproducción tengan una protección básica HTTP para poder acceder a ellas.

Los diferentes dominios que tenemos en el ejemplo son:

  • qa: qa.rqsample.com
  • preproducción: preprod.rqsample.com
  • producción: www.rqsample.com

Configuración sin Autenticación

Suponiendo que qa.rqsample.com esta escuchando en la ip:puerto 172.17.0.1:16700, preprod.rqsample.com lo hace en 172.17.0.1:16800 y www.rqsample.com lo hace en 172.17.0.1:16900 la configuración de HAProxy, que está en /etc/haproxy/haproxy.cfg, quedaría como sigue:

global
    maxconn 4096

defaults
    mode http
    timeout connect 5000ms

frontend http-in
    bind *:80

    timeout client 30000ms
    timeout server 30000ms

    option httpclose

    # ACL
    acl is_qa hdr(host) -i qa.rqsample.com
    acl is_preprod hdr(host) -i preprod.rqsample.com
    acl is_prod hdr(host) -i www.rqsample.com

    # Backends
    use_backend application_qa if is_qa
    use_backend application_preprod if is_preprod
    use_backend application_prod if is_prod

backend application_qa
    balance roundrobin
    option forwardfor
    server node1 172.17.0.1:16700 check

backend application_preprod
    balance roundrobin
    option forwardfor
    server node1 172.17.0.1:16800 check

backend application_prod
    balance roundrobin
    option forwardfor
    server node1 172.17.0.1:16900 check

Comprobamos en la configuración que HAProxy detecta el host de la petición HTTP en la sección ACL de la configuración y crea las variables is_qa, is_preprod e is_prod para poder redirigir la petición a la IP y puerto correspondiente definidos en cada una de las directivas backend

Definiendo el usuario y la contraseña

Creamos nuestro listado de usuarios y contraseñas en la cabecera de la configuración:

userlist UsersFor_Sample
    user sample insecure-password sample0102
    user admin insecure-password admin0304

Y añadimos la comprobación del usuario y contraseña en las directivas de qa y preprod:

acl AuthOkay_Sample http_auth(UsersFor_Sample)
http-request auth realm SampleApplication if !AuthOkay_Sample

El archivo de configuración de HAProxy final quedaría como sigue:

global
    maxconn 4096

defaults
    mode http
    timeout connect 5000ms

userlist UsersFor_Sample
    user sample insecure-password sample0102
    user admin insecure-password admin0304

frontend http-in
    bind *:80

    timeout client 30000ms
    timeout server 30000ms

    option httpclose

    # ACL
    acl is_qa hdr(host) -i qa.rqsample.com
    acl is_preprod hdr(host) -i preprod.rqsample.com
    acl is_prod hdr(host) -i www.rqsample.com

    # Backends
    use_backend application_qa if is_qa
    use_backend application_preprod if is_preprod
    use_backend application_prod if is_prod

backend application_qa
    balance roundrobin
    option forwardfor

    acl AuthOkay_Sample http_auth(UsersFor_Sample)
    http-request auth realm SampleApplication if !AuthOkay_Sample

    server node1 172.17.0.1:16700 check

backend application_preprod
    balance roundrobin
    option forwardfor

    acl AuthOkay_Sample http_auth(UsersFor_Sample)
    http-request auth realm SampleApplication if !AuthOkay_Sample

    server node1 172.17.0.1:16800 check

backend application_prod
    balance roundrobin
    option forwardfor
    server node1 172.17.0.1:16900 check

Ya hemos configurado una capa de seguridad HTTP Básica en los Backend que no son producción!

HAProxy: http://www.haproxy.org/

Leave a comment