Maszyna na której kilkunastu użytkowników uruchamia swoje aplikacje php.
Dwie opcje:
Włączamy mechanizm pozwalający skryptom php działać z uprawnieniami użytkownika, który jest ich właścicielem (np. suphp).[list:07d057e7cc]+ aplikacja jednego użytkownika nie może grzebać w plikach należących do innego
+ pliki tworzone przez skrypty php mogą być usuwane/zmieniane przez ftp i vice-versa
- skrypty php mają prawa do modyfikowania samych siebie
- znacznie gorsza wydajność
[*]Zostawiamy domyślną konfiguracje. Skrypty php działają z uprawnieniami użytkownika www-data.
+ skrypty php mogą zmieniać tylko utworzone przez siebie pliki
+ mniej problematyczna konfiguracja
- brak uprawnień do nadpisywania eFTePem plików stworzonych przez aplikacje php
- skrypty php jednego użytkownika mogą grzebać w plikach innego
Ten ostatni minus jest znaczący. Jeżeli aplikacja jednego z użytkowników będzie zawierała lukę to włamywacz prawie automatycznie zyskuje dostęp do wszystkich pozostałych. Czy to zagrożenie da się jakoś ograniczyć? Jak to rozwiązują dostawcy usług hostingowych?[/list :07d057e7cc]Który wariant byście wybrali? A może jest jakieś lepsze rozwiązanie? Czy ma sens uruchomienie osobnej instancji apache dla każdego użytkownika?
Trochę poeksperymentowałem i stanęło na czymś takim:
1. Nie bawię się w żadne suphp itp. Php mam uruchomione jako moduł Apache. Zależy mi na wydajności, a ramu maszyna ma więcej niż potrzebuje.
2. Użytkownicy tworzą pliki chmod 640. Użytkownik www-data należy do grup wszystkich użytkowników. Tym sposobem użytkownicy nie mogą grzebać nawzajem w swoich plikach, a mimo to strony mogą być serwowane przez serwer php. Użytkownicy mogą manipulować plikami tworzonymi przez www-data bo są właścicielami katalogów, w których są tworzone te pliki.
3. Problem dostępu do plików innych przez spreparowany skrypt php rozwiązuje dyrektywa open_basedir definiowana dla każdego vhosta oddzielnie. Dodatkowo zastosowałem bardzo restrykcyjne ograniczenia używanych funkcji za pomocą suhosin (function blacklist). Zwykłe disable_function się nie sprawdza bo nie można różnicować uprawnień (per vhost).