Перенаправление пользователей с помощью Apache и LDAP

Перенаправление пользователей с помощью Apache и LDAP

На работе у нас возникла проблема: мы хотим перенаправлять пользователей в зависимости от того, являются ли они членами определенной группы 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.

Связанный контент