Files
rust-package-builder/packaging/rustproxy-filesystem-access.md
T

86 lines
4.0 KiB
Markdown

# 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.