Odmowa zezwolenia SFTP na pliki będące własnością www-data

23

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: 2775lub u=rwx,g=rwxs,o=rx(rwxrwx-rx)
  • Wszystkie pliki /var/wwwpowinny być ustawione na: 0664lub ug=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:

  1. sudo addgroup webmasters
  2. sudo adduser $USER webmasters
  3. sudo chown -R root:webmasters /var/www
  4. sudo find /var/www -type f -exec chmod 664 {} \;
  5. sudo find /var/www -type d -exec chmod 775 {} \;
  6. sudo find /var/www -type d -exec chmod g+s {} \;
  7. 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:

  1. 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.
  2. dodaje bieżącego użytkownika ( $USER) do webmastersgrupy.
  3. zmienia właściciela /var/wwwna rooti grupę na webmastersgrupę.
  4. dodaje uprawnienia 664 (-rw-rw-r--) do wszystkich plików w /var/www.
  5. dodaje 775 uprawnień (drwxrwxr-x) do wszystkich katalogów w /var/www.
  6. 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.
  7. ustawia właściciela na www-data(użytkownika Apache'a) i grupę dostarczonego katalogu na webmaster. Dzięki temu katalog jest zapisywalny przez Apache i wszystkich w webmastersgrupie. Zrób to samo dla wszystkich innych katalogów, które muszą być zapisywalne.
Charles Roper
źródło

Odpowiedzi:

10

Ubuntu.com ma całkiem niezłe przewodniki po serwerach, takie jak przewodnik Apache . Skąd masz tak starannie zapisane procedury? Nigdy nie musiałem zadawać sobie tak trudnych problemów z żadnym skonfigurowanym przeze mnie serwerem, choć jestem otwarty na możliwość, że nie zrobiłem tego dobrze - nie zainstalowałem też serwerów wszystko, co jest bardzo publiczne lub bardzo duże, więc mogą istnieć luki bezpieczeństwa, o których nie wiem.

Jednak nigdy nie potrzebowałem być członkiem grupy www-data i żadne pliki źródłowe na www nie są własnością www-data. Rozumiem, że jest to używane przez Apache tylko do jego własnych plików i nie będzie miało uprawnień do zapisu do żadnego z innych samych plików, ponieważ teoretycznie żadne ważne pliki nie pozwolą www-data mieć uprawnienia do zapisu. Sądzę, że pliki należące do www-data dawałyby wszystkim uprawnienia tylko do odczytu i nikt nie powinien mieć uprawnień do zapisu do tych plików. Oczywiście mogę się całkowicie mylić, a jeśli tak, mam nadzieję, że ktoś mi powie i wskaże mi rzeczywistą dokumentację, która wyjaśnia inaczej (nie na forum, na którym przypadkowy użytkownik taki jak ja opracował dla niego instrukcje).

Być może coś mi brakuje, ale twój problem powinien być dość prosty. Użytkownik zalogowany za pomocą sftp musi być członkiem grupy www-data, a pliki, które próbujesz zmodyfikować, muszą mieć uprawnienia do zapisu dla grupy www-data. Nie ma dla mnie sensu, że możesz modyfikować pliki za pomocą ssh, ale nie za pomocą sftp; czy na pewno logujesz się na to samo konto dla obu? W sftp możesz wprowadzać takie polecenia, jak !groupslista twoich grup lub !whoamisprawdzenie, jakiej nazwy logowania używasz. Wyniki powinny pasować do tego, co widzisz za pomocą ssh (z tymi samymi poleceniami minus wykrzyknik).

Powinieneś także móc używać chmod, chown, chgrp z sftp, jeśli masz na to pozwolenie.

Nawiasem mówiąc, myślę, że twoja lista zawiera co najmniej jedno dość złe polecenie:

sudo chmod -R g+rw /var/www

Daje to światu uprawnienia do zapisu do każdego pliku i folderu w / var / www. To brzmi jak zły pomysł. Zwykle tylko root ma uprawnienia do zapisu do tych katalogów, chyba że określone potrzebują więcej uprawnień, zwykle tylko do pojedynczych katalogów.

Uwaga: to był błąd z mojej strony. Dzięki DonalLafferty za zwrócenie uwagi na to, że określa „g”, a nie „a”, więc zmienia tylko uprawnienia grupy. Moje zmęczone stare oczy (lub zła czcionka) musiały czytać to jako „a”.

Zmiany w celu wyjaśnienia

Zwykle pliki tworzone przez Apache są tylko do odczytu zarówno dla grupy danych www, jak i dla wszystkich innych użytkowników, tak samo jak pliki będące własnością root w / var / www. Dlatego nie powinno być żadnego powodu, aby uczynić kogoś członkiem www-data. Problem polega na tym, że wszyscy mają dostęp do zapisu, co jest innym przypadkiem. Należy tego dokonać poprzez udostępnienie określonych katalogów w witrynie, a po prostu za pomocą chmod, albo z sudo, ponieważ prawdopodobnie jest własnością root, lub przez uczynienie właściciela samemu i nie używanie sudo.

Jeśli masz więcej programistów, którzy potrzebują dostępu do całej witryny, to wtedy chcesz utworzyć użytkownika + grupę, taką jak „webmasterzy”, uczynić go właścicielem witryny, dać uprawnienia do zapisu tej grupie i złączyć wszystkich programistów tej grupy. Tak więc lista katalogów witryny wyglądałaby mniej więcej tak:

drwxrwxr-x  ##  webmasters     webmasters   #### ####-##-## ##:##  mysite.com

Więcej zmian

Od tamtej pory zdałem sobie sprawę, że tak naprawdę nie trzeba tworzyć użytkowników „webmasterów”, tylko grupę. Następnie pliki mogą być własnością root: webmasterzy, tzn. Root jest właścicielem, ale webmasterzy to grupa.

W odpowiedzi na poniższe pytania pliki zapisywane przez Apache będą własnością www-data i grupy www-data. Pliki te zwykle nie są czymś, co piszesz, więc osoby niebędące członkami www mogą mieć dostęp tylko do odczytu - myślę, że zależy to od uprawnień do katalogu. Jeśli potrzebujesz czegoś więcej niż okazjonalnego dostępu do zapisu, przydatne może być dodanie się do grupy. Zazwyczaj niektóre katalogi zapisywane są w świecie dla treści zapisywanych przez Apache. Weź również pod uwagę, że większość udostępnianego hostingu z uruchomionym Apache bez dostępu do powłoki nie miałaby nawet możliwości konfigurowania grup.

Ale Apache może czytać pliki nawet będące własnością root. Prawie wszystkie pliki mają dostęp do świata, ale nie można ich zapisywać. Tak więc, chyba że chcesz to zmienić, Apache nie musi znajdować się w grupie webmasterów.

To wszystko jest podstawowa konfiguracja Linuksa, a nie Apache. Apache dba tylko o dostęp z poziomu serwera WWW, który jest ustawiany przez pliki konfiguracyjne. Z tego powodu link do dokumentacji Ubuntu, który zamieściłem w moim poście, powinien być uważany za lepsze źródło niż publiczne wiki.

Nawiasem mówiąc, książka kucharska O'Reilly Apache mówi: „Katalogi dokumentów, takie jak htdocs, cgi-bin i ikony, będą musiały mieć ustawione uprawnienia w sposób, który najlepiej pasuje do modelu programistycznego konkretnej witryny, ale pod żadnym pozorem żaden z tych katalogów lub plików w nich zawartych nie powinien być zapisywalny przez użytkownika serwera WWW ”.

Wreszcie, korzystanie z list ACL jest dobrym sposobem na ustawienie uprawnień do plików, jeśli potrzebujesz większej kontroli. Może to być nawet dobry sposób na ustawianie ich przez cały czas i jest to coś, co powinienem zbadać.

Marty Fried
źródło
Cześć @ marty-fried, dzięki za odpowiedź, daje mi to wiele do wypróbowania. Re. Twoje pytania. Połączyłem informacje z różnych źródeł (stąd dlaczego zapisałem je w swoim własnym podręczniku) i nie pamiętam dokładnego źródła. Chociaż nie korzystałem z tego konkretnego źródła (rozwiązanie 1) (właśnie go znalazłem), daje to dobre uzasadnienie mojej decyzji. W wspomnianym przewodniku Apache zaleca utworzenie grupy o nazwie „webmasterzy”, ale gdybym to zrobił, w jaki sposób Apache napisałby do /var/wwwnie dodając go również do tej grupy?
Charles Roper
Muszę też dać dostęp innym użytkownikom, /var/wwwwięc pomyślałem, że udzielenie grupie dostępu www-datai 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.
Charles Roper
1
Dzięki Marty. Ta część książki kucharskiej Apache rozśmieszyła mnie: „Powinieneś wiedzieć, że jeśli poprosisz 12 osób o prawidłowe sposoby ustawiania uprawnień do plików na serwerze Apache, otrzymasz kilkanaście różnych odpowiedzi”. Dałeś mi wszystko, czego potrzebuję, aby zrobić postęp teraz. Dziękuje bardzo za Twój czas. :-)
Charles Roper,
1
Nauczyłem się również trochę i dlatego lubię pogłębione dyskusje - zwykle pomaga wyjaśnić niektóre mgliste części. Jestem głównie programistą, który jest proszony o naprawę problemów i konfigurację stron internetowych, dlatego zawsze uczę się lepszych sposobów robienia rzeczy. Zapytaj, czy są jeszcze jakieś pytania.
Marty Fried
1
AFAIK, sudo chmod -R g + rw / var / www daje dostęp do „grupy”. Użyj „a + rw”, aby uzyskać dostęp do świata.
Donal Lafferty,
7

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-datai użytkownikawww-data

Możesz to zrobić jako tymczasowe obejście:

chmod 777 /var/data/<filename> lub chmod 777 /var/data/<foldername>

następnie edytuj pliki w razie potrzeby

chmod 644 /var/data/<filename> lub chmod 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

StarBlessed
źródło
Cześć, dzięki za poświęcenie czasu na odpowiedź, to bardzo mile widziane. Jednak to naprawdę nie pomaga. Przeglądanie plików sprawia, że ​​WSZYSTKIE z nich są niemodyfikowalne podczas korzystania z SFTP (co jest przeciwieństwem tego, o co mi chodzi!). Naprawdę nie mogę użyć obejścia chmod, ponieważ a) Nie mam uprawnień do chmod w SFTP; b) Naprawdę nie chcę się logować przez SSH, zmieniać uprawnień, wykonywać SFTP, zmieniać z powrotem itp .; oraz c) niektóre pliki mają różne uprawnienia ze względów bezpieczeństwa, więc i tak nie mogę masowo chmod.
Charles Roper
Co to jest /var/data? Ponadto, jaki katalog sugerujesz, aby używał polecenia chown -R www-data:www-data? Mam nadzieję, że nie /var/www.
Marty Fried