Durch rsyslog fill up / var / log wird das System heruntergefahren

7

Manchmal geht ein Prozess schief und die Anmeldungen /var/logwachsen so stark an, dass sie letztendlich die gesamte Partition ausfüllen.

Es passierte mir einmal auf einem Server aufgrund einer falschen Postfix-Konfiguration und einmal auf einem Desktop aufgrund eines USB-Druckers (ich weiß nicht genau, was schief gelaufen ist, ich weiß nur, dass die Protokolle mit gefüllt waren (hp) did not claim interface 1 before use).

Ich weiß, dass die Hauptursache nicht der Logger ist, sondern die Anwendung. Ich kann jedoch nicht anders, als zu denken, dass diese Schwachstelle eine Schande ist. Insbesondere auf einem Desktop, auf dem ein Drucker, der die gesamte Systempartition ausfüllt, verhindert, dass der Benutzer die GUI beim nächsten Durchlauf lädt (kein Speicherplatz /tmp), was für Nicht-Techniker ein totaler Blocker ist.

  • logrotate ist keine Antwort, weil es täglich oder sogar wöchentlich wirkt.

  • rsysloghat diese Konfigurationsoption für maximale Größe und Aktion bei maximaler Größe , scheint jedoch nicht trivial zu sein und kann laut Dokument selbst in einer zukünftigen Version nicht mehr funktionieren.

  • Das Einfügen /var/logeiner dedizierten Partition würde dies jedoch verhindern.

Meines Wissens ist die separate Partition für /var/logdie einzige Lösung dafür. Ich habe dies manchmal empfohlen gesehen, aber es ist zum Beispiel nicht die Standardeinstellung im Debian-Installationsprogramm. Sollte es sein?

Gibt es eine andere einfache Möglichkeit, dies zu vermeiden? Eine Möglichkeit, dem /var/logVerzeichnis eine maximale Größe zu geben , oder zumindest rsyslog?

Ist dieses Problem nicht häufig genug, um einen Schutzmechanismus zu rechtfertigen, der standardmäßig aktiviert wird? (Ich denke insbesondere an die Installation zu Hause / auf dem Desktop, für die Benutzer nicht in der Lage sein sollten, sich selbst darum zu kümmern.)

Bearbeiten: SystemLogRateLimit

Dank der Antwort von Julie Pelletier habe ich in rsyslog den Mechanismus zur Ratenbegrenzung entdeckt, der genau diesem Bedarf entspricht und standardmäßig aktiviert werden sollte.

Es gibt eine Begrenzung der Eingaberate (seit 5.7.1), um Sie vor den Problemen eines wild laufenden Protokollierungsprozesses zu schützen. Wenn mehr als SysSock.RateLimit.Interval * SysSock.RateLimit.Burst-Protokollnachrichten vom selben Prozess ausgegeben werden, werden diese Nachrichten mit SysSock.RateLimit.Severity oder niedriger gelöscht.

SystemLogRateLimit funktioniert jedoch nicht, wenn sich die PID ändert. Auf der Dokumentseite wird erläutert, wie Sie die Funktion zur Ratenbegrenzung testen

Die Ratenbegrenzung funktioniert nur, wenn dieselbe PID angegeben ist

Ich denke, das ist der Grund, warum es hier nicht gilt.

Auf meinem Desktop:

Jul 25 21:34:36 bouzin kernel: [46038.140491] usb 1-5: usbfs: process 12126 (hp) did not claim interface 1 before use
Jul 25 21:34:36 bouzin kernel: [46038.140546] usb 1-5: usbfs: process 12127 (hp) did not claim interface 1 before use
Jul 25 21:34:36 bouzin kernel: [46038.140606] usb 1-5: usbfs: process 12128 (hp) did not claim interface 1 before use
Jul 25 21:34:36 bouzin kernel: [46038.140675] usb 1-5: usbfs: process 12129 (hp) did not claim interface 1 before use
Jul 25 21:34:36 bouzin kernel: [46038.140740] usb 1-5: usbfs: process 12130 (hp) did not claim interface 1 before use
Jul 25 21:34:36 bouzin kernel: [46038.140809] usb 1-5: usbfs: process 12131 (hp) did not claim interface 1 before use
Jul 25 21:34:36 bouzin kernel: [46038.140868] usb 1-5: usbfs: process 12132 (hp) did not claim interface 1 before use
Jul 25 21:34:36 bouzin kernel: [46038.140928] usb 1-5: usbfs: process 12133 (hp) did not claim interface 1 before use
Jul 25 21:34:36 bouzin kernel: [46038.140988] usb 1-5: usbfs: process 12134 (hp) did not claim interface 1 before use
Jul 25 21:34:36 bouzin kernel: [46038.141046] usb 1-5: usbfs: process 12135 (hp) did not claim interface 1 before use

