Pracuję z administracją systemów na uniwersytecie i natknąłem się na coś, co prawdopodobnie jest powszechne, ale było dla mnie dość szokiem.
Wszystkie katalogi public_html i obszary sieciowe są przechowywane w systemie plików afs, z uprawnieniami do odczytu dla serwerów sieciowych. Ponieważ użytkownicy mogą mieć skrypty php w swoim pliku public_html, oznacza to, że mogą uzyskiwać dostęp do swoich plików z poziomu php (i głównych plików internetowych!).
To sprawia, że ochrona hasłem .htaccess jest całkowicie bezużyteczna, ale pozwala również użytkownikom czytać pliki źródłowe php zawierające hasła do bazy danych mysql i podobne poufne informacje. Lub jeśli stwierdzą, że inne osoby mają katalogi, w których serwery internetowe mają dostęp do zapisu (np. Do dzienników osobistych lub w celu zapisania przesłanych danych formularza), mogą przechowywać pliki na tych kontach.
Prosty przykład:
<?
header("Content-type: text/plain");
print file_get_contents("/afs/example.com/home/smith/public_html/.htpasswd");
?>
Czy to powszechny problem? Jak zazwyczaj to rozwiązujesz?
AKTUALIZACJA:
Dzięki za wkład. Niestety wydaje się, że nie ma prostej odpowiedzi. W dużym wspólnym środowisku, takim jak to, użytkownicy prawdopodobnie nie powinni mieć tak dużego wyboru. Najlepszym podejściem, jakie mogę wymyślić, jest ustawienie „open_basedir” w głównej konfiguracji dla wszystkich katalogów „public_html”, uruchomienie suphp i zezwolenie tylko na czyste php (bez skryptów cgi, uruchamianie zewnętrznych poleceń z backtickami itp.).
Zmiana zasad w ten sposób złamałaby wiele rzeczy i całkiem możliwe, że użytkownicy złapią widły i nas ścigają ... Omówię to z kolegami i zaktualizuję tutaj, jeśli podejmiemy decyzję o zmianie konfiguracji.
źródło
open_basedir
poniższego rozwiązania na produkcyjnych współdzielonych systemach hostingu, ale podzieliliśmy wszystkich na ich własnych vhostów - Nie jestem pewien, czy to działa dla pojedynczych katalogów ...Odpowiedzi:
Można użyć suphp, który uruchamia skrypt php z identyfikatorem użytkownika jego właściciela.
http://www.suphp.org
źródło
check_vhost_docroot
, ale AFAIK dotyczy tylko wykonywanego skryptu (? Mogę się mylić)Moją sugestią byłoby ograniczenie dostępu PHP do plików (poprzez
open_basedir
i podobne dyrektywy, na zasadzie na vhosta): Chcesz, aby użytkownicy mogli otwierać / odczytywać / zapisywać pliki pod ich katalogiem głównym i być może o jeden poziom wyżej (do zera spacja), ale nie katalog, w którym byłyby przechowywane nphtpasswd
. pliki.Struktura katalogów takich jak:
Spełniałby to wymaganie:
open_basedir
może być/Client/site
bezpiecznie wskazany , ahtpasswd
pliki przechowywane w/Client/auth
(z.htaccess
plikami lubhttpd.conf
zmodyfikowane tak, aby wskazywały w odpowiednim miejscu).Zapobiega to otwieraniu plików przez innych klientów ORAZ jako korzyść szkodliwi użytkownicy nie mogą odczytać zawartości
/Client/auth
(ani niczego innego w systemie, np ./etc/passwd
:-)Zobacz http://php.net/manual/en/ini.core.php, aby uzyskać więcej informacji na temat implementacji open_basedir i per-vhost.
źródło
suphp
jak zauważył cstamas, jest to również dobry pomysł w środowisku hostingu współdzielonego - konfiguracja jest trochę obciążona, ale powiedziałbym, że zwiększenie bezpieczeństwa jest całkowicie tego warte. Brak piaskownicy wszystkich stron PHP w więzieniu FreeBSD lub dedykowanej maszynie wirtualnej, która jest jedną z największych wygranych w dziedzinie bezpieczeństwa.open_basedir
wewnątrz dyrektywy <Directory>, ale myślę, że powinna być dopuszczalna („spróbuj i zobacz” - najgorsze, co może zrobić, to nie działa :)Nie, nie jest to częsty problem, ponieważ większość współdzielonych hostów definiowałaby konfigurację open_basedir w pliku htaccess w katalogu public_html każdego użytkownika (lub w vhost, jeśli każdy użytkownik ma swój własny vhost).
np. pliku .htaccess:
Ale upewnij się, że ustawiłeś odpowiednie uprawnienia do pliku .htaccess, aby uniemożliwić użytkownikowi zmianę open_basedir (jeśli spróbują zastąpić go w subdir / .htaccess, nie powinno to działać - ale prawdopodobnie powinieneś to przetestować, aby się upewnić) .
HTH
DO.
źródło
AFS ignoruje proste uprawnienia użytkownika unix. suPHP wykonuje setuid przed uruchomieniem programu php, ale to nie daje procesowi tokenów Kerberos potrzebnych do uzyskania dostępu do AFS i ograniczenia się do jego uprawnień. suPHP musiałby zostać zmodyfikowany w jakiś sposób, aby uzyskać te tokeny, zanim mógłby się zaprezentować w systemie AFS jako ten użytkownik. O ile mi wiadomo, nie zostało to zrobione. (W rzeczywistości znalazłem to pytanie, gdy chciałem sprawdzić, czy zrobił to ktoś inny.)
źródło