86 lines
4.0 KiB
Markdown
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.
|