Redirigir usuarios con Apache y LDAP

Redirigir usuarios con Apache y LDAP

En el trabajo tenemos el problema de que queremos redirigir a los usuarios dependiendo de si son miembros de un grupo LDAP en particular, cuando acceden a una URL administrada a través de Apache2.

Hay tres casos:

  • El usuario proporciona credenciales válidas y es miembro del grupo LDAP => redirigir a la aplicación ABC (funciona)
  • El usuario proporciona credenciales válidas, pero no es miembro del grupo LDAP => redirigir a la página de mantenimiento (no funciona y ese es el problema)
  • El usuario proporciona créditos no válidos o hace clic en cancelar => redirigir a Mantenimiento (funciona)

Nuestro problema es: ¿Cómo podemos redirigir a los usuarios, si son válidos y no son miembros del grupo LDAP “THE-GROUP”?

En este momento, la superposición para ingresar las credenciales se muestra ad finitum, a menos que haga clic en cancelar o sea miembro de “EL-GRUPO”.

Nuestra aplicación ABC está alojada en nuestras instalaciones y se ejecuta en Ubuntu. Nuestro proxy inverso es Apache 2.4.18-2ubuntu3.10 ejecutándose en Ubuntu 16.04. Los clientes utilizarán una amplia gama de navegadores y sistemas operativos de todo el mundo, por lo que filtrar por IP no es una opción. El proxy inverso está ubicado en nuestra DMZ y el App-Server ubicado afuera. Se creó una regla NAT para que ambos sistemas puedan comunicarse a través de 8080 (el puerto en el que se ejecuta ABC).

Nuestra configuración (de prueba) se ve así:

<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>

Respuesta1

No existe una buena solución para su problema. Está utilizando autenticación básica HTTP, lo que significa que el navegador está intentando abrir una página y obtiene un estado 401 con un encabezado WWW-Authenticate: Basic kingdom="Whatever" enviado.

En ese momento, el navegador muestra el cuadro de diálogo de autenticación y, una vez ingresados ​​el usuario y la contraseña, se envían al servidor web dentro del encabezado de Autorización.

Si el servidor rechaza la solicitud, enviará nuevamente un estado 401 con el encabezado WWW-Authenticate. El navegador abrirá nuevamente el cuadro de diálogo hasta el infinito. En ningún momento el servidor puede decir que una contraseña ha sido rechazada definitivamente.

Si estuviera utilizando una base de datos respaldada por mod_dbd, podría usar mod_rewrite para realizar una consulta SQL para el grupo y redirigir en consecuencia. No creo que esto sea posible con el controlador de autenticación LDAP.

información relacionada