
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.