# Apache VHosts in Verzeichnis einsperren



## spex (23. März 2008)

Hi,

ich habe mir jetzt auf meinem Server mal Apache per Hand geladen und kompiliert. Immer mit aptitude zu arbeiten ist irgendwie lame .

Naja gut, geht soweit alles prima.
Jetzt hab ich mal eine phpShell (C99) auf einen von mir zum testen erstellten vHost hochgeladen, um zu sehen was denn nun alles möglich wäre wenn in meinen Server eingebrochen werden würde.

Naja war erstmal keine große Überaschung das man auf alles Zugriff hat was denn dem Benutzer des Apache auch erlaubt ist, das ist in dem Falle "www-data".

*Meine eigendliche Frage:*
Wie ist es nun Möglich das die erstellten vHosts wirklich "NUR" auf ihre Dokumenten Ordner zugriff haben.

Also meine Kunden liegen beispielsweise unter:

```
/var/www
```
Das Verzeichnis könnte nun folgendermaßen aussehen:

```
/var/www/kunde1.de
/var/www/kunde2.de
/var/www/kunde3.de
```
Nun möchte ich das kunde1 wirklich nur auf das Berzeichnis:
/var/www/kunde1
zugreifen kann, Unterverzeichnisse natürlich eingeschlossen.

Für alle anderen Ordner z.B folgende:

```
/
/home
/var
/var/www
/var/www/kunde2
```
soll es ihm nicht möglich sein zu Lesen, Schreiben oder auszuführen.

Eine Meiner Überlegungen war eine Chroot Umgebung, wobei jedoch der Benutzer www-data immernoch Zugriff auf die Dokumenten Verzeichnisse der anderen Kunden hätte. Chmod hätte das gleiche Ergebnis zur Folge.

Soweit ich weiß schafft Plesk es auch das nur der eigendliche Kunde Zugriff auf sein Verzeichnis hat. Ist ja eigendlich auch Grunvoraussetzung für einen Hoster.

Ich hoffe ihr helft mir - Gruß

EDIT: OS: Debian Etch


----------



## Navy (23. März 2008)

An sich solltest Du lieber die getesteten Versionen von Debian bzw. dessen Derivaten verwenden, weil Du dort relativ sicher sein kannst, dass diese gewartet werden. Dein Eigenbau kann Dir unter Umständen auch später Probleme mit Abhängigkeiten anderer Pakete bringen -- aber das nur am Rande.

Um Deine Seiten zu definieren musst Du die "/etc/apache2/sites-available/default" bearbeiten und unter der Definition Deiner Seiten:

        AllowOverride AuthConfig
        AuthType Basic
        AuthName "$YOURNAME"
        AuthUserFile /var/$PASSFILE
        Require valid-user

einsetzen, wobei $PASSFILE für jede Seite unterschiedlich sein muss. Danach solltest Du User und Passwort für die Accounts setzen: "sudo htpasswd -c /var/$PASSFILE $USERNAME".

Solltest Du dann noch Unterseiten userorientiert definieren, dann solltest Du in dem entsprechenden Verzeichnis die ".htaccess" anlegen bzw ändern.

Du solltest Dich jedoch unbedingt die Apache-Doku lesen, dort stehen diese Einstellung detailliert drin, u.A. auch andere Authentifikationsmethoden.


----------



## spex (23. März 2008)

Hi,

ich glaube wir reden aneinander vorbei.
Was du mir da zeigst ist eine ganz normale Authentifizierung per HTTP.

Wenn jetzt ein Cracker daher kommt, oder einfach ein Kunde der meint mal eben eine Shell auf seinen Webspace laden zu müssen, dann hat er ja im Prinzip die Rechte, die auch der "www-data" Benutzer hat.

Damit könnte er also auch alle anderen Verzeichnisse von anderen Kunden einsehen und dessen Daten beliebig verändern.

Das würde ich nun gerne verhindern.

Oder hab ich da was falsch verstanden? Kann ja sein das ich es mir wieder zu kompliziert mache und zich Sachen durcheinander würfel.

Naja ich will ja was lernen, "apt-get install xxx" kann ja im Prinzip jeder eingeben. Dann kommt z.B sowas wie ich bei raus, der zwar glücklich ist das sein Apache läuft, im Prinzip aber keine Ahnung was wie, wo und mit welchen Einstellungen.
Zumal bei der apache Version über apt-get von den offiziellen Servern, garkein mod_rewrite enthalten ist.

Muss mich halt nochmal intensiv damit beschäftigen. Wäre also nett wenn mir jemand sagen könnte wie ich mein Problem lösen kann.

