Problemy z uprawnieniami z / var / www / html i mojego własnego katalogu domowego dla katalogu głównego dokumentu witryny

34

Próbuję nie udzielać uprawnień 777 w moim /var/www/htmlfolderze, ale chcę edytować moje pliki bez sudo. Więc pomyślałem o utworzeniu dowiązania symbolicznego folderu w moim katalogu domowym /var/www/html. Utworzyłem go za pomocą sudo ln -sT /home/andre/www/moodle/ moodle, a ls -lawynik jest następujący:

andre@andre-270E5G:/var/www/html$ ls -la
total 8
drwxr-xr-x 2 root root 4096 Mai  4 10:20 .
drwxr-xr-x 4 root root 4096 Abr 29 14:29 ..
lrwxrwxrwx 1 root root   23 Mai  4 10:20 moodle -> /home/andre/www/moodle/

Zatem mój folder moodle ma uprawnienia do odczytu, zapisu i wykonywania dla wszystkich, i nie tego chcę. Użyłem polecenia, sudo chmod -R 775 moodle/próbując je zmienić, ale pozostało ono przy uprawnieniach do odczytu, zapisu i wykonywania dla wszystkich. Próbowałem tego samego z folderem Moodle w /home/andre/www/moodle, ale pozostał taki sam. Wyjście ls -laIN /home/andre/www/jest:

andre@andre-270E5G:~/www$ ls -la
total 28
drwxrwxr-x  3 andre andre  4096 Mai  4 10:02 .
drwx------ 49 andre andre 20480 Mai  4 10:01 ..
drwxrwxr-x 41 andre andre  4096 Mai  4 10:02 moodle

Tak więc folder moodlew /home/andre/www/ma uprawnienia, których chcę.

Jako dodatkowy problem, kiedy uzyskuję dostęp localhost/moodle, otrzymuję błąd 403 Forbidden.

Co ja tu robię źle?

André Carvalho
źródło

Odpowiedzi:

63

Nigdy nie powinieneś prowadzić strony internetowej z katalogu domowego . ZAWSZE. W przeciwnym razie serwer sieciowy miałby możliwość przechodzenia przez strukturę katalogów, ale także do (katalogu domowego użytkownika, gdzie możemy spróbować zobaczyć, co jeszcze istnieje w katalogu użytkownika), a także innych podfolderów tam. Źle skonfigurowany lub źle skonfigurowany lub niepoprawny serwer sieciowy może w ten sposób spowodować masowy wyciek danych lub utratę danych uwierzytelniających, co naraziłoby Twoje dane osobowe i dane logowania na różne rzeczy. Podejście do dowiązania symbolicznego nie pomaga ani z tego samego powodu, co próba nadania Apacheowi uprawnień do odczytu- serwer WWW musi mieć możliwość przeglądania twojego katalogu domowego, aby dostać się do lokalizacji, w której znajduje się dowiązanie symboliczne/home//home/$USER//home/andre/www/moodle/var/www/html wskazywanej , co nadal stanowi zagrożenie bezpieczeństwa.

Po pierwsze, użyj sudo cp -r /home/andre/www/moodle/ /var/www/html/. Spowoduje to skopiowanie twoich plików do /var/www/htmltwojego katalogu domowego. Następnie powtórzymy uprawnienia, abyś ty i serwer sieciowy mieli dostęp do wszystkiego w tym katalogu i dali użytkownikowi pełny odczyt / zapis do wszystkich plików i katalogów. Wtedy będziesz musiał poćwiczyć tylko /var/www/htmldla swojej witryny.

