2016-07-07 23 views
1

Ich habe eine Frage über die Zugriffskontrolle in Apache 2. Ich glaube nicht, dass es relevant ist, aber ich es auf einem Raspberry laufen Pi 2 mit Raspbian.apache2 erlauben nur Benutzer 'x' zu öffnen URL 'example.com/private/x'

Es gibt mehrere Benutzer, die die Website verwenden können. Es gibt jedoch einen Ordner, in dem jeder Benutzer seinen eigenen Ordner hat. Jeder Benutzer sollte nur Zugriff auf seinen eigenen Ordner und keine anderen Ordner haben.

Das Problem, das ich habe ist, dass es scheint, dass die einzige Möglichkeit, dies zu tun ist, jeden Ordner der Konfigurationsdatei hinzuzufügen, die es ziemlich zeitaufwendig macht, einen Benutzer hinzuzufügen. Gibt es einen anderen Weg?


Zur Klarstellung:
Lets sagen, es gibt drei Benutzer: Benutzer x, y und z.
Alle von ihnen Zugang zu https://example.com/, aber keine anderen Benutzer als Benutzer x sollen Zugang zu https://example.com/private/x/ haben, niemand außer Benutzer y sollte Zugang zu https://example.com/private/y/ hat, und nur Benutzer z soll Zugang zu https://example.com/private/z/ haben.
Was ich bisher gemacht und versucht habe:
Ich habe alle Zugriffe auf den Standort /private verweigert, in der Hoffnung, ich könnte dann den verschiedenen Benutzern Zugriff auf ihre jeweiligen Ordner geben.
Ich habe versucht, das zu tun, indem Sie Zugriff auf den Speicherort /private/%{REMOTE_USER}/ und /private/%{REMOTE_IDENT}/ gewähren, die beide nicht funktionierten.
Ich habe auch versucht, eine <If> Direktive zu verwenden, um zu überprüfen, ob die URL auf /private/%{REMOTE_USER}/ abgestimmt ist, aber das hat auch nicht funktioniert.

Ich habe versucht, etwas in der Apache-Dokumentation zu finden, die mir helfen kann, aber ich konnte nichts finden, was mich näher an die Antwort bringen könnte.


Zusammenfassend: ist es möglich, dies ohne Hinzufügen aller Standorte zur Konfigurationsdatei zu tun, und wenn ja, wie ist das möglich?
Vielen Dank im Voraus für Ihre Eingabe, Desirius


PS: Ich habe fast vergessen, und ich bin nicht sicher, ob es relevant ist, aber die Authentifizierung verwendet PAM getan, in etwa die folgende Weise:

<IfModule mod_authnz_external.c> 
    AddExternalAuth pwauth /usr/sbin/pwauth 
    SetExternalAuthMethod pwauth pipe 
    AddExternalGroupMethod unixgroup environment 
</IfModule> 

AuthType Basic 
AuthBasicProvider external 
AuthExternal pwauth 
GroupExternal unixgroup 
Require unix-group www-priv 


Also war ich noch dabei und fand etwas!

Ab 2.4.8 werden benannte Gruppen und Rückverweise erfasst und in die Umgebung mit dem entsprechenden Namen mit dem Präfix "MATCH_" und in Großbuchstaben geschrieben. Dadurch können Elemente von URLs innerhalb von Ausdrücken und Modulen wie mod_rewrite referenziert werden. Um Verwirrung zu vermeiden, werden nummerierte (unbenannte) Rückwärtsreferenzen ignoriert. Benutzt stattdessen benannte Gruppen.

<LocationMatch "^/combined/(?<sitename>[^/]+)"> 
    require ldap-group cn=%{env:MATCH_SITENAME},ou=combined,o=Example 
</LocationMatch> 

(Letzter Teil der LocationMatch directive von der Apache-Dokumentation.)

Nun dachte ich Verwendung dieses auf folgende Weise zu machen:

<LocationMatch "^/private/(?<user>[^/]+)"> 
    Require expr "%{REMOTE_USER} == %{MATCH_USER}" 
</LocationMatch> 

Aber Apache wird nun nicht neu starten. Es wird neu gestartet, wenn die Require Zeile auskommentiert ist, aber nicht anders. Folgendes funktionierte auch nicht:

Also ich suche immer noch diese Frage zu lösen, aber der Fokus hat sich leicht verschoben. Wenn es eine Antwort auf gibt Wie kann ich Require verwenden, um zu überprüfen, ob der authentifizierte Benutzer der Benutzer von einer Variablen ist?, dann würde das möglicherweise die ganze Frage lösen.

Wie immer, danke im Voraus für jede Eingabe!
Desirius

Edit 2:
Ich fand heraus, dass auch Require expr "true" funktioniert nicht. Ich vermute, Require expr, um die Probleme zu erstellen ...

Antwort

1

Ok, ich habe die Antwort gefunden. Gleich nachdem ich meine Frage bearbeitet hatte, fand ich die Bemerkung unter der Nummer Require Directives: Since v2.4.8, expressions are supported within the user require directives..

So erkannte ich, ich könnte einfach Require user "%{env:MATCH_USER}" (zusammen mit dem Teil von meiner Bearbeitung) verwenden.

ein vollständigeres Bild zu geben, ist es das, was die Konfiguration wie jetzt aussieht:

<IfModule mod_authnz_external.c> 
    AddExternalAuth pwauth /usr/sbin/pwauth 
    SetExternalAuthMethod pwauth pipe 
    AddExternalGroupMethod unixgroup environment 
</IfModule> 

AuthType Basic 
AuthBasicProvider external 
AuthExternal pwauth 
GroupExternal unixgroup 
Require unix-group www-priv 

<Location /private> 
    Require all denied 
</Location> 

<LocationMatch "^/radicale/(?<user>[^/]+)"> 
    Require user "%{env:MATCH_USER}" 
</LocationMatch> 

Für jeden, die Zeit, meine Frage zu lesen, nahm ich es Ihnen danken!

Ich hoffe, diese Antwort wird jemand anderen eines Tages helfen.