Jaki jest najlepszy sposób obsługi uprawnień dla danych www użytkownika Apache 2 w / var / www?

214

Czy ktoś ma fajne rozwiązanie do obsługi plików /var/www? Prowadzimy wirtualne hosty oparte na nazwie, a użytkownik Apache 2 to dane www .

Mamy dwóch zwykłych użytkowników i root. Więc kiedy zadzierasz z plikami /var/www, zamiast musieć ...

chown -R www-data:www-data

... cały czas, co jest dobrym sposobem na poradzenie sobie z tym?

Pytanie uzupełniające: Jak bardzo podchodzisz do uprawnień?

Ten zawsze był problemem w środowiskach programistycznych opartych na współpracy.

Gareth
źródło

Odpowiedzi:

206

Próbując rozwinąć @ Zoredache za odpowiedź , jak dać to pójść sobie:

  • Utwórz nową grupę (www-pub) i dodaj użytkowników do tej grupy

    groupadd www-pub

    usermod -a -G www-pub usera ## musi użyć -a, aby dołączyć do istniejących grup

    usermod -a -G www-pub userb

    groups usera ## wyświetla grupy dla użytkownika

  • Zmień własność wszystkiego pod / var / www na root: www-pub

    chown -R root:www-pub /var/www ## -R dla rekurencyjnego

  • Zmień uprawnienia wszystkich folderów na 2775

    chmod 2775 /var/www ## 2 = ustaw identyfikator grupy, 7 = rwx dla właściciela (root), 7 = rwx dla grupy (www-pub), 5 = rx dla świata (w tym użytkownik apache www-data)

    Ustaw bit identyfikatora grupy ( SETGID ) (2) powoduje skopiowanie grupy (www-pub) do wszystkich nowych plików / folderów utworzonych w tym folderze. Inne opcje to SETUID (4), aby skopiować identyfikator użytkownika, i STICKY (1), co moim zdaniem pozwala tylko właścicielowi usuwać pliki.

    Istnieje -Ropcja rekurencyjna, ale to nie rozróżnia plików i folderów, więc musisz użyć find , tak:

    find /var/www -type d -exec chmod 2775 {} +

  • Zmień wszystkie pliki na 0664

    find /var/www -type f -exec chmod 0664 {} +

  • Zmień umask dla swoich użytkowników na 0002

    Umask kontroluje domyślne uprawnienia do tworzenia plików, 0002 oznacza, że ​​pliki będą miały 664, a katalogi 775. Ustawienie tego (edytując umaskwiersz u dołu /etc/profilew moim przypadku) oznacza, że ​​pliki utworzone przez jednego użytkownika będą mogły być zapisywane przez innych użytkowników na stronie www- grupa bez potrzeby chmod.

Przetestuj to wszystko, tworząc plik i katalog oraz weryfikując właściciela, grupę i uprawnienia za pomocą ls -l.

Uwaga: musisz wylogować się / zalogować, aby zmiany w grupach zaczęły obowiązywać!

Tomek
źródło
6
@ Tom Świetnie, że polecasz finddo tego celu polecenie. Jedna mała wskazówka dotycząca wydajności, którą dałbym, jeśli masz dużo plików / katalogów i używasz GNU find, to użycie +zamiast tego, \;aby polecenie działało na wielu plikach, ponieważ „szybsze jest uruchomienie polecenia na jak największej liczbie plików naraz, a nie raz na plik. Pozwala to zaoszczędzić czas potrzebny na uruchomienie polecenia za każdym razem. ” Ponadto łatwiej jest pisać, ponieważ nie wymaga odwrotnego ukośnika.
aculich
2
Zaktualizowano z sugestią @ aculich, aby użyć + nie \;
Tom
1
@SunnyJ. spróbuj tego (bez cudzysłowów): "find / var / www -type f -exec chmod 0664 '{}' \ +" Spróbuj tego. Pomiędzy „{}” a \ + jest spacja.
Buttle Butkus
1
@ Tom- sposób, aby to rozbić, dzięki. Tylko uwaga - myślę, że „SETUID (4), aby skopiować identyfikator użytkownika”, jak podano w odpowiedzi, jest niepoprawne - SETUID jest ignorowany po zastosowaniu do katalogów w Linux / Unix - Ref
Yarin
1
Ok, więc przez userai userbmasz na myśli www-datai ftpuser? Uważam to za bardzo mylące z jakąkolwiek wzmianką o www-datapierwotnym pytaniu. Jaki jest sens / korzyść z ustawienia właściciela root? Czy powinniśmy to ustawić ftpuser?
gskema
60

