Problem z uprawnieniami: w jaki sposób Apache może uzyskać dostęp do plików w moim katalogu domowym?

33

Wiem, że uprawnienia do plików były tu wcześniej uwzględnione, ale staram się omówić koncepcję mojego scenariusza.

  • Pliki utworzyłem na starej instalacji ubuntu.
  • Skopiowałem pliki do mojej nowej instalacji Ubuntu i umieściłem je w moim katalogu głównym.
  • Kiedy próbuję uruchomić pliki (są to pliki PHP), pojawia się błąd związany z uprawnieniami

próbując to naprawić, założyłem, że muszą one nadal należeć do poprzedniego właściciela, więc uruchomiłem chown -Rkatalog z moją nazwą użytkownika jako argumentem, aby przejąć na własność wszystkie pliki w katalogu. Należy zauważyć, że nazwy użytkowników między nowymi i starymi instalacjami Ubuntu były takie same.

Gdy próbuję ponownie uruchomić pliki, ten sam problem: błąd 500 z powodu problemów z uprawnieniami. Czy ktoś może mi powiedzieć, jakie inne kroki powinienem podjąć?

Webroot dla mojej instalacji Apache znajduje się w moim folderze domowym. Jeśli utworzę nowe pliki w moim katalogu głównym, będą one również działać zgodnie z oczekiwaniami, to tylko stare pliki powodują problem.

Richzilla
źródło
Nie jestem pewien, czy uprawnienia do pliku są kopiowane, gdy plik jest, czy ktoś może to potwierdzić? W przeciwnym razie, czy byłoby możliwe przekazanie plików innemu użytkownikowi (lub rootowi), a następnie ich odzyskanie?
Tagger
Ok, rozwiązałem problem polegający na tym, że pliki się nie uruchamiają, ale zrobiłem to, po prostu uruchamiając chmod -R 777 dirodpowiedni katalog. Nie mogę się powstrzymać przed myśleniem, że jest to lepszy sposób
richzilla,
3
777 uprawnień do pliku pozwoli wszystkim na zapisywanie plików, co może spowodować uszkodzenie stron lub hakowanie. Powinieneś spróbować z 755, który jest zwykle używany do plików php. Upewnij się, że nie musisz włączać opcji „zezwalaj na wykonywanie” dla pliku, w którym to przypadku możesz uruchomić chmod [nazwa pliku] -x. Informacje o komendzie chmod można uzyskać, klikając następny link: catcode.com/teachmod/chmod_cmd.html
Geppettvs D'Constanzo
Co pokazuje dziennik błędów Apache?
Kees Cook

Odpowiedzi:

14

W katalogach powyżej katalogu głównego powinien być ustawiony bit wykonawczy, aby umożliwić Apache zejście do tych katalogów.

Jeśli masz swój Webroot położony w /home/user/htdocsThe /, /home, /home/useri /home/user/htdocspowinny mieć bit wykonania zestawu.


Powyższe rozwiązanie „działa”, ale nie jest idealne. Jeśli utworzyłeś folder, Apache nie może do niego pisać. Dzieje się też odwrotnie.

Można to „naprawić”, ustawiając umask 0007 i dodając się do grupy Apache (dane www, jeśli się nie mylę), aby nowo utworzone pliki i foldery były zapisywane przez grupę.

Alternatywnie możesz zainstalować alternatywny serwer Apache MPM: Apache2 MPM ITK ( informacje na temat konfigurowania ) i dostosować konfigurację, aby serwer Apache działał pod Twoim użytkownikiem.

Lekensteyn
źródło
Aby uzyskać wyraźne instrukcje, jak to osiągnąć, zobacz odpowiedź Marco poniżej
płyty
2
@hobs Jeszcze lepiej, askubuntu.com/a/46371/6969
Lekensteyn
44

Jeśli dokumenty serwera znajdują się w /home/$USER/public_htmlkatalogu, musisz uruchomić

sudo chown -R www-data:www-data /home/$USER/public_html

aby przekazać własność folderu DocumentRoot użytkownikowi www-datai grupie www-data.

