HAproxy ACL на основе куки-файла сеанса внутреннего приложения для замены 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, который поможет мне сделать эту последнюю часть как-нибудь? Я был бы очень благодарен за это.
С уважением, Джулиан