2 Stimmen

Apache 2.x auth vor mod_rewrite

Ich habe einen Apache-Server, der ursprünglich für den Intranetzugang eingerichtet wurde, so dass ich mir keine großen Gedanken über die Sperrung machen musste.

Später musste ich ihn für das Internet öffnen, also fügte ich eine ldap-Authentifizierungsanweisung in den Abschnitt der httpd.conf ein, etwa so:

 Order allow,deny

 AuthBasicProvider ldap
 AuthType Basic
 AuthzLDAPAuthoritative on
 AuthName "MyCompany Intranet"
 AuthLDAPURL "ldap://myldapserver.mydomain.com:389/CN=Users,DC=mydomain,DC=com?sAMAccountName?sub?(memberOf=CN=Everyone at MyCompany,OU=MyCompany Groups,DC=mydomain,DC=com)" NONE
 AuthLDAPBindDN "CN=Administrator,CN=Users,DC=mydomain,DC=com"
 AuthLDAPBindPassword "MyPassword"

 Require valid-user

 #Allow from all
 Allow from 192.168.1
 Allow from 10.254.0

 Satisfy any

Dadurch konnten sich lokale Benutzer ohne Kennwort anmelden, während sich externe Benutzer an unserer ADS-Domäne authentifizieren mussten, um Zugang zu erhalten.

Jetzt wird es noch komplizierter.

Ich habe eine Anwendung, die ich laufen lasse, die zwischen Benutzern unterscheidet, indem sie eine cgi-Variable an das Ende einer URL anhängt, also richte ich eine .htaccess-Datei in der Wurzel meiner Webverzeichnisse (/var/www/html) wie folgt ein:

RewriteEngine on
RewriteBase /
RewriteRule ^foo/(.*)$ some/really/long/url/$1?tenant_filter=2 [L]
RewriteRule ^bar/(.*)$ some/really/long/url/$1?tenant_filter=1 [L]

Das funktioniert wirklich gut. Die Kunden geben http://myserver.mydomain.com/foo/file.html ein und die URL führt sie auf magische Weise zu http://myserver.mydomain.com/some/really/long/url/file.html?tenant\_filter=2, während sie nur http://myserver.mydomain.com/foo/file.html sehen.

Genau hier liegt das Problem.

Ich würde gerne definieren getrennt Authentifizierungsparameter für die virtuellen Verzeichnisse /foo und /bar. Egal was ich versuche, die Authentifizierung wird immer durch die ldap-Einrichtung in meiner http.conf überschrieben. Was mache ich falsch und was kann ich tun, um mein Ziel zu erreichen? Ist das überhaupt möglich?

1voto

Keith Mitchell Punkte 31

Die Lösung für dieses Problem bestand darin, in /var/www/html Zielverzeichnisse mit den Namen foo und bar anzulegen. Die Authentifizierung wurde dann für die Verzeichnisse in den Verzeichnissen /etc/httpd/conf.d wie folgt eingerichtet:

<Directory "/var/www/html/bar">    
    AuthBasicProvider ldap
    AuthType Basic
    AuthName "Bar Extranet"
    AuthLDAPURL ldap://myldapserver.mydomain.com:3268/DC=mydomain,DC=com?sAMAccountName?sub?(objectClass=*)
    AuthzLDAPAuthoritative on

    AuthLDAPBindDN "CN=Administrator,CN=Users,DC=mydomain,DC=com"
    AuthLDAPBindPassword "mypassword"

    AuthLDAPGroupAttributeIsDN on

    require ldap-group CN=Bar Kiosk,OU=mycompany Groups,DC=mydomain,DC=com

    Allow from 192.168.1
    Allow from 10.254.0

    Satisfy any
</Directory>

Das Zielverzeichnis des Rewrites wurde so eingestellt, dass es entweder die Authentifizierung von foo oder von bar akzeptiert, wie unten dargestellt:

<Directory /var/www/html/some/really/long/directoryname>
   AuthBasicProvider ldap
   AuthType Basic
   AuthName "mycompany Extranet"
   AuthLDAPURL ldap://myldaphost.mydomain.com:3268/DC=mydomain,DC=com?sAMAccountName?sub?(objectClass=*)
   AuthzLDAPAuthoritative on

   AuthLDAPBindDN "CN=Administrator,CN=Users,DC=mydomain,DC=com"
   AuthLDAPBindPassword "mypassword"

   AuthLDAPGroupAttributeIsDN on

   require ldap-group CN=Domain Users,CN=Users,DC=mydomain,DC=com
   require ldap-group CN=BAR Kiosk,OU=mycompany Groups,CN=Users,DC=mydomain,DC=com

   Allow from 192.168.1
   Allow from 10.254.0

   satisfy any
</Directory>

Obwohl dies sowohl foo als auch bar den Zugriff auf das Zielverzeichnis ermöglicht, ist es für meine Bedürfnisse ausreichend, da das Zielverzeichnis durch den URL-Rewrite-Code verschleiert wird.

Ich habe auch den Code in der Datei /etc/httpd/conf/httpd.conf für die URL-Umschreibungen geändert, um Schleifen zu vermeiden:

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_URI} !^(.*)tenant_filter=1$ [OR]
RewriteCond %{REQUEST_URI} !^(.*)tenant_filter=2$
RewriteRule ^foo/(.*)$ some/really/long/url/$1?tenant_filter=2 [L]
RewriteRule ^bar/(.*)$ some/really/long/url/$1?tenant_filter=1 [L]

Schließlich wurde meine Situation durch die Tatsache kompliziert, dass ich BlueDragon 7.1 für Linux auf diesem Server verwende. Ich habe es in meinem ersten Beitrag nicht erwähnt, aber BD erkannte einige der Änderungen, die ich in meinen Apache-Konfigurationen vornahm, nicht, ohne neu gestartet zu werden. Dies erschwerte den Prozess erheblich.

0voto

outis Punkte 71613

Konfigurationsoptionen für die Autorisierung können in den Abschnitten <Location> und <Directory> platziert werden. Allerdings:

[...] <Location>-Direktiven sollten nicht verwendet werden, um den Zugriff auf Dateisystem-Speicherorte zu kontrollieren. Da mehrere verschiedene URLs auf denselben Dateisystem-Speicherort verweisen können, können solche Zugriffskontrollen umgangen werden.

Das scheint in Ihrem Fall kein Problem zu sein, denn das scheint genau das Verhalten zu sein, nach dem Sie suchen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X