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

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

0 ответов

Другие вопросы по тегам