Auf meinem Server:

Jul  5 13:37:45 server postfix/smtpd[426]: NOQUEUE: reject_warning: RCPT from unknown[177.11.51.178]: 451 4.3.0 <[email protected]>: Temporary lookup failure; from=<[email protected]> to=<[email protected]> proto=ESMTP helo=<mail.SERVER.TEST>
Jul  5 13:37:45 server postfix/smtpd[437]: NOQUEUE: reject_warning: RCPT from unknown[177.11.51.178]: 451 4.3.0 <[email protected]>: Temporary lookup failure; from=<[email protected]> to=<[email protected]> proto=ESMTP helo=<mail.SERVER.TEST>
Jul  5 13:37:45 server postfix/smtpd[426]: NOQUEUE: reject_warning: RCPT from unknown[177.11.51.178]: 451 4.3.0 <[email protected]>: Temporary lookup failure; from=<[email protected]> to=<[email protected]> proto=ESMTP helo=<mail.SERVER.TEST>
Jul  5 13:37:45 server postfix/smtpd[437]: NOQUEUE: reject_warning: RCPT from unknown[177.11.51.178]: 451 4.3.0 <[email protected]>: Temporary lookup failure; from=<[email protected]> to=<[email protected]> proto=ESMTP helo=<mail.SERVER.TEST>

Daher ist die Ratenbegrenzungsfunktion von IIUC rsyslog hier nicht relevant, da jede Protokollzeile von einem anderen Prozess geschrieben wird.

Bearbeiten 2: Verzeichnisgröße einschränken

Am Ende habe ich die Größe der /var/logVerwendung eines virtuellen Dateisystems begrenzt (wie hier vorgeschlagen ).

Ich könnte beim nächsten Installieren eines Linux eine separate Partition einrichten.

Ich halte diese Frage vorerst offen, da ich dies eher als Problemumgehung als als Antwort betrachte.

Jérôme
quelle

Antworten:

5

rsyslogEnthält standardmäßig eine Option zur Ratenbegrenzung über das imuxsockModul.

Der Standardwert ist 200 Nachrichten pro 5 Sekunden, kann jedoch leicht geändert werden, indem nach dem Laden des Moduls Folgendes eingestellt wird:

$SystemLogRateLimitInterval 5
$SystemLogRateLimitBurst 200

Dies $SystemLogRateLimitIntervalist das Intervall in Sekunden (das Sie erhöhen sollten) und $SystemLogRateLimitBurstdie maximale Anzahl von Nachrichten, die von der Anwendung während dieses Intervalls zugelassen werden (das Sie verringern sollten).

Update: Basierend auf Ihrem Update bezüglich der Tatsache, dass Fehler Ihr Syslog mit unterschiedlichen Prozess-IDs überfluten, gibt es für den Daemon keine praktische Möglichkeit, diese effizient zu verarbeiten.

Eine Änderung der Protokollrotationsregeln für die maximale Dateigröße wäre daher die einzig mögliche Lösung. Beachten Sie, dass diese großen Dateien nach dem Komprimieren (wie beim normalen Protokollrotationsprozess üblich) aufgrund der Wiederholbarkeit ihres Inhalts winzig werden.

Julie Pelletier
quelle
Unter der Annahme von 100-Byte-Nachrichten erlaubt die Standardkonfiguration 100 * 200 * 12 * 60 * 24 = 345600000=> ungefähr 330 MB pro Tag, was akzeptabel klingt. Überraschenderweise sehe ich in meinem kern.log mehr als 5000 Nachrichten, die mit derselben Sekunde mit einem Zeitstempel versehen sind. /etc/rsyslog.confenthält die $ModLoad imuxsockZeile und nichts über SystemLogRateLimit.
Jérôme
Dann sollte es seinen Standardeinstellungen folgen. Versuchen Sie sicher, sie selbst einzustellen.
Julie Pelletier
Ich denke, der Grund, warum SystemLogRateLimit nicht gilt, ist, dass jede Zeile mit einer anderen Prozess-ID geschrieben wird (siehe Bearbeiten der Frage).
Jérôme