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.
/var/www
nie dodając go również do tej grupy?