Nie jestem do końca pewien, jak chcesz skonfigurować uprawnienia, ale może to dać ci punkt wyjścia. Prawdopodobnie są lepsze sposoby. Zakładam, że chcesz, aby obaj użytkownicy mogli zmieniać cokolwiek w katalogu / var / www /

  • Utwórz nową grupę (www-pub) i dodaj użytkowników do tej grupy.
  • Zmień własność wszystkiego pod / var / www na root: www-pub.
  • Zmień uprawnienia wszystkich folderów na 2775
  • Zmień wszystkie pliki na 0664.
  • Zmień umask dla swoich użytkowników na 0002

Oznacza to, że każdy nowy plik utworzony przez któregokolwiek z użytkowników powinien mieć nazwę użytkownika: www-pub 0664, a każdy utworzony katalog będzie nazwą użytkownika: www-pub 2775. Apache uzyska dostęp do odczytu do wszystkiego za pośrednictwem komponentu „inni użytkownicy”. Bit SETGID w katalogach wymusi, aby wszystkie tworzone pliki były własnością grupy, która jest właścicielem folderu. Konieczne jest dostosowanie umask, aby upewnić się, że bit zapisu jest ustawiony tak, aby każdy w grupie mógł edytować pliki.

Co do tego, jak hardkorowo mam uprawnienia. Zależy to całkowicie od strony / serwera. Jeśli jest tylko 1-2 redaktorów, a ja po prostu muszę ich powstrzymać od zbytniego psucia rzeczy, pójdę łatwo. Gdyby firma wymagała czegoś bardziej złożonego, stworzyłbym coś bardziej złożonego.

Zoredache
źródło
1
Możliwe dodanie - ustaw katalog pamięci podręcznej / wysyłania, który musi być zapisany przez serwer na www-data: www-data i 775.
gacrux
Czy równie dobrze byłoby dodać użytkowników do grupy apache zamiast polegać na „innych” uprawnieniach? Jeśli wszystko, co robisz, to przesyłanie plików i te pliki muszą być czytelne przez apache, trzecia grupa wydaje się przydatna tylko wtedy, gdy musisz edytować te pliki.
Simurr
1
Jest jakaś szansa, że ​​możesz to trochę rozwinąć @Zoredache? Rozumiem podstawowe użycie bitów rwx, chmod, chown, adduser, usermod, ale straciłeś mnie z dodatkową pierwszą cyfrą na ósemkowe uprawnienia, umasks i tak dalej. Docenione zostaną niektóre przykładowe polecenia ilustrujące przedstawione podejście.
Tom
1
W ten sposób każdy użytkownik może uzyskać dostęp do wszystkich innych plików użytkownika! Oznacza to, że użytkownik A może odczytać config.php użytkownika B ... ukradł jego dane uwierzytelniające mysql, na przykład
drAlberT
1
Za pomocą acl możesz poradzić sobie zarówno z bezpieczeństwem, jak i współpracą :)
drAlberT
39

Myślę, że może być pomocne POSIX ACL (listy kontroli dostępu). Pozwalają one na bardziej precyzyjny model uprawnień w porównaniu do użytkownika: grupa: inny model. Odkryłem, że łatwiej jest je zachować prosto w mojej głowie, ponieważ mogę być bardziej wyraźny i mogę również ustawić „domyślne” zachowanie dla gałęzi systemu plików.

Na przykład możesz wyraźnie określić uprawnienia każdego użytkownika:

setfacl -Rm d:u:userA:rwX,u:userA:rwX /var/www
setfacl -Rm d:u:userB:rwX,u:userB:rwX /var/www

Możesz to zrobić na podstawie udostępnionej grupy:

setfacl -Rm d:g:groupA:rwX,u:groupA:rwX /var/www

Być może chcesz zachować użytkownika Apache jako tylko do odczytu

setfacl -Rm d:u:www-data:rX,u:www-data:rX /var/www

Strony podręcznika:

Seminarium

