Gdzie programy przestrzeni użytkownika powinny zapisywać swoje dzienniki?

23

Piszę skrypt, który chcę uruchomić bez uprawnień. Chcę, aby błędy napotkane przez skrypt były rejestrowane w pliku dziennika. Nie mam uprawnień, aby napisać do jednego /var/log. I nie chcę mieć takiego w moim katalogu domowym.

Czy jest miejsce, w którym skrypty przestrzeni użytkownika mogą rejestrować informacje o środowisku wykonawczym? Jaka jest najlepsza praktyka, aby moje informacje z dziennika skryptu /var/lognie powodowały żadnych potencjalnych problemów z bezpieczeństwem? Waham się ustawić uid / gid w skrypcie.

Lord Loh.
źródło

Odpowiedzi:

8

Nie możesz pisać do / var / log jako zwykły użytkownik, ale demon syslog zrobi to za ciebie, jeśli o to poprosisz. Jeśli chcesz rejestrować wiadomości w standardowych dziennikach systemowych (np. /var/log/syslog), Narzędzie 4.4BSD loggermoże być dostępne w twoim systemie. Jest instalowany domyślnie na Debianie i znajduje się w bsdutilspakiecie pochodnych Debiana.

Będziesz mieć przewagę nad wszystkimi istniejącymi wcześniej narzędziami do obracania, konserwacji i monitorowania dzienników, w tym wady polegające na konieczności posiadania uprawnień do odczytu dzienników systemowych oraz mieszania komunikatów skryptu z komunikatami z innych programów.

$ logger Hello
$ echo Goodbye | logger
$ sudo tail -2 /var/log/syslog
Feb 19 21:16:15 debian-host jander: Hello
Feb 19 21:16:21 debian-host logger: Goodbye

Dostępnych jest kilka opcji konfiguracji; możesz przeczytać więcej w man logger.

Jander
źródło
czy są dostępne powiązania językowe dla tego narzędzia? Wolałbym nie odradzać podprocesów dla każdej linii standardowej aplikacji.
ThorSummoner
@ThorSummoner: Jak mówi odpowiedź Gillesa, syslogjest to procedura biblioteki C, a C ++ może wywoływać dowolne C przy użyciu extern "C". Inne języki często zapewniają ogólne powiązanie z dowolnym C lub powiązanie z określonymi rzeczami, ale zależy to od języka.
dave_thompson_085
12

Jeśli jako zwykły użytkownik zdecydujesz się uruchomić program, naturalnym miejscem dla jego logów jest twój katalog domowy. Twój katalog domowy jest przeznaczony do przechowywania wszystkich plików, niezależnie od tego, czy są to dzienniki uruchomionego programu, czy cokolwiek innego.

Jeśli program jest wykonywany jako część systemu, działając jako typowo dedykowany użytkownik systemu, wówczas znajduje się naturalne miejsce na jego logi /var/log. Utwórz podkatalog /var/log/myappi nadaj mu odpowiednie uprawnienia, aby aplikacja mogła tam pisać.

Jeśli jest to istotne, a system operacyjny na to pozwala, zaznacz plik dziennika jako tylko załącznik. Tylko root może to zrobić. Ma to tę zaletę, że jeśli Twoja aplikacja zostanie przejęta, nie będzie w stanie usunąć przeszłych dzienników, co może być bardzo przydatne do analizy kryminalistycznej tego kompromisu. Będziesz potrzebować interwencji użytkownika root, aby obrócić dziennik: chownaby plik dziennika nie mógł być dłużej otwierany przez aplikację, renameplik dziennika, utwórz nowy plik tylko do dołączania z odpowiednią własnością, a następnie powiadom aplikację o otwarciu nowego pustego pliku .

Możesz utworzyć dowolny dziennik aplikacji w dziennikach systemowych, dzwoniąc logger(1)lub syslog(3).

Gilles „SO- przestań być zły”
źródło
4

Zasadniczo w przypadku demona plik dziennika jest rootnastępnie tworzony, a uprawnienia są zmieniane, aby użytkownik nieuprzywilejowany mógł do niego pisać. logrotatejest następnie konfigurowany w celu zachowania uprawnień podczas rotacji.

Jeśli jest to polecenie, a nie demon, zaloguj się do /tmp(najlepiej za pomocą mktemp) i poinformuj użytkownika, STDOUTdokąd poszedł dziennik.

bahamat
źródło
Dobry pomysł. Mam kilka linii w moim ~ / .profile, który sprawdza, czy demon Dropbox działa, i uruchamia go, jeśli tak nie jest. Zastanawiałem się nad dodaniem znaku „a”, &aby nie wyświetlać monitu, ale uruchomienie Dropbox pisze w konsoli. Obecnie przekierowuję dane wyjściowe /dev/null, ale chciałbym mieć jakiś sposób na debugowanie, jeśli Dropbox nie uruchomi się.
Lord Loh.
1
Sprawdź daemonize.
bahamat
Aby wiedzieć, „uprawnienia są zmieniane, aby użytkownik nieuprzywilejowany mógł do nich pisać”. czy robi to po prostu chmod 666? czy muszę dodać użytkownika do grupy lub czegoś takiego?
Lord Loh.
Lepiej w / var / tmp, / tmp nie ma gwarancji, że przeżyje boot.
vonbrand
@LordLoh .: Tak, z chmod. Zwykle 0644lub 0664własność użytkownika / grupy jest również zmieniana na własność demona, który ma do niego pisać.
bahamat
3

Jestem pod wrażeniem, że programy przestrzeni użytkownika domyślnie odrzucają dzienniki. Widziałem różne programy zrzucające logi tam, gdzie mają na to ochotę i nigdy nie jest to szczególnie mile widziane w moich systemach; zwykle gromadzi się w jakimś miejscu, które nigdy nie jest zauważane, chyba że / dopóki nie stanie się ogromne.

Wolałbym, gdyby było dla nich określone miejsce, bawię się w moim systemie, próbując znaleźć dla nich stabilne miejsce.

Moim pierwszym pomysłem było użycie /var/run/user/$UID/log, ale odkryłem, że w moim systemie jest to montaż TMPFS, niewystarczająco duży lub naprawdę dobry do użycia z logami.

Utwórz dla nich miejsce

Ponieważ nie rozumiem / var / run / user wystarczająco dobrze, aby się z nim zintegrować, postanowiłem emulować go ręcznie dla użytkownika 1000.

# mkdir /var/log/user
# install -d /var/log/user/1000 --owner 1000 -g 1000 -m 0700

Polecam trzymanie się Fcc / var / log spc dla struktury w tym folderze, ale specyfikacja jest swobodna, więc nie ma wiele do spełnienia.

Logrotate Config

Nie ma rotacji dzienników w tym katalogu udostępnianym przez twój system, zalecam utworzenie jednego dla twojego systemu:

# /etc/logrotate.d/userlogs

/var/log/user/*/log/*.log 
/var/log/user/*/log/**/*.log
{
        daily
        missingok
        rotate 7
        compress
        notifempty
        nocreate
}

Poniżej mój poprzedni / var / run / user / 1000 / log post, nie mogę go polecić, chyba że naprawdę wiesz, co robisz (a jeśli tak, to powiedz mi, jak to zrobić!)

może w następujący sposób, ale właśnie to wymyśliłem, ponieważ miało to dla mnie sens.

/var/run/user/1000/log/<app>.log
/var/run/user/1000/log/<app>/<context>.log

Zintegruj z / var / log / user / 1000:

# Integrate with above /var/run/user, probably a bad idea:
# ln -s /var/log/user/1000/ /var/run/user/1000/log

ThorSummoner
źródło