
На работе у нас возникла проблема: мы хотим перенаправлять пользователей в зависимости от того, являются ли они членами определенной группы LDAP, когда они получают доступ к URL-адресу, управляемому через Apache2.
Есть три случая:
- Пользователь предоставляет действительные учетные данные и является членом группы LDAP => перенаправление в приложение ABC (работает)
- Пользователь предоставляет действительные учетные данные, но не является членом группы LDAP => перенаправление на страницу обслуживания (не работает и является проблемой)
- Пользователь предоставляет недействительные учетные данные или нажимает «Отмена» => перенаправление на страницу «Техническое обслуживание» (работает)
Наша проблема: как перенаправить пользователей, если они действительны и не являются членами группы LDAP «THE-GROUP»?
В настоящее время наложение для ввода учетных данных отображается до тех пор, пока вы не нажмете «Отмена» или не станете участником «THE-GROUP».
Наше приложение ABC размещено в наших помещениях и работает на Ubuntu. Наш обратный прокси-сервер — Apache 2.4.18-2ubuntu3.10, работающий на Ubuntu 16.04. Клиенты будут использовать широкий спектр браузеров и ОС со всего мира, поэтому фильтрация по IP невозможна. Обратный прокси-сервер находится в нашей DMZ, а сервер приложений — снаружи. Было создано правило NAT, чтобы обе системы могли общаться через порт 8080 (порт, на котором работает ABC).
Наша (тестовая) конфигурация выглядит так:
<VirtualHost *:443>
ServerName testabc.company.com
SSLProxyEngine On
SSLEngine On
SSLCertificateKeyFile /etc/ssl/private/our_company.key
SSLCertificateFile /etc/ssl/certs/company_com/fullchain.cer
ErrorLog ${APACHE_LOG_DIR}/LDAP_test_error.log
CustomLog ${APACHE_LOG_DIR}/LDAP_test_access.log combined
# error document shown to unauthorized users
DocumentRoot /var/www/Maintenance_Page
ErrorDocument 401 /TTT/index.html
<Location />
ProxyPass http://internal-vm-name:8080/
ProxyPassReverse http://internal-vm-name:8080/
</Location>
# the following block applies to all proxied content
<Proxy "*">
AuthType Basic
AuthBasicProvider ldap
AuthUserFile /dev/null
AuthName "Auth with our LDAP Server"
# configuration of the mod_authnz_ldap module
AuthLDAPURL "ldap://SOMETHING"
AuthLDAPBindDN "FOO,BAR "
AuthLDAPBindPassword "FOOBAR"
# Only users belonging to group THE-GROUP can access ABC,
# all others will see the error document specified above.
Require ldap-group CN=THE-GROUP,OU=Company,DC=ad,DC=Company,DC=com
</Proxy>
</VirtualHost>
# virtual host required to access images and style-sheets from the error document
<VirtualHost *:80>
ServerName maintenance.company.com
DocumentRoot /var/www/Maintenance_Page
ErrorLog ${APACHE_LOG_DIR}/maintenance -error.log
CustomLog ${APACHE_LOG_DIR}/maintenance.log combined
</VirtualHost>
# redirection from HTTP to HTTPS
<VirtualHost *:80>
ServerName abc.company.com
Redirect Permanent / https://abc.company.com/
Redirect / https://abc.company.com/
</VirtualHost>
решение1
Нет хорошего решения для вашей проблемы. Вы используете HTTP Basic Auth, что означает, что браузер пытается открыть страницу, получает статус 401 с отправленным заголовком WWW-Authenticate: Basic realm="Whatever".
В этот момент браузер отображает диалоговое окно аутентификации, и после ввода имени пользователя и пароля они отправляются на веб-сервер внутри заголовка авторизации.
Если сервер отклоняет запрос, он снова отправит статус 401 с заголовком WWW-Authenticate. Браузер снова будет выводить диалоговое окно и так до бесконечности. Ни в какой момент сервер не может сказать, что пароль отклонен навсегда.
Если бы вы использовали базу данных, поддерживаемую mod_dbd, вы могли бы использовать mod_rewrite для выполнения SQL-запроса для группы и перенаправления соответственно. Я не думаю, что это возможно с обработчиком LDAP Auth.