Myślę, że wiele szczegółów twojego pytania może dotyczyć w równym stopniu avahi-daemon
, na co ostatnio spojrzałem. (Mogłem przeoczyć inny szczegół, który się różni). Uruchamianie demona avahi w chroot ma wiele zalet, na wypadek, gdyby avahi-demon został naruszony. Obejmują one:
- nie może odczytać żadnego katalogu domowego użytkowników i wyodrębnić prywatnych informacji.
- nie może wykorzystywać błędów w innych programach, pisząc do / tmp. Istnieje co najmniej jedna cała kategoria takich błędów. Np. Https://www.google.co.uk/search?q=tmp+race+security+bug
- nie może otworzyć żadnego pliku gniazda UNIX, który znajduje się poza chroot, na którym inne demony mogą nasłuchiwać i czytać wiadomości.
Punkt 3 może być szczególnie przydatny, gdy nie używasz dbus lub podobnego ... Myślę, że avahi-demon używa dbus, więc zapewnia dostęp do systemu dbus nawet z chroota. Jeśli nie potrzebujesz możliwości wysyłania wiadomości w systemie dbus, odmowa tej możliwości może być całkiem niezłą funkcją bezpieczeństwa.
zarządzanie nim za pomocą pliku jednostki systemowej
Zauważ, że jeśli avahi-demon został ponownie napisany, może potencjalnie zdecydować się na systemd dla bezpieczeństwa i użyć np ProtectHome
. Zaproponowałem zmianę w avahi-demona, aby dodać te zabezpieczenia jako dodatkową warstwę, wraz z kilkoma dodatkowymi zabezpieczeniami, które nie są gwarantowane przez chroot. Możesz zobaczyć pełną listę opcji, które zaproponowałem tutaj:
https://github.com/lathiat/avahi/pull/181/commits/67a7b10049c58d6afeebdc64ffd2023c5a93d49a
Wygląda na to, że istnieje więcej ograniczeń, których mógłbym użyć, gdyby avahi-demon nie używał samego chroota, niektóre z nich są wymienione w komunikacie zatwierdzenia. Nie jestem jednak pewien, ile to dotyczy.
Uwaga: zastosowane przeze mnie zabezpieczenia nie ograniczyłyby demona przed otwieraniem plików gniazd UNIX (punkt 3 powyżej).
Innym podejściem byłoby użycie SELinux. Jednak w pewnym sensie wiązałbyś swoją aplikację z tym podzbiorem dystrybucji Linuksa. Powodem, dla którego pomyślałem o SELinux tutaj, jest to, że SELinux w bardzo drobiazgowy sposób ogranicza dostęp procesów przez dbus. Na przykład myślę, że często można się spodziewać, systemd
że nie będzie na liście nazw autobusów, do których trzeba było wysyłać wiadomości :-).
„Zastanawiałem się, czy korzystanie z piaskownicy systemowej jest bezpieczniejsze niż chroot / setuid / umask / ...”
Podsumowanie: dlaczego nie jedno i drugie? Rozszyfrujmy nieco powyższe :-).
Jeśli pomyślisz o punkcie 3, użycie chroot zapewnia większe zamknięcie. ProtectHome = i jego przyjaciele nawet nie starają się być tak restrykcyjni jak chroot. (Na przykład, żadna z nazwanych czarnych list systemowych opcji /run
, w których zwykle umieszczamy pliki gniazd unix).
chroot pokazuje, że ograniczenie dostępu do systemu plików może być bardzo potężne, ale nie wszystko w Linuksie to plik :-). Istnieją systemowe opcje, które mogą ograniczać inne rzeczy, które nie są plikami. Jest to przydatne, jeśli program zostanie przejęty, możesz zmniejszyć dostępne dla niego funkcje jądra, w których może on próbować wykorzystać lukę. Na przykład demon avahi nie potrzebuje gniazd bluetooth i sądzę, że twój serwer sieciowy też nie :-). Nie udzielaj więc dostępu do rodziny adresów AF_BLUETOOTH. Wystarczy dodać do białej listy AF_INET, AF_INET6, a może AF_UNIX, używając tej RestrictAddressFamilies=
opcji.
Przeczytaj dokumentację dotyczącą każdej opcji, której używasz. Niektóre opcje są bardziej skuteczne w połączeniu z innymi, a niektóre nie są dostępne we wszystkich architekturach procesora. (Nie dlatego, że procesor jest zły, ale dlatego, że port Linux dla tego procesora nie był tak ładnie zaprojektowany. Myślę, że).
(Jest tutaj ogólna zasada. Bardziej bezpieczne jest pisanie list tego, na co chcesz zezwolić, a nie tego, czego chcesz odmówić. Na przykład zdefiniowanie chroot daje listę plików, do których masz dostęp, a to jest bardziej niezawodne niż mówienie, że chcesz zablokować /home
).
Zasadniczo możesz zastosować te same ograniczenia przed setuid (). To tylko kod, który można skopiować z systemd. Jednak opcje jednostek systemowych powinny być znacznie łatwiejsze do napisania, a ponieważ są w standardowym formacie, powinny być łatwiejsze do odczytania i przejrzenia.
Dlatego mogę gorąco polecić przeczytanie sekcji piaskownicy man systemd.exec
na Twojej platformie docelowej. Ale jeśli chcesz, aby możliwie najbardziej bezpieczny projekt, nie bój się próbować chroot
(i następnie upuścić root
przywileje) w programie , jak również . Tu jest kompromis. Używanie chroot
nakłada pewne ograniczenia na ogólny projekt. Jeśli masz już projekt wykorzystujący chroot i wydaje się, że robi to, czego potrzebujesz, to brzmi całkiem nieźle.