Dzieje się tak, cztery kroki po skopiowaniu danych z powrotem do /var/www/html:

  1. Daj Apacheowi dostęp do folderów i plików, aby mógł obsługiwać witrynę bez błędów 403.
  2. Daj swojemu właścicielowi „właściciela” nad plikami i folderami oraz daj sobie do odczytu / zapisu do wszystkich plików i folderów, a także możliwość przeglądania katalogów.
  3. (Opcjonalne, ale zalecane) Ustaw tak, aby wszystkie pliki lub foldery utworzone odtąd w całej strukturze katalogów miały ustawioną grupę www-data.
  4. (Opcjonalnie) Ostateczne czyszczenie zabezpieczeń, w którym konfigurujemy uprawnienia, aby użytkownik i serwer sieciowy mogli zobaczyć dane witryny, ale inni użytkownicy nie mogą uzyskać dostępu do plików ani struktury katalogów witryny.

(1) Zezwól Apacheowi na dostęp do folderów i plików.

sudo chgrp -R www-data /var/www/html
sudo find /var/www/html -type d -exec chmod g+rx {} +
sudo find /var/www/html -type f -exec chmod g+r {} +

To rekurencyjnie ustawia „grupę” www-datadla folderów i plików. Daje to następnie serwerowi sieci Web uprawnienia do rekurencji i uzyskania dostępu do struktury katalogów głównych dokumentów serwisu (+x tylko dla katalogów). Następnie zapewnia również, że serwer WWW ma uprawnienia do odczytu wszystkich plików, dzięki czemu można odbierać dane witryny.

Mogą wystąpić sytuacje, w których trzeba zezwolić serwerowi sieciowemu na zapis do pliku lub katalogu - można to zrobić, wykonując sudo chmod g+w /var/www/html/PATH(gdzie PATHjest ścieżka do pliku lub folderu w strukturze katalogów, w której należy zastosować uprawnienia do zapisu dla serwera WWW).

OSTRZEŻENIE : Istnieje wiele przypadków, w których może to ujawnić „bezpieczne” informacje o konfiguracji witryny (takie jak poświadczenia dostępu do bazy danych itp.), A użytkownik powinien usunąć „inne” uprawnienia dostępu do tych danych w poszczególnych plikach lub katalogach za pomocą następujące: sudo chmod o-rwx /var/www/html/FILEPATH(zastępując FILEPATHścieżkę względem /var/www/htmlfolderu dla pliku).

Należy również pamiętać, że może być konieczne ponowne uruchomienie tych poleceń w przyszłości, jeśli „nowe pliki” napotkają problemy 403, aby nadać serwerowi internetowemu prawidłowe uprawnienia, aby móc nadal uzyskiwać dostęp do plików i folderów tworzonych lub kopiowanych i nie www-dataustawiają poprawnie grupy.


(2) Nadaj właścicielowi uprawnienia do odczytu / zapisu do folderów i plików oraz zezwól na dostęp do folderów w celu przejścia przez strukturę katalogów.

sudo chown -R USER /var/www/html/
sudo find /var/www/html -type d -exec chmod u+rwx {} +
sudo find /var/www/html -type f -exec chmod u+rw {} +

Zastąp USERw pierwszym poleceniu własną nazwę użytkownika!

Robimy tutaj trzy rzeczy. Po pierwsze, tworzymy użytkownika, który będzie „właścicielem” wszystkich plików i katalogów w /var/www/html. Następnie ustawiamy uprawnienia do odczytu i zapisu w folderach i zezwalamy na dostęp do folderów, aby do nich wejść ( +xpozycja w elementach katalogu). Następnie ustawiamy wszystkie pliki, aby miały uprawnienia do odczytu / zapisu dla właściciela, które właśnie ustawiliśmy.


(3) (Opcjonalnie) Upewnij się, że każdy nowy plik jest tworzony www-datajako użytkownik „dostępu”.

sudo find /var/www/html -type d -exec chmod g+s {} +

To ustawia bit „set gid” dla grupy w katalogach. Pliki i foldery utworzone w tych katalogach zawsze będą miały www-datajako grupę, umożliwiając dostęp do serwera WWW.


(4) (opcjonalnie) Ostateczne czyszczenie zabezpieczeń, jeśli nie chcesz, aby inni użytkownicy mogli widzieć dane

