When proxying traffic to backend servers where you lack administrative access, adding security layers becomes tricky. Traditional HTTP basic auth requires backend configuration, but HAProxy offers a solution at the proxy layer itself.
Here's the minimal configuration to implement Basic Auth for all requests:
frontend http-in
bind *:80
acl auth_ok http_auth(haproxy_users)
http-request auth realm HAProxy\\ Authentication if !auth_ok
default_backend servers
backend servers
server backend1 192.168.1.100:80 check
userlist haproxy_users
user lars password $6$WjZ6/5vC$.D3QOPSI0hH1dJ7qU6pJY91XpNzF8jL9SDF8k6r3vYV5sW4wL1B2
The configuration uses several key elements:
- userlist: Defines authorized users with encrypted passwords (SHA-512 shown)
- http_auth: ACL that checks credentials against the userlist
- http-request auth: Challenges unauthenticated requests
Create secure hashed passwords using these methods:
Using OpenSSL (SHA-1):
openssl passwd -1 "yourpassword"
Using mkpasswd (SHA-512 recommended):
mkpasswd -m sha-512
For more control, you might want to:
frontend http-in
bind *:80
acl restricted_path path_beg /admin
acl auth_ok http_auth(haproxy_admin_users)
http-request auth realm Admin\\ Area if restricted_path !auth_ok
default_backend servers
Verify the configuration works with curl:
curl -v http://yourhaproxy:80/ -u username:password
Look for HTTP/1.1 200 OK in successful cases or HTTP/1.1 401 Unauthorized when authentication fails.
Remember these critical points:
- Basic Auth transmits credentials in base64 (easily decoded)
- Always use HTTPS in production to encrypt the transmission
- Regularly rotate passwords and audit user access
- Consider combining with IP whitelisting for sensitive areas
When working with backend servers you don't have administrative access to, adding security layers can be tricky. HTTP Basic Authentication is one of the simplest ways to add a gatekeeper to your services, and HAProxy provides an elegant solution for implementing this at the proxy level.
Here's the fundamental HAProxy configuration to implement Basic Auth:
frontend http-in
bind *:80
acl authenticated http_auth(haproxy-auth)
http-request auth realm "Restricted Area" unless authenticated
use_backend backend_servers if authenticated
default_backend maintenance_page
backend backend_servers
server server1 192.168.1.100:80 check
userlist AuthUsers
user admin password $6$VZyGz8Lm$J6Qz8YwXZz8YwXZz8YwXZz8YwXZz8YwXZz8YwXZz8YwXZz8YwXZz8YwXZ
For password security, we recommend using encrypted passwords. Here are three ways to generate them:
# Using openssl (for MD5)
openssl passwd -apr1
# Using mkpasswd (for SHA-256/512)
mkpasswd -m sha-256
# Python one-liner
python3 -c 'import crypt; print(crypt.crypt("yourpassword", crypt.mksalt(crypt.METHOD_SHA512)))'
For production environments, consider these enhancements:
frontend https-in
bind *:443 ssl crt /etc/ssl/private/example.com.pem
http-request set-header X-Forwarded-Proto https if { ssl_fc }
acl auth_ok http_auth(AuthUsers)
http-request auth realm "Secure Area" unless auth_ok
http-request deny if !auth_ok
use_backend secure_servers if auth_ok
backend secure_servers
server secure1 10.0.0.42:443 ssl verify none
Key monitoring commands for your HAProxy Basic Auth setup:
# Check authentication stats echo "show stat" | socat /var/run/haproxy.sock stdio | grep FRONTEND # Test authentication curl -v -u username:password http://yourhaproxy.example.com # Debug mode haproxy -d -f /etc/haproxy/haproxy.cfg