# RustProxy (DEB/RPM): dostęp do katalogów WWW i certyfikatów Jednostka z paczki uruchamia `rust-proxy` jako `rustproxy:rustproxy`, z `ProtectSystem=strict` i `ProtectHome=read-only`. Katalogi `/home`, `/var/www`, `/srv` i zewnętrzne PEM są **dostępne do odczytu**, jeżeli pozwalają na to standardowe uprawnienia użytkownika, grupy lub POSIX ACL. Nie jest potrzebny `systemctl edit` ani dopisywanie `ReadOnlyPaths=`. Dostęp do zapisu poza `/var/lib/rustproxy`, `/var/log/rustproxy` i dopuszczonym `/etc/rustproxy` pozostaje zablokowany przez systemd. Nie zmieniaj `ProtectSystem` na `false`. ## 1. Katalog strony WWW w /home Przykład (zastąp `klient` i ścieżkę nazwą swojej strony): ```bash sudo setfacl -m u:rustproxy:--x /home/klient sudo setfacl -R -m u:rustproxy:r-X /home/klient/public_html sudo -u rustproxy test -r /home/klient/public_html/index.html && echo OK sudo systemctl restart rustproxy ``` `--x` pozwala jedynie przejść przez prywatny katalog domowy; `r-X` nadaje odczyt plików i przechodzenie przez podkatalogi. Dla nowo tworzonych plików ustaw także odpowiednie domyślne ACL na katalogach witryny lub pilnuj grupy oraz umask narzędzia publikującego. ## 2. Grupa zamiast ACL (np. /var/www) Nadaj witrynie **osobną, możliwie wąską grupę**, np. `web-readers`, zapewnij jej `r` do plików i `x` do katalogów, a potem: ```bash sudo usermod -aG web-readers rustproxy id rustproxy sudo systemctl restart rustproxy ``` Grupy dodatkowe użytkownika `rustproxy` są automatycznie uwzględniane przez systemd przy starcie usługi. Nie wpisuj ich w `SupplementaryGroups=` i nie udostępniaj plików całemu światu (`chmod 777` / `chmod -R 755` nie są wymagane). Restart jest konieczny po zmianie grup, ponieważ uruchomiony proces nie pobiera nowej listy grup samoczynnie. ## 3. Zewnętrzny certyfikat z Certbot / Let's Encrypt Dla `example.com` nadaj jedynie możliwość przechodzenia przez katalogi i odczytu bieżących rzeczywistych plików (symlinki `live` prowadzą do `archive`): ```bash sudo setfacl -m u:rustproxy:--x /etc/letsencrypt /etc/letsencrypt/live \ /etc/letsencrypt/live/example.com /etc/letsencrypt/archive \ /etc/letsencrypt/archive/example.com sudo setfacl -m u:rustproxy:r-- "$(readlink -f /etc/letsencrypt/live/example.com/fullchain.pem)" sudo setfacl -m u:rustproxy:r-- "$(readlink -f /etc/letsencrypt/live/example.com/privkey.pem)" sudo systemctl reload rustproxy ``` **Ważne:** RustProxy celowo wymaga, aby zewnętrzne pliki certyfikatu/klucza oraz wszystkie rzeczywiste katalogi nadrzędne były własnością `root` albo `rustproxy`, nie były zapisywalne przez grupę/innych, a klucz prywatny nie był czytelny przez innych. Katalog WWW może być własnością innego użytkownika; ścieżka do PEM ma ostrzejszą walidację. Nie zakładaj, że certyfikat trzymany pod `/home/klient` z katalogiem należącym do `klient` zadziała po samym ACL. Umieść go w zaufanym katalogu np. `/etc/letsencrypt` i nadaj odczyt ACL/grupą. Po odnowieniu certyfikatu (nowy plik w `archive/`) odtwórz uprawnienia przez hook odnowienia, a potem przeładuj RustProxy. ## 4. Diagnostyka ```bash systemctl show rustproxy -p User -p Group -p ProtectHome -p ProtectSystem -p ReadWritePaths systemctl cat rustproxy namei -l /home/klient/public_html/index.html sudo -u rustproxy test -r /home/klient/public_html/index.html && echo OK journalctl -u rustproxy -n 60 --no-pager ``` Test `sudo -u` potwierdza prawa POSIX **poza** sandboxem systemd. Jeśli działa, a RustProxy dalej nie czyta pliku, sprawdź aktywną jednostkę/drop-in, politykę SELinux lub AppArmor (`ausearch -m avc -ts recent` na SELinux), symlinki i system plików. Ręczna jednostka w `/etc/systemd/system/rustproxy.service` ma pierwszeństwo przed pakietową w `/usr/lib/systemd/system` i nie zostanie nadpisana automatycznie. Web Server ma własną politykę symlinków. ACL nie pozwoli zapisać strony lub uploadów pod `/home`/`/var/www`, dopóki nie zostanie jawnie dopuszczony zapis w sandboxie; zapis aplikacji trzymaj osobno.