Większość odpowiedzi tutaj nie jest napisana z myślą o bezpieczeństwie. Dobrze jest mieć wrażenie, że bieganie za sudo
każdym razem nie jest zbyt mądre. Jeśli popełnisz literówkę (na przykład pojedynczą białą spację w niewłaściwym miejscu: sudo rm -rf / var/www/dir
nie wykonuj! ), Możesz zniszczyć swój system.
Uwaga: Począwszy od Apache 2.4.7 / Ubuntu 14.04, /var/www
został przeniesiony, aby odpowiednio /var/www/html
dostosować polecenia w tej odpowiedzi.
Widzieć:
Złe pomysły:
chmod 777
(sagarchalise) - umożliwia to każdemu, kto ma dostęp do twojego systemu, zapis do katalogów i plików, a tym samym pozwala intruzowi na wykonanie dowolnego kodu pod www-data
użytkownikiem
chgrp -R www-data $HOME
(cob) - umożliwia www-data
odczyt lub zapis dowolnych plików w katalogu domowym. Nie chodzi tu o zasadę „najmniejszego przywileju”
chown -R $USER:$USER /var/www
(kv1dr) - chyba że świat ma uprawnienia do odczytu /var/www
, uruchomiony pod nim serwer WWW www-data
nie będzie mógł odczytać (serwować) plików. Jeśli plik jest publicznie dostępnym zwykłym dokumentem HTML, może nie być problemem, jeśli świat może go odczytać. Ale jeśli plik jest plikiem PHP zawierającym hasła, to jest.
UWAGA : w poniższych rozwiązaniach przyznałem www-data
uprawnienia do zapisu. Jednak /usr/share/doc/base-passwd/users-and-groups.txt.gz
stwierdza:
www-data
Niektóre serwery WWW działają jako dane www. Ten użytkownik nie powinien należeć do treści internetowych, ponieważ zaatakowany serwer sieciowy mógłby przepisać witrynę. Dane zapisane przez serwery WWW będą własnością www-data.
Tam, gdzie to możliwe, nie udzielaj uprawnień do zapisu www-data
grupie. www-data
musi tylko być w stanie odczytać pliki, aby serwer mógł je obsłużyć. Jedyny przypadek, w którym www-data
potrzebne są uprawnienia do zapisu, dotyczy katalogów przechowujących przesłane pliki i innych lokalizacji, które należy zapisać.
Rozwiązanie 1
Dodaj się do www-data
grupy i ustaw bit setgid w /var/www
katalogu, aby wszystkie nowo utworzone pliki również dziedziczyły tę grupę.
sudo gpasswd -a "$USER" www-data
Popraw wcześniej utworzone pliki (zakładając, że jesteś jedynym użytkownikiem /var/www
):
sudo chown -R "$USER":www-data /var/www
find /var/www -type f -exec chmod 0660 {} \;
sudo find /var/www -type d -exec chmod 2770 {} \;
(jeszcze bezpieczniejsze: użyj 640
lub 2750
ręcznie, chmod g+w file-or-dir
które muszą być zapisywane przez serwer)
Rozwiązanie 2
Utwórz dowiązanie symboliczne dla każdego projektu do katalogu domowego. Załóżmy, że Twój projekt znajduje się pod adresem ~/projects/foo
i chcesz go mieć /var/www/foo
, uruchom:
sudo ln -sT ~/projects/foo /var/www/foo
Jeśli twój katalog domowy nie ma ustawionego bitu wykonawczego (zejście) dla other
(ze względów bezpieczeństwa), zmień jego grupę na www-data
, ale ustaw tylko bit wykonawczy (bez odczytu / zapisu). Zrób to samo dla ~/projects
folderu, ponieważ może on zawierać inne projekty niż www. (Nie potrzebujesz, sudo
jeśli wcześniej dodałeś swojego użytkownika do www-data
grupy).
sudo chgrp www-data ~ ~/projects
chmod 710 ~ ~/projects
Ustaw grupę www-data
na ~/projects/foo
i pozwolić serwer WWW do odczytu i zapisu do plików i katalogów i plików + zejście do katalogów:
sudo chgrp www-data ~/projects/foo
find ~/projects/foo -type f -exec chmod 660 {} \;
find ~/projects/foo -type d -exec chmod 2770 {} \;
Jeszcze bezpieczniej: używaj domyślnie 640 i 2750 i ręcznie chmod pliki i katalogi, które muszą być zapisywalne przez użytkownika serwera WWW. Bit setgid powinien zostać dodany tylko wtedy, gdy chcesz, aby każdy nowo utworzony plik ~/projects/foo
był dostępny dla grupy.
Od teraz możesz uzyskiwać dostęp do swojej witryny http://localhost/foo
i edytować pliki projektu w ~/projects/foo
.
Zobacz też