Назад | Перейти на главную страницу

HAproxy ACL на основе cookie сеанса серверного приложения для замены HTTP Basic Auth

Мне понадобится помощь в настройке HAproxy, чтобы обойти базовую аутентификацию HTTP и позволить пользователю использовать конкретный бэкэнд в случае, если есть действительный файл cookie сеанса из другого бэкэнд-приложения.

Я получил его в целом, используя следующую конфигурацию в моем определении внешнего интерфейса:

# 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

Это обеспечивает прямой доступ к внутреннему приложению в случае, если приложение PHP успешно создало пользовательский сеанс и отправило соответствующие заголовки X-APP.

Вот где мне нужна помощь:

Чтобы очистить старые ACL, cron перезагружает HAproxy каждые 5 минут. Это отбрасывает активные сеансы, и пользователь будет возвращаться к базовой аутентификации, пока не перезагрузит страницу из основного приложения PHP.

Поэтому моя идея заключалась в том, чтобы отслеживать любую активность пользователя за сеанс вместе с меткой времени, чтобы я мог записывать любые сеансы младше 15 минут в /var/lib/haproxy/app_user_sessions.acl из моего сценария перезагрузки cron HAproxy. После этого HAproxy сможет читать существующие сеансы оттуда после каждой перезагрузки, чтобы существующие сеансы не прерывались.

К сожалению, я не могу запустить определения карт, поскольку я не получаю результата, получая их содержимое через сокет администратора HAproxy (используя HAtop для ручной проверки).

Будет ли какой-нибудь настоящий компьютерщик HAproxy, который поможет мне как-нибудь закончить эту последнюю часть? Я был бы очень благодарен за это.

С уважением, Джулиан