Wo sollen Userspace-Programme ihre Protokolle speichern?

23

Ich schreibe ein Skript, das ich ohne Berechtigungen ausführen möchte. Ich möchte, dass die Fehler, auf die das Skript stößt, in einer Protokolldatei protokolliert werden. Ich habe keine Rechte, an die ich schreiben kann /var/log. Und ich möchte keinen in meinem Home-Verzeichnis haben.

Gibt es einen Ort, an dem Userspace-Skripte Laufzeitinformationen protokollieren können? Was ist die beste Vorgehensweise, um meine Skriptprotokollinformationen zu speichern, /var/logohne potenzielle Sicherheitsprobleme zu verursachen? Ich zögere, uid / gid für das Skript festzulegen.

Lord Loh.
quelle

Antworten:

8

Sie können nicht als normaler Benutzer in / var / log schreiben, aber der Syslog-Daemon erledigt dies für Sie, wenn Sie danach fragen. Wenn Sie Nachrichten in den Standardsystemprotokollen protokollieren möchten (z. B. /var/log/syslog), ist das 4.4BSD-Dienstprogramm loggermöglicherweise auf Ihrem System verfügbar. Es wird standardmäßig unter Debian installiert und ist im bsdutilsPaket für Debian-Derivate enthalten.

Sie profitieren von bereits vorhandenen Tools für die Protokollrotation, -wartung und -überwachung, mit dem Nachteil, dass zum Lesen der Systemprotokolle Berechtigungen erforderlich sind und die Nachrichten Ihres Skripts mit den Nachrichten anderer Programme gemischt werden.

$ 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

Es stehen verschiedene Konfigurationsoptionen zur Verfügung. Sie können mehr in lesen man logger.

Jander
quelle
Gibt es Sprachbindungen für dieses Dienstprogramm? Möchte nicht lieber Unterprozesse für jede Zeile der Standard-In-App erzeugen.
ThorSummoner
@ThorSummoner: Wie Gilles 'Antwort sagt, sysloghandelt es sich um eine C-Bibliotheksroutine, und C ++ kann jedes C aufrufen, das verwendet extern "C". Andere Sprachen bieten häufig entweder generische Bindungen an C oder Bindungen an bestimmte Dinge, dies hängt jedoch von der Sprache ab.
Dave_thompson_085
12

Wenn Sie als normaler Benutzer ein Programm ausführen möchten, befindet sich der natürliche Speicherort für die Protokolle in Ihrem Ausgangsverzeichnis. In Ihrem Ausgangsverzeichnis können Sie alle Ihre Dateien speichern, unabhängig davon, ob es sich um Protokolle eines von Ihnen ausgeführten Programms oder um andere Elemente handelt.

Wenn das Programm als Teil des Systems ausgeführt wird und als ein normalerweise dedizierter Systembenutzer ausgeführt wird, befindet sich der natürliche Ort für seine Protokolle in /var/log. Erstellen Sie ein Unterverzeichnis, /var/log/myappund geben Sie ihm die entsprechenden Berechtigungen, damit Ihre Anwendung dort schreiben kann.

Wenn relevant und Ihr Betriebssystem dies zulässt, markieren Sie die Protokolldatei als "Nur anhängen". Das kann nur root. Dies hat den Vorteil, dass Ihre Anwendung bei einer Kompromittierung nicht in der Lage ist, frühere Protokolle zu löschen, was für die forensische Analyse der Kompromittierung sehr nützlich sein kann. Sie benötigen den Eingriff von root, um das Protokoll zu drehen: chownDamit die Protokolldatei nicht mehr von der Anwendung geöffnet werden renamekann, erstellen Sie eine neue Nur-Anhängen-Datei mit entsprechendem Besitz und benachrichtigen Sie die Anwendung, um die neue leere Datei zu öffnen .

Sie können ein beliebiges Anwendungsprotokoll in die Systemprotokolle aufnehmen, indem Sie logger(1)oder aufrufen syslog(3).

Gilles 'SO - hör auf böse zu sein'
quelle
4

In der Regel wird für einen Dämon die Protokolldatei erstellt, bis rootdie Berechtigungen geändert werden, sodass der nicht privilegierte Benutzer darauf schreiben kann. logrotatewird dann so eingerichtet, dass die Berechtigungen während der Drehung erhalten bleiben.

Wenn es sich um einen Befehl und nicht um einen Daemon handelt, melden Sie sich bei /tmp(vorzugsweise mit mktemp) an und informieren Sie den Benutzer über STDOUTden Speicherort des Protokolls.

Bahamat
quelle
Gute Idee. Ich habe ein paar Zeilen in meinem ~ / .profile, die prüfen, ob der dropbox demon läuft und starten, falls nicht. Ich überlegte, ein hinzuzufügen &, um zu vermeiden, dass die Eingabeaufforderung angehalten wird, aber Dropbox-Schreibvorgänge in die Konsole zu starten. Ich leite gerade die Ausgabe an um /dev/null, möchte aber eine Möglichkeit zum Debuggen haben, wenn Dropbox nicht gestartet werden kann.
Lord Loh.
1
Auschecken daemonize.
Bahamat
Nur um zu wissen, "Berechtigungen werden so geändert, dass der nicht privilegierte Benutzer darauf schreiben kann." wird das einfach mit chmod 666 gemacht? oder muss ich einen Benutzer zu einer Gruppe hinzufügen oder so?
Lord Loh.
Besser unter / var / tmp, / tmp kann nicht garantiert werden, dass es einen Start überlebt.
Vonbrand
@ LordLoh .: Ja, mit chmod. Normalerweise wird 0644oder 0664und der Benutzer- / Gruppenbesitz auch in den des Dämons geändert, von dem erwartet wird, dass er darauf schreibt.
Bahamat
3

Ich habe den Eindruck, dass User-Space-Programme standardmäßig Protokolle verwerfen sollen. Ich habe verschiedene Programme gesehen, die Protokolle ausgeben, wo immer sie sich anfühlen, und es ist auf meinen Systemen niemals besonders willkommen. neigen dazu, sich an einem Ort anzusammeln, der nie bemerkt wird, es sei denn / bis er riesig wird.

Ich würde es vorziehen, wenn es einen bestimmten Platz für sie gibt, ich spiele auf meinem System herum und versuche, einen stabilen Platz für sie zu finden.

Meine erste Idee war es, zu verwenden /var/run/user/$UID/log, aber ich stellte fest, dass es sich bei meinem System um ein TMPFS-Mount handelt, das nicht groß genug ist oder für die Verwendung mit Protokollen wirklich gut geeignet ist.

Schaffe einen Platz für sie

Da ich / var / run / user nicht gut genug verstehe, um es zu integrieren, habe ich mich entschieden, es von Hand für Benutzer 1000 zu emulieren.

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

Ich würde empfehlen, die FHS / var / log spc für die Struktur in diesem Ordner beizubehalten , aber die Spezifikation in freier Form, sodass nicht viel einzuhalten ist.

Logrotate Config

In diesem von Ihrem System bereitgestellten Verzeichnis ist keine Protokollrotation vorhanden. Ich empfehle, eine für Ihr System zu erstellen:

# /etc/logrotate.d/userlogs

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

Unten ist mein vorheriger / var / run / user / 1000 / Log Post. Ich kann ihn nur empfehlen, wenn du wirklich weißt, was du tust.

vielleicht wie folgt, aber ich habe es mir nur ausgedacht, weil es für mich Sinn machte.

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

Integriere mit / 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
quelle