Joe Holloway
źródło
2
Właśnie tak ! +1
drAlberT
ACL dla wygranej +1 ... Aby uzyskać więcej informacji, zobacz serverfault.com/a/360120/41823
Yarin
1
Zastanawiam się, czy jest jakiś spadek wydajności ACL w porównaniu z podstawowymi uprawnieniami.
Buttle Butkus
2
Niestety ACL zbyt często brakuje w standardowych instalacjach / dystrybucjach. Kompilacja jądra na wszystkich serwerach, którymi zarządzam, lub co gorsza, czasami zmienia system plików, jest trudna. Ponadto należy zachować szczególną ostrożność podczas tworzenia kopii zapasowych plików, zwłaszcza jeśli zmieniasz serwery. ACL jest świetny, ale jego obecne wsparcie jest tak niskie, że poleciłbym go każdemu, kto nie ma pełnej kontroli nad wszystkim na serwerze i otoczeniu. Ale +1 za wskazanie ACL tam, gdzie to naprawdę ma sens!
Ninj
Dobra odpowiedź +1; Uwaga na temat zmiany uprawnień www-datado odczytu / zapisu w procesie Apache ( na przykład) na tylko do odczytu dla całej witryny (przez setfacl lub chmod - lub oba) -> To oczywiście zablokuje wszystkie zapisy (ładowanie / aktualizowanie wtyczki / modułu od strony przeglądarki na na przykład większość CMS). Uważam, że wiele popularnych testuje również dostęp do zapisu na poziomie uprawnień użytkownika, a nie na poziomie grupy. Nadal możesz aktualizować, ale aktualizacje muszą być stosowane ręcznie, a wszelkie niestandardowe uprawnienia do folderów zapisu (logs / temp / uploads / etc). Tylko do odczytu jest doskonałym zabezpieczeniem, jeśli Twoja witryna z nim współpracuje. Większość z nich nie.
bshea
10

Pytanie to zostało zadane ponownie , a jak omówiono w meta, obecne najlepsze praktyki zapewniają lepsze podejście niż było dostępne w 2009 r., Kiedy zostało zadane. Ta odpowiedź stara się podać niektóre obecne rozwiązania w zakresie bezpiecznego zarządzania współpracującymi środowiskami programistycznymi .


Dla bezpiecznego serwera WWW i wspólnego programowania istnieje więcej niż tylko uprawnienia do plików:

  • Mają osobnego użytkownika dla każdej witryny, tzn. Nie obsługują wszystkich używanych witryn www-data. Jest to ważne, ponieważ obecnie Apache rzadko obsługuje wyłącznie pliki statyczne , ale obsługuje dynamiczne strony internetowe. Ta odpowiedź koncentruje się na PHP, ponieważ jest to najpopularniejszy język serwera, ale te same zasady dotyczą również innych.

    Jeśli masz problem z bezpieczeństwem w jednej witrynie, może ona rozprzestrzenić się na każdą witrynę działającą jako ten sam użytkownik. Osoba atakująca może zobaczyć wszystko, co widzi użytkownik, w tym dane logowania do bazy danych, i zmodyfikować każdą witrynę, do której użytkownik ma uprawnienia do zapisu.

  • Użyj protokołu przesyłania plików SSH (SFTP). Podczas gdy korzystanie z FTP powinno zostać porzucone ze względu na bezpieczeństwo (ponieważ wysyła zarówno hasła, jak i treść w postaci zwykłego tekstu), jego bezpieczny zamiennik SFTP ma również funkcję, która jest idealnym rozwiązaniem do wspólnego tworzenia stron internetowych.

    Po wyodrębnieniu witryn i jednego użytkownika na witrynę musisz dać dostęp programistom, o co chodzi w tym pytaniu. Zamiast dawać im hasła dla tych użytkowników witryny - lub dostęp do plików witryny przy użyciu ich osobistych kont użytkowników, jak pierwotnie sugerowano - możesz użyć kluczy SSH do logowania.

    Każdy programista może wygenerować parę kluczy i zachować klucz prywatny w tajemnicy. Następnie klucz publiczny jest dodawany do ~/.ssh/authorized_keyspliku dla każdego konta użytkownika witryny, nad którym pracuje programista. Ma to wiele zalet w zakresie zarządzania hasłami i loginami:

    • Każdy programista może mieć dostęp do dowolnej liczby stron internetowych bez konieczności zapamiętywania lub przechowywania wszystkich haseł związanych z umową użytkownika na witrynę.

    • Nie trzeba zmieniać i udostępniać haseł za każdym razem, gdy ktoś opuszcza firmę.

    • Możesz użyć bardzo silnych haseł lub całkowicie wyłączyć logowanie oparte na hasłach.

  • Użyj PHP-FPM . Jest to obecne podejście do uruchamiania PHP jako użytkownika. Utwórz nową pulę dla każdego użytkownika, tj. Jedną pulę na każdą witrynę. Jest to najlepsze pod względem bezpieczeństwa i wydajności, ponieważ można również określić, ile zasobów może zużyć pojedyncza witryna.

    Zobacz np. Uruchom php-fpm z NeverEndingSecurity z osobnym użytkownikiem / identyfikatorem użytkownika i grupą w systemie Linux . Istnieją samouczki, takie jak HowtoForge Używanie PHP-FPM z Apache na Ubuntu 16.04 , który nie używa PHP-FPM do zwiększania bezpieczeństwa poprzez separację użytkowników, wskazując na użycie jednego gniazda FPM na serwerze.

Esa Jokinen
źródło