Cześć, piszę z takim dłuższym pytaniem/tematem i będę starał się opisywać co robię i dlaczego, Proszę o krytykę ponieważ chce dobrze zrozumieć to co tutaj opisuję. Dokładniej to chodzi mi o to jak poprawnie konfigurować serwer pod kilka projektów ( bez FPM'a) wszystkie projekty działają na takiej samej wersji php i mają dostęp do wszystkich zasobów.
Instaluję Apache2, PHP, Yarn, Node, git, composer, MySQL. Jak to robić to nie będę opisywał więc zakładamy że to już jest.
Domyślna ścieżka na ka której pracuje Apache2 to /var/www/ config dla domyślnego v-hosta jest ustawiony na katalog /var/www/html. Domyślny użytkownik oraz grupa z jaką Apache uruchamia projekt to www-data .Można to zobaczyć wpisując polecenia apache2ctl -S. I z uprawnieniami dla tego użytkownika i grupy są uruchamiane strony jeżeli w przeglądarce wpiszemy adres www strony. Zakładamy że projekty będziemy trzymać w katalogu /var/www/ więc powinien pozwolić użytkownikowi www-data na odczyt i wykonanie skryptów php w tym katalogu, ale ten użytkownik nie może ich usuwać ( chodzi o sytuacje kiedy w skrypcie php jest unlink jakiegoś pliku php ). Inaczej jest w przypadku katalogu public/uploads do którego mogą być wysyłane zdjęcia, tam musi być już pozwolenie zapisu dla użytkownika www-data. Więc użytkownik www-data uruchamiający skrypty php musi mieć prawo do odczytu/wykonania skryptów ale pełne prawa do katalogu public/uploads oraz pełne prawa do katalogu z cache. Mam rację ?
Teraz praktyka:
Zaraz po zainstalowaniu Apache katalog /var ma takie ustawienia:
drwxr-xr-x 3 root root 4096 Feb 8 16:23 www
A w tym katalogu:
drwxr-xr-x 2 root root 4096 Feb 8 16:23 html
Właściciel i grupa to root, właściciel ma pełne prawa do katalogu grupa odczyt/wykonanie wszyscy pozostali tylko wykonanie. Jeżeli postawię projekt w tym katalogu to muszę to zrobić jako root wtedy automatycznie właścicielem stanie się root a użytkownik www-data będzie miał prawo tylko do wykonania skryptów. Więc ręcznie będę musiał ustawić chmod -R 777 public/images oraz katalogu z cache.
Nie powinno się stawiać projektów jako root chyba w ogóle każdy projekt powinien mieć swojego użytkownika aby jeden użytkownik nie miał dostępu do innego projektu.
1. Zakładając że jeden użytkownika ma dostęp do wszystkich projektów.
Tworzę swojego użytkownika deploy-user lub używam www-data:
useradd -m deploy-user -s /bin/bash
Zmieniam grupę ale zostawiam właściciela jako root katalogu /var/www na używanego użytkownika deploy-user albo www-data żeby mógł tworzyć katalogi, plikioraz aktualizować projekty przez gita i daję TYLKO grupie pełne prawa aby przypadkiem przez root nie zrobić git pull albo modyfikować czegoś w tym katalogu czy czegoś innego na projekcie ( może spowodować to utworzenie plików z prawami roota a przy zmianie chmod i chown git widzi to jako zmianę w plikach ) czyli:
chmod 070 -R /var/www/
chown -R root:deploy-user /var/www
lub
chown -R root:www-data /var/www
Tym sposobem otrzymujemy:
d---rwx--- 3 root deploy-user 4096 Feb 8 16:23 www
lub
d---rwx--- 3 root www-data 4096 Feb 8 16:23 www
Tylko deploy-user lub www-data może dokonywać jakichkolwiek zmian w tym katalogu.
Od tego momentu loguję się jako deploy-user lub www-data:
Zalogowany użytkownik powinien tworzyć wszystkie pliki i katalogi z ustawieniami:
Właściciel pliku - aktualny użytkownik
Grupa: zawsze ww-data
Uprawnienia: 750
- Właściciel deploy-user albo www-data mogą dokonywać wszelkich zmian
- Grupa może tylko wykonywać i odczytywać pliki nie może ich usuwać ( czyli jak apache wczytuje skrypty to z takimi uprawnieniami )
- Pozostali nie mają żadnych praw
W takim wypadku ręcznie ustawiam chmod -R 770 public/images i dla katalogu z cache.
Nie wiem tylko jak ustawić domyślną maskę dla grupy ale tylko dla danego użytkownika Czyli jeżeli tworzę katalog jako root to mam właściciela i grupę root:root ale jeżeli tworzę jako deploy-user to mam właściciela i grupę deploy-user:www-data analogicznie z maską praw do plików/katalogów mask 750 ale tylko dla użytkownika deploy-user root już ma inną maskę. Czyli spersonalizowane ustawienia dla danego użytkownika.
Tworzę projekt poprzez: git clone repo_link nowy_projekt_z_gita
I zawierając poprzednie ustalenia to powinienem mieć stworzony katalog z ustawieniami:
Katalog: nowy_projekt_z_gita
chmod: 750
chown: deploy-user:www-data
Katalogi zawierające cache oraz przeznaczone do zapisu wysłanych zdjęć( public/uploads ) powinny być wpisane w git ignore więc mogę im ręcznie dać uprawnienia poprzez chmod -R 770
2. Każdy projekt ma swojego usera:
Zmieniam grupę i uprawnienia katalogu /var/www na:
chown -R root:root /var/www
chmod 707 -R /var/www
Dzięki temu każdy nowy użytkownik może tworzyć projekty w tym katalogu. Ale tworząc nowych użytkowników dla każdego projektu to zawartość katalogu /var/www wygląda tak:
drwxr-x--- 3 user_projekt_1 www-data 4096 Feb 8 16:23 projekt_1
drwxr-x--- 3 user_projekt_2 www-data 4096 Feb 8 16:23 projekt_2
Dalej już analogicznie jak w poprzednim punkcie.
I tyle. Czy to tak powinno być ?