Izolowanie wirtualnych hostów Apache od reszty systemu

11

Konfiguruję serwer WWW, który będzie hostował wiele różnych stron internetowych jako Apache VirtualHosts, każda z nich będzie miała możliwość uruchamiania skryptów (głównie PHP, możliwe inne).

Moje pytanie brzmi: w jaki sposób izoluję każdy z tych VirtualHostów od siebie nawzajem i od reszty systemu? Nie chcę, aby np. Strona X odczytywała konfigurację strony Y lub któregokolwiek z „prywatnych” plików serwera.

W tej chwili skonfigurowałem VirtualHosts z FastCGI, PHP i SUExec, jak opisano tutaj ( http://x10hosting.com/forums/vps-tutorials/148894-debian-apache-2-2-fastcgi-php-5-suexec -easy-way.html ), ale SUExec uniemożliwia użytkownikom edycję / wykonywanie plików innych niż ich własne - użytkownicy nadal mogą czytać poufne informacje, takie jak pliki konfiguracyjne.

Myślałem o usunięciu globalnego uprawnienia odczytu UNIX dla wszystkich plików na serwerze, ponieważ rozwiązałoby to powyższy problem, ale nie jestem pewien, czy mogę to bezpiecznie zrobić bez zakłócania działania serwera.

Zastanawiałem się również nad użyciem chroot, ale wydaje się, że można to zrobić tylko dla poszczególnych serwerów, a nie dla hostów wirtualnych.

Szukam sugestii, które odizolują moje VirtualHosts od reszty systemu.

PS Używam serwera Ubuntu 12.04

Moja ODPOWIEDŹ: Skończyłem z prawie śledzeniem mojej bieżącej konfiguracji, ale zrobieniem więzienia chroot dla wszystkich hostów wirtualnych, np. Mając więzienie chroot, /var/wwwa następnie przechowując dane wszystkich użytkowników w podfolderach, każdy z uprawnieniami grupy / innych r / w / x niepełnosprawny. Ta opcja była pożądana, zwłaszcza że jest to możliwe bez żadnych modyfikacji kodu źródłowego.

Wybrałem odpowiedź @Chris, ponieważ została dokładnie napisana, a także rozważała FTP i SELinux

Jesper B.
źródło

Odpowiedzi:

4

Można to zrobić, włączając moduł mod_users w Apache.

Musisz skonfigurować UserDir w konfiguracji Apache. Sugeruję zrobienie tego w osobnym pliku konfiguracyjnym i dołączenie go. Zawiń dołączenie w

<IfModule mod_users.c>
   Include conf/extra/userdir.conf
</IfModule>

Mogę dać ci cały samouczek, ale powinienem zacząć od konfiguracji Apache: http://www.techytalk.info/enable-userdir-apache-module-ubuntu-debian-based-linux-distribution/

Wskazówka: jeśli używasz SELinuksa (i powinieneś), musisz dać Apacheowi dostęp do odczytu do domów użytkowników. Możesz to zrobić, ustawiając:

sudo setsebool -P httpd_enable_homedirs=On

Potrzebuje również uprawnień do plików do katalogu katalogów publicznych katalog_użytkownika użytkownika oraz uprawnień rx w katalogach nadrzędnych do katalogu głównego.

Oczywiście musisz skonfigurować chroot dla użytkowników, na przykład w vsftpd. Zainstalować:

apt-get vsftpd

Aby skonfigurować chrooting otwórz /etc/vsftpd/vsftpd.conf za pomocą vi lub nano. Znajdź i odkomentuj lub dodaj: chroot_local_user = yes

Możesz uzyskać takie samo zachowanie dla sftp, które polecam przez FTP, otwórz / etc / ssh / sshd_config i dodaj blok dopasowania i ten wiersz:

Subsystem   sftp    internal-sftp

Match Group web_users
    ChrootDirectory %h
    ForceCommand internal-sftp
    AllowTcpForwarding no
Match

Spowoduje to chrootowanie dowolnego użytkownika w grupie web_users . Musisz także odmówić dostępu do powłoki, ustawiając ją na / sbin / nologin:

useradd -G "web_users" -s /sbin/nologin new_user

Jeśli ma to być publiczny serwer produkcyjny, stanowczo zalecam także zastosowanie hartowania w systemie operacyjnym, OpenSSH, Apache, PHP, vsftpd oraz zastosowanie ścisłych iptables i opakowań TCP. Polecam również pozostawić SELinux na miejscu.

Chris
źródło
3
Nie wiem, jak mod_userdiroferuje wirtualny hosting oddzielnych domen. Ponadto mam obawy dotyczące bezpieczeństwa w związku z izolacją, ponieważ nie jestem w stanie znaleźć niczego na ten temat między katalogami użytkowników w Apache. Wygląda na to, że nie oferuje tej funkcji.
gertvdijk
6

Proponuję przyjrzeć suphplub PHP-FPM .

Zasadniczo umożliwi to interpreterowi PHP „su” dla określonego użytkownika skonfigurowanego dla tego VirtualHost. To pozwoli ci wykorzystać ogólne uprawnienia systemu plików do odizolowania każdego VirtualHost.

Polecam FPM ze względu na wydajność. Ze strony głównej najbardziej Cię interesują:

Interesujące są również opcje użytkownika i grupy dla puli, które pozwalają uruchamiać tę konkretną pulę fpm pod danym identyfikatorem UID i GID; do widzenia, suphp!

gertvdijk
źródło
4

Zajrzyj do chroot.

Niektóre punkty początkowe:

Chrootowanie Apache stało się proste

Środowisko chroot dla Apache (Debian)

Więzienie Apache Chroot: wirtualny hosting

wtorek
źródło
1
Patrzyłem na te linki, ale nie wydaje mi się, że mogę chrootować na zasadzie wirtualnego hosta. Może powinienem zdefiniować globalny katalog www do chrootowania /var/wwwi mieć wszystkie hosty w tym podkatalogu, każdy z tych podkatalogów usunął globalne uprawnienia do wykonywania / odczytu?
JesperB
Moim głównym celem było to chroot, że można to zrobić na serwerze wirtualnym. Oto przykład. W tym przypadku używają mod_chroot.
tacot wtorek