Zaktualizowano podsumowanie
Katalog / var / www jest własnością, root:root
co oznacza, że nikt nie może go używać i jest całkowicie bezużyteczny. Ponieważ wszyscy chcemy, aby serwer WWW faktycznie działał (i nikt nie powinien logować się jako „root”), musimy to naprawić.
Tylko dwa podmioty potrzebują dostępu.
PHP / Perl / Ruby / Python potrzebują dostępu do folderów i plików, ponieważ tworzą wiele z nich (tj
/uploads/
.). Te języki skryptowe powinny działać pod nginx lub apache (lub nawet innymi rzeczami, takimi jak FastCGI dla PHP).Deweloperzy
Jak uzyskują dostęp? Wiem, że ktoś już to kiedyś robił. Przy tak wielu miliardach stron internetowych można by pomyśleć, że będzie więcej informacji na ten temat.
Wiem, że 777 to pełne uprawnienie do odczytu / zapisu / wykonania dla właściciela / grupy / innej osoby. Nie wydaje się to konieczne, ponieważ daje losowym użytkownikom pełne uprawnienia.
Z jakich uprawnień należy korzystać /var/www
, aby:
- Kontrola źródła, taka jak git lub svn
- Użytkownicy w grupie takiej jak „strony internetowe” ( lub nawet dodani do „danych www” )
- Serwery takie jak apache lub lighthttpd
- I PHP / Perl / Ruby
czy wszyscy mogą tam czytać, tworzyć i uruchamiać pliki (i katalogi)?
Jeśli mam rację, skrypty Ruby i PHP nie są „wykonywane” bezpośrednio - ale przekazywane do tłumacza. Więc nie ma potrzeby wykonywania uprawnień do plików w /var/www
...? Dlatego wydaje się, że prawidłowe zgody byłoby chmod -R 1660
co uczyniłoby
- wszystkie pliki udostępniane przez te cztery podmioty
- wszystkie pliki niewykonalne przez pomyłkę
- całkowicie zablokuj wszystkich pozostałych w katalogu
- ustaw tryb uprawnień na „lepki” dla wszystkich przyszłych plików
Czy to jest poprawne?
Aktualizacja 1: Właśnie zdałem sobie sprawę, że pliki i katalogi mogą wymagać różnych uprawnień - mówiłem o plikach powyżej, więc nie jestem pewien, jakie powinny być uprawnienia do katalogu.
Aktualizacja 2: Struktura folderów /var/www
zmian drastycznie, ponieważ jeden z czterech powyższych podmiotów zawsze dodaje (a czasem usuwa) foldery i podfoldery o głębokości wielu poziomów. Tworzą również i usuwają pliki, do których inne 3 podmioty mogą potrzebować dostępu do odczytu / zapisu. Dlatego uprawnienia muszą wykonać cztery powyższe czynności zarówno dla plików, jak i katalogów. Ponieważ żaden z nich nie powinien potrzebować pozwolenia na wykonanie (patrz pytanie dotyczące ruby / php powyżej), zakładam, że rw-rw-r--
pozwolenie byłoby wszystkim, co jest potrzebne i całkowicie bezpieczne, ponieważ te cztery podmioty są obsługiwane przez zaufany personel (patrz # 2) i wszystkich innych użytkowników na system ma tylko dostęp do odczytu.
Aktualizacja 3: Dotyczy maszyn do rozwoju osobistego i serwerów prywatnych firm. Brak przypadkowych „klientów internetowych”, takich jak współdzielony host.
Aktualizacja 4: Ten artykuł autorstwa slicehost wydaje się najlepiej wyjaśniać, co jest potrzebne do skonfigurowania uprawnień do folderu www. Jednak nie jestem pewien, jak działa apache / nginx użytkownika lub grupy z PHP LUB svn / git i jak je zmienić.
Aktualizacja 5: W końcu (jak sądzę) znalazłem sposób, aby wszystko to zadziałało (odpowiedź poniżej). Nie wiem jednak, czy jest to właściwy i BEZPIECZNY sposób na zrobienie tego. Dlatego zacząłem nagrodę. Osoba, która ma najlepszą metodę zabezpieczenia katalogu www i zarządzania nim, wygrywa.
źródło
Nie jestem pewien, czy to „dobrze”, ale oto, co robię na moim serwerze:
Należy pamiętać, że należy włączyć bit wykonywania w katalogach, aby można było wyświetlić zawartość.
źródło
Po przeprowadzeniu dalszych badań wydaje się, że NARZĘDZIA git / svn NIE stanowią problemu, ponieważ działają tak, jak używa tego użytkownik. (Jednak demony git / svn to inna sprawa!) Wszystko, co stworzyłem / sklonowałem za pomocą git, miało moje uprawnienia, a narzędzie git zostało wymienione, w
/usr/bin
którym pasuje ta teza.Uprawnienia Git rozwiązane.
Wydaje się, że uprawnienia użytkownika można rozwiązać, dodając wszystkich użytkowników potrzebujących dostępu do katalogu www do
www-data
grupy, w której działają apache (i nginx).Wygląda więc na to, że jedna odpowiedź na to pytanie brzmi następująco:
Domyślnie
/var/www
jest własnościąroot:root
i nikt nie może dodawać ani zmieniać tam plików.1) Zmień właściciela grupy
Najpierw musimy zmienić grupę katalogów www, która będzie własnością „www-data” zamiast grupy „root”
2) Dodaj użytkowników do danych www
Następnie musimy dodać bieżącego użytkownika (i każdego innego) do grupy danych www
3) Katalog www CHMOD
Zmień uprawnienia, aby TYLKO właściciel (root) i wszyscy użytkownicy w grupie „www-data” mogli rwx (odczyt / zapis / wykonywanie) plików i katalogów ( nikt inny nie powinien mieć do nich dostępu ).
Teraz wszystkie pliki i katalogi utworzone przez dowolnego użytkownika, który ma dostęp (tj. W grupie „www-data”) będą dostępne do odczytu / zapisu przez apache, a więc php.
Czy to jest poprawne? Co z plikami tworzonymi przez PHP / Ruby - czy użytkownicy danych www mogą uzyskać do nich dostęp?
źródło
Lepkość nie jest dziedziczeniem uprawnień. Lepkość katalogu oznacza, że tylko właściciel pliku lub właściciel katalogu może zmienić nazwę lub usunąć ten plik w katalogu, pomimo uprawnień odmiennych. Tak więc 1777 na / tmp /.
W klasycznym Uniksie nie ma dziedziczenia uprawnień na podstawie systemu plików, tylko na podstawie umask bieżącego procesu. W * BSD lub Linux z setgid w katalogu pole grupy nowo utworzonych plików będzie ustawione tak samo jak pole katalogu nadrzędnego. Aby uzyskać cokolwiek więcej, musisz zajrzeć do list ACL, z „domyślną” listą ACL dla katalogów, które pozwalają odziedziczyć uprawnienia.
Powinieneś zacząć od zdefiniowania: * jakie użytkownicy mają dostęp do systemu * jaki jest twój model zagrożenia
Na przykład, jeśli prowadzisz hosting z wieloma klientami i nie chcesz, aby widzieli się nawzajem plików, możesz użyć wspólnej grupy „webcusts” dla wszystkich tych użytkowników i trybu katalogu 0705. Następnie pliki są obsługiwane przez proces serwera WWW ( nie w „webcusts”) zobaczy Inne perms i będzie dozwolony; klienci nie widzą się nawzajem, a użytkownicy mogą zadzierać z własnymi plikami. Oznacza to jednak, że w momencie, gdy zezwolisz na CGI lub PHP, musisz upewnić się, że procesy działają jako konkretny użytkownik (dobra praktyka i tak, dla wielu użytkowników na jednym hoście, dla odpowiedzialności). W przeciwnym razie klienci mogą zepsuć się nawzajem plikami, korzystając z interfejsu CGI.
Jeśli jednak użytkownik wykonujący witrynę internetową jest taki sam jak jej właściciel, masz problemy z niemożnością ochrony zawartości przed osobami nadużywającymi w przypadku luki w zabezpieczeniach skryptu. Właśnie tam wygrywają dedykowane hosty, dzięki czemu możesz mieć użytkownika wykonawczego innego niż właściciel zawartości statycznej i nie martwić się o interakcje z innymi użytkownikami.
źródło
rename()
,unlink()
), a jedynie działań na samym pliku (open()
). To jest „zwykłe” zachowanie.Uważam, że najlepszym sposobem na to jest użycie list ACL Posix. Są wygodne w obsłudze i oferują wszystkie potrzebne funkcje.
http://en.wikipedia.org/wiki/Access_control_list#Filesystem_ACLs
źródło
Właścicielem pliku powinna być osoba, która go utworzy, a grupą powinny być dane www. Tryb dla katalogów / plików to wtedy ogólnie 755/644. Podczas gdy dla katalogów i plików grupa potrzebuje dostępu do zapisu, mod to 775/664. Załóżmy, że paddy jest deweloperem. W sumie powoduje to:
źródło
Dodając do odpowiedzi @ Xeoncross, myślę, że dobrze byłoby osobno skonfigurować uprawnienia do plików i katalogów.
Umożliwi to programistom tworzenie i modyfikowanie katalogów w katalogu / var / www. Co wydaje się ważne, ponieważ programiści mogą potrzebować utworzyć dodatkowe katalogi lub usunąć katalog, który nie jest już potrzebny.
Umożliwi to także programistom tworzenie i modyfikowanie plików kodu (odczytywanie plików HTML, PHP itp.) Ale nadal pozwoli wszystkim dostęp tylko do odczytu.
źródło