HAproxy ACL com base no cookie de sessão de aplicativo de backend para substituir a autenticação básica de HTTP

1

Eu precisaria de alguma ajuda sobre a configuração do HAproxy para ignorar a autenticação básica HTTP e permitir que o usuário use um back-end específico, caso haja um cookie de sessão válido presente em outro aplicativo de back-end.

Eu consegui trabalhar em geral usando a seguinte configuração na minha definição de front-end:

# Monitor application response headers for keywords and update user ACL
acl has_disallowAPPUser res.hdr(X-APP-DisallowUser) -m found
acl has_allowAPPUser        res.hdr(X-APP-AllowUser) -m found
http-response del-acl(/var/lib/haproxy/app_user_sessions.acl) %[res.hdr(X-APP-DisallowUser)] if has_disallowAPPUser
http-response add-acl(/var/lib/haproxy/app_user_sessions.acl) %[res.hdr(X-APP-AllowUser)] if has_allowAPPUser

# Monitor application response headers for keywords and update admin ACL
acl has_disallowAPPAdmin    res.hdr(X-APP-DisallowAdmin) -m found
acl has_allowAPPAdmin       res.hdr(X-APP-AllowAdmin) -m found
http-response del-acl(/var/lib/haproxy/app_admin_sessions.acl) %[res.hdr(X-APP-DisallowAdmin)] if has_disallowAPPAdmin
http-response add-acl(/var/lib/haproxy/app_admin_sessions.acl) %[res.hdr(X-APP-AllowAdmin)] if has_allowAPPAdmin

# Check session cookie
acl is_appuser_session req.cook(PHPSESSID) -f /var/lib/haproxy/app_user_sessions.acl
acl is_appadmin_session req.cook(PHPSESSID) -f /var/lib/haproxy/app_admin_sessions.acl

# Monitor last session activity
http-request del-map(/var/lib/haproxy/app_user_sessions.map) %[req.cook(PHPSESSID)] if is_appuser_session
http-request set-map(/var/lib/haproxy/app_user_sessions.map) %[req.cook(PHPSESSID)] %[date()] if is_appuser_session
http-request del-map(/var/lib/haproxy/app_admin_sessions.map) %[req.cook(PHPSESSID)] if is_appadmin_session
http-request set-map(/var/lib/haproxy/app_admin_sessions.map) %[req.cook(PHPSESSID)] %[date()] if is_appadmin_session

# Do not show X-APP headers to the frontend user
rspidel ^X-APP-DisallowUser:.* if has_disallowAPPUser
rspidel ^X-APP-AllowUser:.* if has_allowAPPUser
rspidel ^X-APP-DisallowAdmin:.* if has_disallowAPPAdmin
rspidel ^X-APP-AllowAdmin:.* if has_allowAPPAdmin

# route to backend
use_backend bk_appuser-via-session if is_appadmin_uri is_appuser_session
use_backend bk_appadmin-via-session if is_appadmin_uri is_appadmin_session
use_backend bk_appuser-via-httpauth if is_appadmin_uri
use_backend bk_appadmin-via-httpauth if is_appadmin_uri

Isso permite o acesso direto ao aplicativo de backend, caso o aplicativo PHP tenha criado com sucesso uma sessão de usuário e enviado os cabeçalhos X-APP apropriados.

Aqui é onde eu preciso de ajuda:

Para limpar ACLs antigas, o cron recarrega o HAproxy a cada 5 minutos. Isso interrompe as sessões ativas e o usuário retornaria à autenticação básica até que ele recarregasse uma página do aplicativo PHP principal.

Portanto, minha ideia era rastrear qualquer atividade de usuário por sessão junto com um timestamp para que eu pudesse gravar qualquer sessão com menos de 15 minutos em /var/lib/haproxy/app_user_sessions.acl de dentro do meu script de recarga do cron HAPoxy. O HAproxy seria capaz de ler as sessões existentes a partir de cada atualização, para que as sessões existentes não sejam interrompidas.

Infelizmente, não consigo executar as definições do mapa, pois não obtenho nenhum resultado obtendo seu conteúdo via soquete de administração do HAproxy (usando o HAtop para verificação manual).

Haveria algum geek do HAproxy para me ajudar a fazer essa última parte de alguma forma? Eu ficaria muito grato por isso.

Atenciosamente, Juliano

    
por Julian Pawlowski 29.10.2014 / 15:30

0 respostas