
bei der Arbeit haben wir das Problem, dass wir Benutzer abhängig davon, ob sie Mitglied einer bestimmten LDAP-Gruppe sind, umleiten möchten, wenn sie auf eine URL zugreifen, die über Apache2 verwaltet wird.
Es gibt drei Fälle:
- Der Benutzer gibt gültige Anmeldeinformationen an und ist Mitglied der LDAP-Gruppe => Weiterleitung zur Anwendung ABC (funktioniert)
- Der Benutzer gibt gültige Anmeldeinformationen an, ist aber kein Mitglied der LDAP-Gruppe => Weiterleitung zur Wartungsseite (funktioniert nicht und ist das Problem)
- Der Benutzer gibt ungültige Anmeldeinformationen ein oder klickt auf „Abbrechen“ => Weiterleitung zur Wartung (funktioniert)
Unser Problem ist: Wie können wir Benutzer umleiten, wenn sie gültig sind und nicht Mitglied der LDAP-Gruppe „THE-GROUP“ sind?
Derzeit wird das Overlay zur Eingabe der Anmeldeinformationen dauerhaft angezeigt, es sei denn, Sie klicken auf „Abbrechen“ oder sind Mitglied von „THE-GROUP“.
Unsere Anwendung ABC wird in unseren Räumlichkeiten gehostet und läuft auf Ubuntu. Unser Reverse-Proxy ist Apache 2.4.18-2ubuntu3.10, der auf Ubuntu 16.04 läuft. Die Clients verwenden eine Vielzahl von Browsern und Betriebssystemen aus der ganzen Welt, daher ist eine Filterung nach IP keine Option. Der Reverse-Proxy befindet sich in unserer DMZ und der App-Server außerhalb. Es wurde eine NAT-Regel erstellt, sodass beide Systeme über 8080 (den Port, auf dem ABC läuft) kommunizieren können.
Unsere (Test-)Konfiguration sieht folgendermaßen aus:
<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>
Antwort1
Es gibt keine gute Lösung für Ihr Problem. Sie verwenden HTTP Basic Auth, was bedeutet, dass der Browser beim Versuch, eine Seite zu öffnen, einen 401-Status mit einem gesendeten WWW-Authenticate: Basic realm="Whatever"-Header erhält.
An diesem Punkt zeigt der Browser den Authentifizierungsdialog an und sobald Benutzer und Passwort eingegeben wurden, werden sie im Autorisierungsheader an den Webserver gesendet.
Wenn der Server die Anfrage ablehnt, sendet er erneut einen 401-Status mit dem Header WWW-Authenticate. Der Browser öffnet den Dialog endlos erneut. Der Server kann zu keinem Zeitpunkt sagen, dass ein Passwort endgültig abgelehnt wurde.
Wenn Sie eine Datenbank mit mod_dbd-Unterstützung verwenden, können Sie mit mod_rewrite eine SQL-Abfrage für die Gruppe durchführen und entsprechend umleiten. Ich glaube nicht, dass dies mit dem LDAP-Authentifizierungshandler möglich ist.