Używam serwera WWW Apache, którego właściciel ma ustawioną wartość _www:_www
. Nigdy nie wiem, jaka jest najlepsza praktyka z uprawnieniami do plików, na przykład kiedy tworzę nowy projekt Laravel 5.
Laravel 5 wymaga, /storage
aby folder był zapisywalny. Znalazłem wiele różnych podejść, aby to działało i zwykle kończę na 777
rekursywnym chmod. Wiem, że to nie najlepszy pomysł.
Oficjalny dokument mówi:
Laravel może wymagać skonfigurowania niektórych uprawnień: folderów wewnątrz
storage
ivendor
wymaga dostępu do zapisu przez serwer WWW.
Czy to oznacza, że serwer WWW potrzebuje również dostępu do samych folderów storage
i vendor
czy tylko ich bieżącej zawartości?
Zakładam, że o wiele lepiej jest zmieniać właściciela zamiast uprawnień. Zmieniłem rekursywnie wszystkie uprawnienia do plików Laravela _www:_www
i dzięki temu strona działała poprawnie, tak jakbym zmienił chmod na 777
. Problem polega na tym, że teraz mój edytor tekstowy prosi mnie o hasło za każdym razem, gdy chcę zapisać dowolny plik, i to samo dzieje się, gdy próbuję zmienić cokolwiek w Finderze, na przykład skopiować plik.
Jakie jest właściwe podejście do rozwiązania tych problemów?
- Zmiana
chmod
- Zmień właściciela plików, aby pasowały do plików na serwerze internetowym, i może ustaw edytor tekstu (i Finder?), Aby pomijał pytanie o hasło, lub użyj ich
sudo
- Zmień właściciela serwera WWW, aby pasował do użytkownika systemu operacyjnego (nie znam konsekwencji)
- Coś innego
777
to zbyt duża swoboda, ponieważ obejmuje wszystkie uprawnienia dla wszystkich.storage
ibootstrap/cache
katalogi powinny być zapisywane przez twój serwer WWWOdpowiedzi:
Wystarczy powiedzieć oczywiste dla każdego, kto przegląda tę dyskusję ... jeśli udzielisz któregoś z folderów uprawnień 777, zezwalasz KAŻDEMU na odczyt, zapis i wykonanie dowolnego pliku w tym katalogu .... co to znaczy, że dałeś KAŻDY (dowolny haker lub złośliwa osoba na całym świecie) uprawnienie do przesłania DOWOLNEGO pliku, wirusa lub innego pliku, a NASTĘPNIE wykonanie tego pliku ...
Istnieją zasadniczo dwa sposoby konfiguracji własności i uprawnień. Albo dasz sobie prawo własności, albo uczynisz serwer WWW właścicielem wszystkich plików.
Webserver jako właściciel (sposób, w jaki robi to większość ludzi, i sposób doktora Laravela):
zakładając, że www-data (może być czymś innym) jest twoim użytkownikiem serwera.
jeśli to zrobisz, serwer WWW jest właścicielem wszystkich plików, a także jest grupą, i będziesz mieć problemy z przesyłaniem plików lub pracą z plikami za pośrednictwem FTP, ponieważ klient FTP będzie zalogowany jako Ty, a nie serwer WWW, więc dodaj Twój użytkownik do grupy użytkowników serwera WWW:
Oczywiście zakłada to, że twój serwer działa jako www-data (domyślny Homestead), a twoim użytkownikiem jest ubuntu (jest to błędne, jeśli używasz Homestead).
Następnie ustaw wszystkie katalogi na 755, a pliki na 644 ... USTAW uprawnienia do plików
Ustaw uprawnienia do katalogu
Twój użytkownik jako właściciel
Wolę mieć wszystkie katalogi i pliki (to znacznie ułatwia pracę ze wszystkim), więc robię:
Następnie daję zarówno sobie, jak i serwerowi sieciowemu uprawnienia:
Następnie daj serwerowi sieciowemu prawo do odczytu i zapisu w pamięci i pamięci podręcznej
Niezależnie od tego, w jaki sposób go skonfigurujesz, musisz dać serwerowi uprawnienia do odczytu i zapisu w celu przechowywania, buforowania i innych katalogów, które serwer musi przesyłać lub zapisywać (w zależności od sytuacji), więc uruchom polecenia z nieśmiałego powyżej:
Teraz jesteś bezpieczny, a Twoja witryna działa, I możesz dość łatwo pracować z plikami
źródło
anyone
koncepcję.anyone
Flaga Linuksa oznacza każdego użytkownika , a nie każdą osobę. Nadal potrzebujesz dostępu do serwera.write
grupa nie wyraziła zgody?Z oczywistych względów bezpieczeństwa uprawnienia do folderów
storage
ivendor
powinny pozostać775
.Jednak zarówno komputer, jak i serwer Apache muszą mieć możliwość pisania w tych folderach. Np .: kiedy uruchamiasz takie polecenia
php artisan
, komputer musi zapisać plik dziennika wstorage
.Wszystko, co musisz zrobić, to przekazać Apache własność folderów:
Następnie musisz dodać swój komputer (do którego się odwołuje
username
) do grupy, do której należy serwer Apache. Tak jak:UWAGA: Najczęściej
groupName
jest,www-data
ale w twoim przypadku zamień go na_www
źródło
chown
polecenia powinny zawierać flagę -R. Ponadto w laravel 5.1 i 5.2 zamiast katalogu dostawcy należy dać dostęp do katalogu bootstrap / cache.Podczas konfigurowania uprawnień dla aplikacji Laravel napotkaliśmy wiele przypadków. Tworzymy osobne konto użytkownika (
deploy
) do posiadania folderu aplikacji Laravel i wykonywania poleceń Laravel z poziomu interfejsu CLI i uruchamiania serwera WWW podwww-data
. Jednym z problemów jest to, że plik (i) dziennika mogą być własnościąwww-data
lubdeploy
, w zależności od tego, kto napisał do pliku dziennika, co oczywiście uniemożliwia innemu użytkownikowi zapisywanie w nim w przyszłości.Odkryłem, że jedynym rozsądnym i bezpiecznym rozwiązaniem jest korzystanie z list ACL systemu Linux. Celem tego rozwiązania jest:
deploy
).www-data
użytkownikowi dostęp do odczytu kodu aplikacji Laravel, ale nie dostęp do zapisu.www-data
użytkownikowi, jak i aplikacji (deploy
) na dostęp do zapisu do folderu pamięci, niezależnie od tego, który użytkownik jest właścicielem pliku (na przykład zarównodeploy
iwww-data
może zapisywać do tego samego pliku dziennika).Dokonujemy tego w następujący sposób:
application/
folderze są tworzone z domyślną umaską0022
, co powoduje, że foldery majądrwxr-xr-x
uprawnienia i pliki-rw-r--r--
.sudo chown -R deploy:deploy application/
(lub po prostu wdrożyć aplikację jakodeploy
użytkownik, co robimy).chgrp www-data application/
aby daćwww-data
grupie dostęp do aplikacji.chmod 750 application/
aby zezwolićdeploy
użytkownikowi na odczyt / zapis, nawww-data
użytkownika tylko do odczytu oraz na usunięcie wszystkich uprawnień dla innych użytkowników.setfacl -Rdm u:www-data:rwx,u:deploy:rwx application/storage/
aby ustawić domyślne uprawnienia dostorage/
folderu i wszystkich podfolderów. Wszelkie nowe foldery / pliki utworzone w folderze przechowywania odziedziczą te uprawnienia (rwx
zarówno dla, jakwww-data
i dladeploy
).setfacl -Rm u:www-data:rwX,u:deploy:rwX application/storage/
aby ustawić powyższe uprawnienia dla dowolnych istniejących plików / folderów.źródło
Zmień uprawnienia do folderu projektu, aby umożliwić odczyt / zapis / wykonanie dla dowolnego użytkownika w grupie będącej właścicielem katalogu (w twoim przypadku jest to
_www
):Następnie dodaj swoją nazwę użytkownika OS X do
_www
grupy, aby umożliwić mu dostęp do katalogu:źródło
dseditgroup
dostarczane przez ciebie, dostaję błąd:Username and password must be provided.
.sudo
na początku._www:_www
lubmyuser:_www
też?_www:_www
, ponieważ 775 oznacza, że każdy użytkownik w grupie_www
będzie miał pełne uprawnienia do odczytu / zapisu / oczekiwania w tym folderze, a ty właśnie dodałeś swoją nazwę użytkownika do tej grupy.chown myuser:_www
? Wiem, że pierwszy to użytkownik, a drugi to grupa, ale czy to znaczy „ten użytkownik I KAŻDY Z tej grupy” czy „ten użytkownik, ALE TYLKO JEŻELI NALEŻY DO tej grupy”?Jak już napisano
ale dodałem -R dla polecenia chown :
sudo chown -R www-data:www-data /path/to/your/project/vendor sudo chown -R www-data:www-data /path/to/your/project/storage
źródło
Większość folderów powinna mieć normalne „755”, a pliki „644”
Laravel wymaga, aby niektóre foldery były zapisywalne dla użytkownika serwera WWW. Możesz użyć tego polecenia w systemach operacyjnych opartych na Uniksie.
źródło
Po
composer install
źródło
Dokumenty Laravel 5.4 mówią:
Na tej stronie znajduje się wiele odpowiedzi, które wspominają o korzystaniu z
777
uprawnień. Nie rób tego Byłbyś narażając się na ataki hakerów.Zamiast tego postępuj zgodnie z sugestiami innych osób, jak ustawić uprawnienia 755 (lub bardziej restrykcyjne). Może być konieczne
whoami
ustalenie, z jakiego użytkownika korzysta Twoja aplikacja, uruchamiając ją w terminalu, a następnie zmienić właściciela niektórych katalogówchown -R
.Jeśli nie masz uprawnień do korzystania,
sudo
ponieważ wiele innych odpowiedzi wymaga ...Twój serwer jest prawdopodobnie współdzielonym hostem, takim jak Cloudways.
(W moim przypadku sklonowałem moją aplikację Laravel na moim drugim serwerze Cloudways i nie działała ona całkowicie, ponieważ uprawnienia
storage
ibootstrap/cache
katalogi zostały zawalone).Musiałem użyć:
Cloudways Platform > Server > Application Settings > Reset Permission
Wtedy mógłbym biec
php artisan cache:clear
w terminalu.źródło
Rozwiązanie opublikowane przez bgles jest dla mnie na miejscu, jeśli chodzi o prawidłowe ustawianie uprawnień na początku (używam drugiej metody), ale nadal ma potencjalne problemy dla Laravela.
Domyślnie Apache tworzy pliki z uprawnieniami 644. Więc to prawie wszystko w pamięci. Jeśli więc usuniesz zawartość pamięci / frameworka / widoków, a następnie wejdziesz na stronę przez Apache, zobaczysz, że buforowany widok został utworzony w następujący sposób:
Jeśli uruchomisz „serwis rzemieślnika” i uzyskasz dostęp do innej strony, otrzymasz różne uprawnienia, ponieważ CLI PHP zachowuje się inaczej niż Apache:
Samo w sobie to nie jest wielka sprawa, ponieważ nie zrobisz tego w produkcji. Ale jeśli Apache utworzy plik, który następnie musi zostać zapisany przez użytkownika, zakończy się niepowodzeniem. I to może dotyczyć plików pamięci podręcznej, buforowanych widoków i dzienników podczas wdrażania przy użyciu zalogowanego użytkownika i rzemieślnika. Łatwym przykładem jest „rzemieślnicza pamięć podręczna: wyczyść”, która nie usunie żadnych plików pamięci podręcznej, które są www-data: www-data 644.
Można to częściowo złagodzić, uruchamiając polecenia rzemieślnika jako dane www, więc będziesz robił / skrypty takie jak:
Albo unikniesz żmudności tego i dodasz to do swoich .bash_aliases:
Jest to wystarczająco dobre i nie wpływa w żaden sposób na bezpieczeństwo. Ale na komputerach programistycznych uruchamianie skryptów testowych i sanitarnych sprawia, że jest to niewygodne, chyba że chcesz skonfigurować aliasy do korzystania z 'sudo -u www-data' do uruchamiania phpunit i wszystkiego, co sprawdzasz w swoich kompilacjach, co może powodować tworzenie plików.
Rozwiązaniem jest postępowanie zgodnie z drugą częścią porady bgles i dodanie następujących poleceń do / etc / apache2 / envvars i ponowne uruchomienie (nie przeładowywanie) Apache:
Zmusi to Apache do domyślnego tworzenia plików jako 664. Samo w sobie może to stanowić zagrożenie bezpieczeństwa. Jednak w środowiskach Laravel, które są tutaj omawiane (Homestead, Vagrant, Ubuntu), serwer WWW działa jako użytkownik www-data w grupie www-data. Jeśli więc nie zezwolisz arbitralnie użytkownikom na dołączenie do grupy danych www, nie powinno być dodatkowego ryzyka. Jeśli komuś uda się wydostać z serwera, i tak ma on poziom dostępu do danych www, więc nic nie jest stracone (choć nie jest to najlepsze podejście do bezpieczeństwa). Tak więc w produkcji jest względnie bezpieczny, a na maszynie programistycznej dla jednego użytkownika nie stanowi to problemu.
Ostatecznie, ponieważ użytkownik znajduje się w grupie danych www, a wszystkie katalogi zawierające te pliki to g + s (plik jest zawsze tworzony w grupie katalogu nadrzędnego), wszystko, co utworzy użytkownik lub dane www, będzie miało postać r / w dla drugiego.
I to jest cel tutaj.
edytować
Po zbadaniu powyższego podejścia do ustawiania uprawnień dalej wygląda to wystarczająco dobrze, ale kilka poprawek może pomóc:
Domyślnie katalogi to 775, a pliki 664, a wszystkie pliki mają właściciela i grupę użytkownika, który właśnie zainstalował platformę. Załóżmy więc, że zaczynamy od tego momentu.
Pierwszą rzeczą, którą robimy, jest blokowanie dostępu do wszystkich innych i sprawienie, aby grupa była danymi www. Tylko właściciel i członkowie www-data mogą uzyskać dostęp do katalogu.
Aby zezwolić serwerowi WWW na tworzenie services.json i compiled.php, zgodnie z oficjalnym przewodnikiem instalacji Laravela. Ustawienie bitu lepkiego grupy oznacza, że będzie on własnością twórcy z grupą danych www.
Robimy to samo z folderem przechowywania, aby umożliwić tworzenie plików pamięci podręcznej, dziennika, sesji i przeglądania. Używamy find do jawnego ustawiania uprawnień katalogu inaczej dla katalogów i plików. Nie musieliśmy tego robić w bootstrap / cache, ponieważ nie ma (normalnie) żadnych podkatalogów.
Może być konieczne ponowne zastosowanie wszystkich flag wykonywalnych, usunięcie dostawcy / * i ponowne zainstalowanie zależności kompozytora, aby odtworzyć łącza do phpunit i in., Np .:
Otóż to. Z wyjątkiem wyjaśnionego powyżej umask dla Apache, to wszystko, co jest wymagane, bez konieczności zapisywania całego projektu do zapisu przez www-data, co dzieje się w przypadku innych rozwiązań. Jest więc w ten sposób marginalnie bezpieczniejszy, ponieważ intruz działający jako www-data ma bardziej ograniczony dostęp do zapisu.
zakończ edycję
Zmiany w Systemd
Dotyczy to korzystania z php-fpm, ale może także innych.
Standardowa usługa systemowa musi zostać zastąpiona, umask ustawiony w pliku override.conf, a usługa uruchomiona ponownie:
źródło
To działało dla mnie:
Co to robi:
Uwaga: Może nie możesz lub nie musisz robić tego z prefiksem sudo. zależy to od uprawnień użytkownika, grupy itp.
źródło
Postanowiłem napisać własny skrypt, aby złagodzić ból związany z tworzeniem projektów.
Uruchom następujące elementy w katalogu głównym projektu:
Poczekaj na zakończenie ładowania początkowego i możesz zacząć.
Przejrzyj skrypt przed użyciem.
źródło
Zainstalowałem laravel na instancji EC2 i spędziłem 3 dni, aby naprawić błąd pozwolenia i wreszcie go naprawiłem. Chcę więc podzielić się tym doświadczeniem z innym.
problem użytkownika Gdy loguję się do instancji ec2, moja nazwa użytkownika to ec2-user, a grupa użytkowników to ec2-user. Witryna działa pod adresem użytkownika httpd: apache: apache, więc powinniśmy ustawić zezwolenie na apache.
uprawnienia do folderów i plików A. struktura folderów w pierwszej kolejności, należy upewnić się, że taka struktura folderów jest taka jak w magazynie
przechowywanie
B. pozwolenie Najpierw widzę instrukcje, aby ustawić 777 w pamięci, aby usunąć file_put_contents: nie udało się otworzyć błędu strumienia. Więc skonfigurowałem uprawnienia 777 do przechowywania chmod -R 777 Storage Ale błąd nie został naprawiony. tutaj powinieneś rozważyć jedno: kto zapisuje pliki w pamięci / sesjach i widokach. To nie jest użytkownik ec2, ale apache. Tak, racja. Użytkownik „apache” zapisuje plik (plik sesji, skompilowany plik widoku) do folderu sesji i widoku. Powinieneś więc dać Apache'owi prawo zapisu do tego folderu. Domyślnie: SELinux twierdzi, że folder / var / www powinien być tylko do odczytu przez demon apache.
W tym celu możemy ustawić selinux na 0: setenforce 0
Może to rozwiązać problem tymczasowo, ale powoduje to, że mysql nie działa. więc to nie jest tak dobre rozwiązanie.
Możesz ustawić kontekst odczytu / zapisu w folderze przechowywania za pomocą: (pamiętaj o ustawieniu 1, aby go przetestować)
Twój problem zostanie naprawiony.
i nie zapomnij tej pamięci podręcznej aktualizacji php rzemieślnika: wyczyść
Te polecenia będą przydatne po lub przed.
Mam nadzieję, że zaoszczędzisz swój czas. Powodzenia. Hacken
źródło
Miałem następującą konfigurację:
nginx
)I zastosował uprawnienia poprawnie, jak @bgies sugeruje w zaakceptowanej odpowiedzi. Problemem w moim przypadku był skonfigurowany działający użytkownik i grupa php-fpm, który był pierwotnie
apache
.Jeśli używasz NGINX z php-fpm, powinieneś otworzyć plik konfiguracyjny php-fpm:
A wartość zamiany
user
igroup
opcji jednym NGINX jest skonfigurowana do pracy; w moim przypadku oba byłynginx
:... ; Unix user/group of processes ; Note: The user is mandatory. If the group is not set, the default user's group ; will be used. ; RPM: apache Choosed to be able to access some dir as httpd user = nginx ; RPM: Keep a group allowed to write in log dir. group = nginx ...
Zapisz i zrestartuj usługi nginx i php-fpm.
źródło
Dla deweloperów Laravela problemy z katalogiem mogą być nieco uciążliwe. W mojej aplikacji tworzyłem katalogi w locie i pomyślnie przenosiłem pliki do tego katalogu w moim lokalnym środowisku. Potem na serwerze pojawiały się błędy podczas przenoszenia plików do nowo utworzonego katalogu.
Oto rzeczy, które zrobiłem i na końcu uzyskałem udany wynik.
sudo find /path/to/your/laravel/root/directory -type f -exec chmod 664 {} \;
sudo find /path/to/your/laravel/root/directory -type d -exec chmod 775 {} \;
chcon -Rt httpd_sys_content_rw_t /path/to/my/file/upload/directory/in/laravel/project/
mkdir($save_path, 0755, true);
Po wprowadzeniu tych zmian na serwerze produkcyjnym udało mi się utworzyć nowe katalogi i przenieść do nich pliki.
Wreszcie, jeśli używasz Fasady plików w Laravel, możesz zrobić coś takiego:
File::makeDirectory($save_path, 0755, true);
źródło
Znalazłem jeszcze lepsze rozwiązanie tego problemu. Jest to spowodowane tym, że php domyślnie działa jako inny użytkownik.
więc aby to naprawić, zrób to
sudo nano /etc/php/7.0/fpm/pool.d/www.conf
następnie edytuj
user = "put user that owns the directories" group = "put user that owns the directories"
następnie:
sudo systemctl reload php7.0-fpm
źródło