Następnie możesz dodać siebie do grupy www-data

sudo adduser $USER www-data

Na koniec musisz ustawić folder DocumentRoot do zapisu przez właściciela (użytkownika danych www) i dla siebie (jako część www-datagrupy):

sudo chmod -R 775 /home/$USER/public_html

Dla wygody możesz utworzyć skrypt o nazwie public_html_fix.shzawierającej treść:

#!/bin/bash

sudo adduser $USER www-data
sudo chown -R www-data:www-data /home/$USER/public_html
sudo chmod -R 775 /home/$USER/public_html

Zapisz go w środku /home/$USER/bini wykonaj za pomocą:

sudo chmod +x /home/$USER/bin/public_html_fix.sh

Następnie wywołujesz go, kiedy potrzebujesz, z dowolnego miejsca w systemie plików znajdziesz się tak:

public_html_fix.sh
Marko
źródło
1
pracował dla mnie ....
Emmanuel Okeke
Świetna odpowiedź! - Z przykładami, a nawet skryptem wygody i jak używać / instalować Znakomity!
Andre
2
Jeśli dzieje się tak na współdzielonym hoście, jak zatrzymać innych użytkowników w www-datagrupie, którzy czytają twoje pliki lub piszą w tym celu?
jozxyqk
Naprawdę niesamowita odpowiedź ... uratowałeś mi życie
NullPoiиteя
1
chmod -R 775 /home/$USER/public_htmlnaprawdę okropne. find /home/$USER/public_html -type d -exec chmod 775 {} \;i find /home/$USER/public_html -type f -exec chmod 664 {} \;jest o wiele lepszy
iharob
1

Oprócz plików chmoding i edycji plików apache .conf chcę powiedzieć, że nic mi nie działało, ponieważ moje pliki znajdowały się na partycji, którą automatycznie zamontowałem za pomocą nautilus. Ogranicza to partycję tylko dla użytkownika.

Aby sprawdzić, czy twoje pliki są widoczne przez www-rootapache lub przez dowolnego użytkownika (uruchom, ps -aux | grep apache2aby sprawdzić), uruchom następujące polecenie:

sudo su -l www-data -s /bin/bash

i spróbuj odczytać plik z katalogu głównego dokumentu.

Jeśli pliku nie można odczytać, sprawdź, czy:

1) ustawiłeś wszystkie inne uprawnienia do plików

2) użyłeś FollowSymlinksw swoich .confplikach, jeśli to konieczne

3) skonfigurowałeś DocumentRoot

3) zamontuj partycję dla wszystkich użytkowników. Musiałem edytować /etc/fstabi określić moją partycję za pomocą jej UUID:

UUID=afdee1d3-5bb8-4652-892f-e83a9b5ff72e /mnt/4tb      ext4    rw,nosuid,nodev,errors=remount-ro

Następnie odmontuj partycję za pomocą nautilus i zrób sudo mount -a. Jeśli wszystko pójdzie dobrze, twoje pliki są teraz poniżej /mnt. Zaktualizuj swoje dowiązania symboliczne i gotowe.

alexg
źródło
1

Najlepszym sposobem, w jaki znalazłem, aby zawsze to konfigurować, jest sposób, w jaki robi to VirtualMin.

utwórz użytkownika i grupę „myhome”

Ustaw użytkownika apache jako członka grupy „myhome”. Nie na odwrót, jak opisują niektóre wyjaśnienia tutaj

Więc teraz apache odczytuje i wykonuje dostęp do / home / myhome oprócz / home / myhome / www

Użytkownik „myhome” ma dostęp do zapisu

użytkownik458431
źródło
Podoba mi się ten pomysł, ale wydaje się, że nie działa dla mnie. Użytkownik www-datanależy do grupy myhome. Wszystkie pliki i katalogi mają uprawnienia do zapisu grupowego i należą do nich myhome:myhome. Zrestartowałem apache. Apache wciąż nie może pisać nowych plików i folderów. (Skrypt PHP wykorzystujący www-data: www-data użytkownik / grupa)
squarecandy