Potrzebujemy twojego użytkownika, aby zobaczyć katalogi i pliki. Potrzebujemy do tego również serwera WWW. Możemy nie chcieć, aby inni użytkownicy systemu (oprócz roota) widzieli dane. Więc nie dajmy im tego dostępu i spraw, aby tylko twój użytkownik i serwer sieciowy mogli zobaczyć dane.

sudo chmod -R o-rwx /var/www/html/

UWAGA: Nie będziesz musiał ponownie uruchamiać tego później ani edytować uprawnień dla kategorii „inne” uprawnień tutaj. Jeśli „inni” użytkownicy nie mogą się dostać /var/www/html/(nie mają wymaganego +xbitu)/var/www/html aby przejść do struktury +rplików i struktury katalogów, ani bitu do odczytania list plików), wówczas uprawnienia dla elementów w tym katalogu dla innych użytkowników lub grupy tak naprawdę nie będą miały większego znaczenia.


Jest też nieco mniej inwazyjne rozwiązanie tego problemu, chociaż nie gwarantuje się, że będzie działać dla wszystkich nowych plików, ani nie będzie działać na wszystkich systemach plików , w tym na listach kontroli dostępu do plików. To pozwala pozostawić własność plików www-datana rzeczy, ale daje skuteczne prawa właściciela, do wszystkich celów i celów, nawet jeśli osobiście nie jesteś właścicielem plików.

To rozwiązanie jest nieco mniej inwazyjne i pozwala na posiadanie katalogu i wszystkich plików będących własnością www-data:www-datalub, root:www-dataale także daje ci dostęp. Korzysta z list kontroli dostępu , dzięki czemu wielu użytkowników ma uprawnienia bez konfigurowania poszczególnych grup. Pozwala to również narootwww-data użytkownikom lub użytkownikom systemu na posiadanie plików, ale pozwala także dodawać dodatkowe uprawnienia dla poszczególnych przypadków i dostosowywać uprawnienia dla niektórych użytkowników, aby mogli czytać, ale nie edytować, i tak dalej.

Zakładając, że nadal pracujemy /var/www/html/i nie chcemy, aby szpiegujący użytkownicy inni niż my i system (i root oczywiście) widzieli nasze dane, musimy wykonać następujące czynności:

  1. Oddaj własność użytkownikowi systemu serwera WWW www-data .
sudo chown -R www-data: www-data / var / www / html
  1. Rekurencyjnie daje ci możliwość odczytu / zapisu plików, jednocześnie dając innym użytkownikom (wyłączając www-datai rootoczywiście) dostęp do plików.
sudo find / var / www / html -type f -exec setfacl -mu: NAZWA UŻYTKOWNIKA: rw -m inny :: --- {} \;
  1. Rekurencyjnie daj sobie odczyt / zapis / przeglądanie katalogów, usuń dostęp do folderów dla innych użytkowników (z wyłączeniem www-datai root) i ustaw to jako „domyślną” listę ACL dla nowych plików w katalogach.
sudo find / var / www / html -type d -exec setfacl -d -mu: NAZWA UŻYTKOWNIKA: rwx -mo :: --- {} \;
  1. Musimy także ustawić setgidbit dla wszystkich katalogów, aby po utworzeniu pliku serwer WWW nadal mógł uzyskać do niego dostęp, jak www-dataza pośrednictwem uprawnień grupy.
sudo znajdź / var / www / html -type d -exec chmod g + x {} \;

A teraz masz dostęp do wszystkich katalogów i nie musiałeś odbierać dostępuwww-data którego pomoc może, ponieważ serwer WWW może nadal tworzyć pliki wszędzie tam, gdzie jest to potrzebne (takie jak interfejsy oparte na PHP, mające własne katalogi pamięci podręcznej itp. do utworzenia i zapisania w celu prawidłowego działania).

