Mam dość standardowy serwer skonfigurowany do obsługi Apache i PHP. Aplikacja, którą uruchamiam, tworzy pliki, które są własnością użytkownika Apache www-data
. Pliki przesyłane przez SFTP są własnością mojego użytkownika charlesr
. Wszystkie pliki są częścią www-data
grupy. Mój problem polega na tym, że nie mogę modyfikować ani nadpisywać żadnych plików za pośrednictwem SFTP, które są własnością www-data
, mimo że charlesr
są częścią www-data
grupy. Mogę modyfikować pliki bez problemu przez sesję SSH.
Więc nie jestem pewien, co robić. Jak przyznać mojej sesji SFTP uprawnienia do modyfikowania www-data
posiadanych plików?
Dla odrobiny tła są to notatki, które napisałem dla siebie podczas konfigurowania serwera:
Now set up permissions on `/var/www` where your files are served from by
default:
$ sudo adduser $USER www-data
$ sudo chgrp -R www-data /var/www
$ sudo chmod -R g+rw /var/www
$ sudo chmod -R g+s /var/www
Now log out and log in again to make the changes take hold.
The previous set of commands does the following:
1. adds the current user ($USER) to the `www-data` group;
2. changes `/var/www` to belong to the `www-data` group;
3. adds read/write permissions to the group that `/var/www` belongs to;
4. sets the SGID bit on `/var/www`; this final point bears some explaining.
Następnie wyjaśniam sobie, co oznacza ustawienie bitu SGID (tzn. Wszystkie utworzone pliki automatycznie /var/www
stają się częścią www-data
grupy).
AKTUALIZACJA
Wygląda na to, że problem został spowodowany przez samą aplikację, a ściślej środowisko aplikacji ( Kohana ), które ustawia niektóre pliki, które zapisuje na 0644 (rw-r - r--); tzn. nie można zapisać w grupie. To, w połączeniu z faktem, że pliki są również własnością, www-data
oznacza, że nie mogłem edytować plików przez SFTP, gdy jestem zalogowany jako charlesr
. Nie jestem pewien, dlaczego mogłem edytować pliki przez SSH. Domyślam się, że musiałem użyć sudo.
Oto strategia uprawnień, z której teraz korzystam dzięki niestrudzonej pomocy Marty'ego Frieda , który zwrócił uwagę na wady mojej poprzedniej strategii i pomógł mi marynować w świecie uprawnień do Linuksa, dopóki go nie zrozumiałem. Dzięki Marty!
Przegląd
- Pliki i katalogi w
/var/www
powinny być własnościąroot:webmasters
- Wszyscy deweloperzy powinni być członkami
webmasters
grupy - Wszystkie katalogi w
/var/www
powinny być ustawione na:2775
lubu=rwx,g=rwxs,o=rx
(rwxrwx-rx) - Wszystkie pliki
/var/www
powinny być ustawione na:0664
lubug=rw,o=r
(rw-rw-r--)
Następujące powinny być własnością www-data:webmasters
(tzn. Są to katalogi, do których Apache musi mieć możliwość zapisu):
- aplikacja / pamięć podręczna
- aplikacja / logi
- Przekazać plik
- client_helpers / upload
JAK
Aby /var/www
domyślnie skonfigurować uprawnienia do tego, gdzie pliki są udostępniane:
sudo addgroup webmasters
sudo adduser $USER webmasters
sudo chown -R root:webmasters /var/www
sudo find /var/www -type f -exec chmod 664 {} \;
sudo find /var/www -type d -exec chmod 775 {} \;
sudo find /var/www -type d -exec chmod g+s {} \;
sudo chown -R www-data:webmasters application/cache/
[itp...]
Teraz wyloguj się i zaloguj ponownie, aby wprowadzić zmiany.
Poprzedni zestaw poleceń wykonuje następujące czynności:
- Utwórz nową grupę o nazwie
webmasters
; wszyscy użytkownicy, którzy potrzebują dostępu do zapisu do plików aplikacji, zostaną dodani do tej grupy. - dodaje bieżącego użytkownika (
$USER
) dowebmasters
grupy. - zmienia właściciela
/var/www
naroot
i grupę nawebmasters
grupę. - dodaje uprawnienia 664 (-rw-rw-r--) do wszystkich plików w
/var/www
. - dodaje 775 uprawnień (drwxrwxr-x) do wszystkich katalogów w
/var/www
. - ustawia bit SGID
/var/www
i wszystkie zawarte w nim katalogi; ten ostatni punkt wymaga wyjaśnienia. Zauważ też, że możesz również umieścić 2 z przodu ósemki chmod (np. 2644), aby zrobić to samo. - ustawia właściciela na
www-data
(użytkownika Apache'a) i grupę dostarczonego katalogu nawebmaster
. Dzięki temu katalog jest zapisywalny przez Apache i wszystkich wwebmasters
grupie. Zrób to samo dla wszystkich innych katalogów, które muszą być zapisywalne.
źródło
/var/www
nie dodając go również do tej grupy?/var/www
więc pomyślałem, że udzielenie grupie dostępuwww-data
i uczynienie z niej członka będzie dobrym rozwiązaniem. Teraz widzę jednak problem polegający na tym, że Apache może zastąpić dowolny plik w tym pliku. Biorąc pod uwagę, że tylko 2 programistów (w tym mnie) ma dostęp do kodu, jest on stosunkowo bezpieczny w krótkim okresie.Zauważyłem, że nie używałeś
chown
.Aby poprawnie ustawić własność plików / folderów, możesz ustawić cały katalog w ten sposób:
chown -R www-data:www-data
To ustawia własność na grupę
www-data
i użytkownikawww-data
Możesz to zrobić jako tymczasowe obejście:
chmod 777 /var/data/<filename>
lubchmod 777 /var/data/<foldername>
następnie edytuj pliki w razie potrzeby
chmod 644 /var/data/<filename>
lubchmod 755 /var/data/<foldername>
Zachowaj ostrożność, używając przełącznika „-R”, ponieważ zmienia on także uprawnienia do wszystkich plików podrzędnych i folderów.
664 to standardowe uprawnienia do plików Apache, a 755 to standardowe uprawnienia do folderów.
Mam nadzieję że to pomoże :)
Gwiazda
źródło
/var/data
? Ponadto, jaki katalog sugerujesz, aby używał poleceniachown -R www-data:www-data
? Mam nadzieję, że nie/var/www
.