Om zo nu en dan een self-hosted container over HTTPS aan te kunnen bieden gebruik ik HAProxy, simpelweg omdat dit ingebouwd zit in mijn Netgate 6100 Firewall, ACME (Lets Encrypt) prima werkt met mijn DNS implementatie en dit ook HA (redundante pfSense setup) kan draaien. Op zich niks bijzonders zou je zeggen. Tot ik besloot wat security parameters aan te passen en onverwacht te maken kreeg met een vervelende bug.
Maar om te beginnen eerst de ‘hardening’, ik was bezig om de ‘security eisen’ van HAProxy wat strakker in te stellen. Als basis heb ik de Mozilla SSL Configurator gebruikt.
- Settings > Tuning > SSL/TLS Compatibility Mode:
Modern
- Frontend > Advanced settings > Advanced pass thru:
http-response set-header strict-transport-security "max-age=31536000;includeSubDomains;preload;"
http-request set-header X-Real-IP %[src]
http-request set-header X-Forwarded-Proto https
http-request set-header X-Forwarded-Host %[req.hdr(Host)]
http-request set-header Host %[req.hdr(Host)] - SSL Offloading > Advanced ssl options:
prefer-client-ciphers ssl-min-ver TLSv1.3 no-tls-tickets curves X25519:prime256v1:secp384r1 ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
Hoewel dit perfect werkte voor de Authentik test i.c.m. Nextcloud die ik aan het inrichten was, bleek hierdoor een van mijn andere backends gebroken. Oorzaak is dat deze de strengere eisen niet ondersteund, op zich geen probleem als ik geen HTTPS aan de achterkant zou gebruiken. Dus veranderde ik poort 8443 in 8080 van de betreffende container. Maar wat ik ook probeerde HAProxy bleef aangeven dat de backend down was of ik kreeg een HTTPS mismatch foutmelding:
Bad Request
This combination of host and port requires TLS.
Lang verhaal kort (en heel wat uren later), er zit een bug in HAProxy binnen pfSense.
Als je de poort van een backend aanpast wordt dit niet direct doorgevoerd! Hier kwam ik achter door in de STATS pagina over de naam van de backend te bewegen met de muis. Hier stond doodleuk de ‘oude’ poort, ook een dag later nog.
Na wat dummy backends aanmaken wist ik het zeker, dit hoort niet zo te werken. Elk nieuwe Backend (nieuw id) werkte 1x, elke (poort) aanpassing daarna werd niet doorgevoerd.
Een korte zoekactie bracht me vervolgens bij dit artikel op het Netgate forum.
De oplossing: Neem in elke backend de volgende directive op: load-server-state-from-file none
Alternatief is om rm /tmp/haproxy_server_state op de command line uit te voeren, maar dat is omslachtiger en heb ik niet getest.