Jedyne zastrzeżenie: jeśli ręcznie tworzysz nowe pliki, musisz je odpowiednio zmienić, aby nadać serwerowi własność. To proste sudo chown www-data:www-data filename, a listy kontroli dostępu powinny nadal zapewniać skuteczne prawa właściciela pliku.

Istnieje wiele przypadków, w których musiałem to zrobić jako administrator systemu dla pewnego rodzaju niestandardowego dostępu bez zmiany właścicieli danego pliku. Działa to, ale ma własne problemy, ponieważ nie każdy system plików obsługuje listy dostępu do plików.

Thomas Ward
źródło
2
@ AndréCarvalho +xdo plików dawałby uprawnienia do plików wykonywalnych i nie chcemy, aby pliki PHP były wykonywane, koniecznie za pomocą wiersza poleceń PHP lub jako pliki wykonywalne na samym serwerze - chcemy, aby były przetwarzane przez parser PHP na serwerze WWW (i my nie potrzebujesz plików PHP, aby +xparser PHP mógł je odczytać i przetworzyć). Katalogi potrzebują +x, aby umożliwić przechodzenie przez katalogi - to znaczy, jeśli katalog nie jest, +xa ja nie jestem rootem, nie mogę dostać się do katalogu, co jest problemem z Apache, który nie działa z twoimi dowiązaniami symbolicznymi i twoim domem informator.
Thomas Ward
1
@ AndréCarvalho www-datajest grupą systemową - nie jest to grupa dla zwykłych użytkowników.
Thomas Ward
1
@JunaidQadirShekhanzai Niemożliwe do zapewnienia, ponieważ ustawienia ludzi różnią się znacznie od potrzebnego środowiska i wielu innych czynników. Taki „plik powłoki” byłby niemożliwy do wyprodukowania, biorąc pod uwagę, że istnieją komponenty opcjonalne . Mógłbym spróbować stworzyć skrypt w Pythonie, który mógłby to zrobić, ale wciąż napotykamy ograniczenia systemowe, zadania opcjonalne, różne ścieżki itp.
Thomas Ward
1
@ T.Todua to nie to, co powiedziałem. Powiedziałem, że nigdy nie powinno się uruchomić witrynę OUT (czytaj: od wewnątrz) swój „domowy” - to znaczy, że nic nie powinno działać w /home/USER/...na serwerze internetowym. Źle odczytałeś i źle zrozumiałeś słowa, których używam. /var/www/*jest względnie „bezpiecznym” miejscem do uruchamiania stron internetowych, ponieważ jest to dedykowany folder / przestrzeń dla niego. Jednakże, /var/www/htmlnie jest bezpieczne, ponieważ jest on zapisywany na serwerach przez zainstalowanie i takich i prowadzi do przebijania ważnych danych (a więc stosowanie /var/www/SUBDIRECTORYindywidualnych subdirs miejscu zamiast)
Thomas Ward
1
Poprawiłem sformułowanie, aby było jasne.
Thomas Ward
2

Cały pomysł użycia dowiązań symbolicznych do rozwiązania problemu z uprawnieniami jest wadliwy i nie może działać. Uprawnienia pokazane dla samego dowiązania symbolicznego są w większości nieistotne, nie można ich używać do obchodzenia uprawnień do katalogu „rzeczywistego”. Utworzenie dowiązania symbolicznego od /var/www/html/moodledo /home/andre/www/moodle/nie obchodzi uprawnień dla /home/andre/www/moodle/. Każdy, kto chce robić różne rzeczy, /var/www/html/moodlemoże to zrobić tylko wtedy, gdy ma niezbędne uprawnienia /home/andre/www/moodle/.

Twoje wykonanie sudo chmod -R 775 moodle/faktycznie miało efekt, ale inaczej niż myślałeś, że nie zmieniło to pozwolenia na dowiązanie symboliczne, ale na cel dowiązania symbolicznego /home/andre/www/moodle/.

Błąd 403, który pojawia się na serwerze internetowym, jest prawdopodobnie spowodowany tym, że twój serwer nie ma niezbędnych uprawnień do wejścia /home/andre. Nie jest to „dodatkowy problem”, ale z powodu tych samych problemów z uprawnieniami.

Zamiast korzystać z dowiązań symbolicznych, musisz dowiedzieć się, jakie uprawnienia pozwalają na edycję plików i dostęp do nich przez serwer WWW (lub nawet ich edycję, w zależności od aplikacji). To, jakie dokładnie są te uprawnienia, zależy od dokładnego przypadku użycia (konfiguracji aplikacji i serwera).

Ogólnie myślę, że dobrym pomysłem jest posiadanie plików i posiadanie uprawnień rw, serwer WWW ma dostęp tylko do odczytu plików za pośrednictwem uprawnień grupy, a wszyscy inni użytkownicy nie mają żadnego dostępu.

Przykład pozwolenia (który może nie działać w twoim przypadku użycia z powodu brakujących informacji):

andre@fermat:/var/www/html$ ls -al moodle/
total 0
drwxr-x--- 2 andre www-data 60 mai  4 16:20 .
drwxr-xr-x 3 root  root     80 mai  4 16:20 ..
-rw-r----- 1 andre www-data  0 mai  4 16:20 index.html

Możesz zobaczyć, że katalog ma wystarczający dostęp dla Ciebie jako właściciela, aby go wprowadzić i zmodyfikować jego zawartość, serwer WWW (w grupie www-data) może wejść i czytać. Same pliki są czytelne i do zapisu dla ciebie (właściciela) i do odczytu na serwerze internetowym (w grupie www-data). Wszyscy pozostali użytkownicy nie mają żadnego dostępu.

Ponownie, weź to tylko jako przykład. Dokładny użytkownik / grupa serwera WWW zależy od konfiguracji. A twoja aplikacja (moodle) może wymagać różnych uprawnień, musisz zajrzeć do jej dokumentacji.

mastov
źródło
Zgadzam się, ale nie jest to zbyt pomocne, jeśli nie wiedzą, jak poprawnie ustawić uprawnienia, i napotkają również inne problemy.
Thomas Ward
@ThomasW .: Zatem pytanie, jak prawidłowo ustawić uprawnienia, powinno być nowym pytaniem, zawierającym niezbędne informacje, takie jak konfiguracja serwera WWW, pożądany sposób edycji plików i potrzeby aplikacji.
mastow
lub napisane jako poprawna odpowiedź - co teraz robię. Nie powinieneś również uruchamiać niczego z / home / USER / dla strony internetowej, ma ona dostęp do wielu innych danych „użytkownika”, jeśli serwer WWW nie jest poprawnie załatany lub skonfigurowany.
Thomas Ward
@mastov Rozumiem. Rozwiązujesz wiele pytań, które miałem z twoim wyjaśnieniem.
André Carvalho,
2

Doskonała odpowiedź Thomas Ward https://askubuntu.com/a/767534/717860

Możesz wykonać wszystkie zalecane kroki w zaledwie 3 poleceniach zamiast 8 poleceń:

3 polecenia:

sudo chown -R ubuntu:www-data /var/www
sudo find /var/www -type d -exec chmod 2750 {} \+
sudo find /var/www -type f -exec chmod 640 {} \+

wykonaj tę samą pracę, co 8 poniższych poleceń:

sudo chgrp -R www-data /var/www
sudo find /var/www -type d -exec chmod g+rx {} +
sudo find /var/www -type f -exec chmod g+r {} +
sudo chown -R ubuntu /var/www/
sudo find /var/www -type d -exec chmod u+rwx {} +
sudo find /var/www -type f -exec chmod u+rw {} +
sudo find /var/www -type d -exec chmod g+s {} +
sudo chmod -R o-rwx /var/www/
Vipin Mehta
źródło