Gruß


----------



## Navy (23. März 2008)

> ich glaube wir reden aneinander vorbei.
> Was du mir da zeigst ist eine ganz normale Authentifizierung per HTTP.

Ja richtig. Allerdings für jede Deiner Seiten seperat.

> Wenn jetzt ein Cracker daher kommt, oder einfach ein Kunde der meint mal eben eine 
> Shell auf seinen Webspace laden zu müssen, dann hat er ja im Prinzip die Rechte, die 
> auch der "www-data" Benutzer hat.

Du erlaubst es den Usern Daten hochzuladen *und* ausführen zu lassen (wieauchimmer) und dann möchtest Du aber, dass sie auf einem Verzeichniss eingesperrt sind und das über http?

> Damit könnte er also auch alle anderen Verzeichnisse von anderen Kunden einsehen 
> und dessen Daten beliebig verändern.

Sofern Du kein grundlegendes Wissen über Apache und Serverabsicherung hast und Du dieses Wissen nicht auf Deinem System anwendest kann Dir erstmal *alles* passieren.

> Das würde ich nun gerne verhindern.
> Oder hab ich da was falsch verstanden? Kann ja sein das ich es mir wieder zu 
> kompliziert mache und zich Sachen durcheinander würfel.

Dann beschreib doch mal genau was Du möchtest.

supersede: Nach mehrmaligen Lesen bin ich auf den Trichter gekommen, dass Du möglicherweise ftp/ssh-Zugriff auf nur eben diese Verzeichnisse meinst. Sollte dem so sein, dann versuche mal bitte Dein Anliegen detailliert zu beschreiben.


----------



## spex (23. März 2008)

Ich möchte:

Das ein Kunde der im Verzeichnis "/var/www/kunde1" liegt, wirklich nur auf dieses Verzeichnis und Unterverzeichnisse, (insb. LESE-) Zugriff hat.
Alle anderen Ordner sind für ihn Tabu und können/sollen nicht eingesehen werden.


----------



## Navy (23. März 2008)

Du änderst den Besitzer des Verzeichnisses:

"sudo chown $USER:www-data /var/www/$DIR -R" und änderst die Zugriffsrechte "sudo chmod 750 /var/www/$DIR".

7 = read, write, execute
5 = read, execute
0 = nichts

HTH

supersede: da ich jetzt zu faul zum Schreiben (und offensichtlich auch zum Lesen bin) - http://www.debian.org/doc/manuals/securing-debian-howto/ap-chroot-ssh-env.de.html(mit der Hoffnung, dass Du Debian verwendest.


----------



## spex (23. März 2008)

Ja, so inetwa hab ich das auch schon gemacht:

chown kunde1:kunde1 /var/www/kunde1
chmod 750 /var/www/kunde1

Jetzt hat der Apache aber mit seinem Benutzer "www-data" keinen Zugriff mehr auf
/var/www/kunde1
und bringt mir einen Fehler "Zugriff verweigert".

Wenn ich den Benutzer www-data wieder der Gruppe "kunde1" zuordne in der Datei /etc/group, dann haben wieder alle Zugriff auf das Verzeichnis.

Außerdem hat der Kunde dann weiterhin leserechte in / oder /home oder /etc bzw allen anderen Ordnern im Dateisystem.


----------------
EDIT:

Mit:

chown kunde1:www-data /var/www/kunde1
chmod 750 /var/www/kunde1

hätte wie du schon gesagt hast, jeder Benutzer in der Gruppe "www-data" wieder Leserechte in /var/www/kunde1.
Also auch in /var/www/kunde2 und /var/www/kunde3.
Käme also auf das Gleiche hinaus.


----------



## ToniCE (24. März 2008)

Also mir fiel als erstes eine "chroot"-Umgebung für den Apachen ein (damit kann er dann schonmal nichts ausserhalb von /var/www anzeigen: z.B. http://www.debian.org/doc/manuals/securing-debian-howto/ap-chroot-apache-env.de.html

Und dann müsste auch für die Benutzer eine "chroot"-Umgebung für ihr home-Verzeichnis eingerichtet werden. Das home ist ja in deinem Fall dann /var/www/kundex. Dafür gibt es sicherlich auch schon genügend Anleitungen im Netz. Ausserdem sollten deine Benutzer eingeschränkt werden, sodass sie nur die nötigsten Programme ausführen dürfen.

Wie man den vhost auf "sein" Verzeichnis beschränkt habe ich auf die schnelle aber nicht gefunden.


----------

