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-datagrupy. 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 charlesrsą częścią www-datagrupy. Mogę modyfikować pliki bez problemu przez sesję SSH.
Więc nie jestem pewien, co robić. Jak przyznać mojej sesji SFTP uprawnienia do modyfikowania www-dataposiadanych 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/wwwstają się częścią www-datagrupy).
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-dataoznacza, ż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/wwwpowinny być własnościąroot:webmasters - Wszyscy deweloperzy powinni być członkami
webmastersgrupy - Wszystkie katalogi w
/var/wwwpowinny być ustawione na:2775lubu=rwx,g=rwxs,o=rx(rwxrwx-rx) - Wszystkie pliki
/var/wwwpowinny być ustawione na:0664lubug=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/wwwdomyślnie skonfigurować uprawnienia do tego, gdzie pliki są udostępniane:
sudo addgroup webmasterssudo adduser $USER webmasterssudo chown -R root:webmasters /var/wwwsudo 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) dowebmastersgrupy. - zmienia właściciela
/var/wwwnarooti grupę nawebmastersgrupę. - 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/wwwi 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 wwebmastersgrupie. Zrób to samo dla wszystkich innych katalogów, które muszą być zapisywalne.
/var/wwwnie dodając go również do tej grupy?