Nie ma powodu, aby mieć zarówno / run, jak i / tmp
Myślę, że masz rację. /tmp
jest zasadniczo przestarzałe, teraz mamy /run
. Jeśli twój program jest w stanie to zrobić (co wymaga, aby został zainstalowany jako operacja uprzywilejowana), to w dzisiejszych czasach używałbyś podkatalogu /run
. Jest to ze względów bezpieczeństwa.
Np. Demon drukowania CUPS nie działa jako root, ale zazwyczaj jest instalowany z pakietu systemu operacyjnego. Pakiet instaluje się /usr/lib/tmpfiles.d/cups.conf
i systemd-tmpfiles
tworzy katalog, do którego może uzyskać dostęp. Ponieważ katalog jest pod /run
, nazwa nie może zostać złośliwie zgłoszona przez nieuprzywilejowanego użytkownika, w przeciwieństwie do tego, /tmp
co można zapisać na całym świecie.
„Nieuprzywilejowane programy”, których nie można używać /run
bezpośrednio
Prawdziwe rozróżnienie polega na tym, że twój program jest uruchamiany przez dowolnego, nieuprzywilejowanego użytkownika, pod własnym identyfikatorem użytkownika. Ale nadal ogólnie nie chcesz z niego korzystać /tmp
, ponieważ może być dostępny dla innych nieuprzywilejowanych użytkowników. Wolisz używać $XDG_RUNTIME_DIR
. Zazwyczaj jest to realizowane jako /run/user/$(id -u)
- tak więc zdarza się, że jest to również podkatalog /run
. Lokalizacja nie jest jednak gwarantowana; programy powinny zawsze używać zmiennej środowiskowej.
/tmp
przydałby się tylko do współpracy ad hoc między różnymi nieuprzywilejowanymi użytkownikami systemu. Takie systemy ad-hoc są podatne na ataki złośliwego użytkownika, który odmawia współpracy i psuje rzeczy wszystkim :). Jednym z przykładów byliby nieuprzywilejowani użytkownicy decydujący się na uruchomienie wersji talk
demona przy użyciu gniazda unix.
Uwaga: poniższa lista kontrolna Poetteringa twierdziła, że /tmp
byłaby przydatna w przypadku „małych plików”, podczas gdy /run
powinna być używana tylko w przypadku „prymitywów komunikacyjnych”. Nie sądzę też, aby to rozróżnienie było prawdziwe. Chłopiec-plakat dla /run
jest udev
i jestem pewien, że /run/udev
zawiera wewnętrzne bazy danych. Kiedy już masz /run
katalog, nie sądzę, że ktoś chce postępować zgodnie z domniemanym rozróżnieniem i stworzyć inny katalog, żeby się bałagać /tmp
. Tak więc w praktyce używamy tylko w /run
dzisiejszych czasach.
Użycie współdzielonych na całym świecie przestrzeni nazw [jak / tmp] do celów komunikacyjnych zawsze było problematyczne, ponieważ do nawiązania komunikacji potrzebujesz stabilnych nazw, ale stabilne nazwy otwierają drzwi do ataków DoS. Można to częściowo naprawić, ustanawiając chronione katalogi aplikacji dla niektórych usług podczas wczesnego rozruchu (tak jak w przypadku X11), ale to tylko częściowo rozwiązuje problem, ponieważ działa to poprawnie tylko wtedy, gdy po każdej instalacji pakietu następuje restart.
...
Inna funkcja Fedory (dla Fedory 17) zmieniła semantykę / tmp dla wielu usług systemowych, aby uczynić je bardziej bezpiecznymi, izolując przestrzenie nazw / tmp różnych usług
...
Ponieważ / tmp niekoniecznie jest już współużytkowaną przestrzenią nazw, zasadniczo nie nadaje się jako lokalizacja dla operacji podstawowych.
...
[/ run] z pewnością jest tmpfs i dlatego jest automatycznie opróżniany przy rozruchu. Poza tym nie wykonuje się automatycznego czyszczenia.
...
Oto ogólny przewodnik, w jaki sposób sugerujemy Ci (twórcy aplikacji dla systemu Linux) wybrać odpowiedni katalog do użycia:
- Potrzebujesz miejsca, w którym umieścisz swoje gniazdo (lub inny prymityw komunikacyjny), a twój kod działa uprzywilejowany: użyj podkatalogu poniżej / run. (Lub poniżej / var / run dla dodatkowej kompatybilności.)
- Potrzebujesz miejsca, w którym umieścisz swoje gniazdo (lub inny podstawowy element komunikacji), a Twój kod będzie działał nieuprzywilejowany: użyj podkatalogu poniżej $ XDG_RUNTIME_DIR.
- Potrzebujesz miejsca, w którym będziesz mógł pobierać i pobierać większe pliki oraz uruchamiać je bez uprawnień: użyj $ XDG_DOWNLOAD_DIR.
- Potrzebujesz miejsca do umieszczenia plików pamięci podręcznej, które powinny być trwałe i działać nieuprzywilejowane: użyj $ XDG_CACHE_HOME.
- Żadne z powyższych nie ma zastosowania i musisz umieścić mały plik, który nie wymaga trwałości: użyj $ TMPDIR z rezerwowym na / tmp. I używaj mkstemp () i mkdtemp () i nic domowego.
- W przeciwnym razie użyj $ TMPDIR z rezerwowym na / var / tmp. Użyj także mkstemp () / mkdtemp ().
Pamiętaj, że powyższe zasady są tylko sugerowane przez nas. Reguły te uwzględniają wszystko, co wiemy na ten temat i unikają problemów z obecnymi i przyszłymi dystrybucjami, o ile je widzimy. Zastanów się nad aktualizacją swoich projektów, aby postępować zgodnie z tymi regułami i pamiętaj o nich, jeśli napiszesz nowy kod.
Jedną rzeczą, na którą chcielibyśmy podkreślić, jest fakt, że / tmp i / var / tmp częściej nie są właściwym wyborem dla twojej skrzynki użytkownika. Istnieją prawidłowe zastosowania tych katalogów, ale całkiem często inny katalog może być lepszym miejscem. Więc bądź ostrożny, rozważ inne opcje, ale jeśli wybierzesz / tmp lub / var / tmp, to przynajmniej upewnij się, że używasz mkstemp () / mkdtemp ().
W pewnym sensie uciekamy od starszego /tmp
gniazda używanego przez system okien X, jak opisano powyżej. Źle odczytałem tmpfiles.d/x11.conf
. Wygląda na to, że polega na współpracy :). Zakładam, że kod został poddany audytowi, dlatego odmowa usługi jest najgorszym z możliwych.