Verwendung von Logrotate und S3cmd zum Archivieren von Protokollen im Objektspeicher unter Ubuntu 16.04

Einführung

Die von Ihren Servern und Anwendungen erstellten Protokolldateien enthalten zahlreiche Informationen, die möglicherweise beim Debuggen von Software, Untersuchen von Sicherheitsvorfällen und Generieren aufschlussreicher Metriken und Statistiken hilfreich sind.

Eine typische Protokollierungsstrategie besteht heutzutage darin, alle diese Informationen über einen Protokollaggregationsdienst wie https://www.digitalocean.com/community/tutorial_series/centralized-logging-with-elk-stack-elasticsearch-logstash-and-kibana- zu zentralisieren. on-ubuntu-14-04 [the Elastic stack] oder Graylog . Dies ist ideal für Echtzeitanalysen und kurz- bis mittelfristige historische Untersuchungen. Oft ist es jedoch aufgrund von Speicherbeschränkungen oder anderen Problemen mit Serverressourcen nicht möglich, Langzeitdaten in diesen Systemen zu speichern.

Eine gebräuchliche Lösung für diese langfristigen Speicheranforderungen ist die Archivierung von Protokollen mit einem Objektspeicherdienst. Die Protokolle können für spätere Analysen, gesetzliche Aufbewahrungspflichten oder zu Sicherungszwecken auf unbestimmte Zeit verfügbar bleiben.

In diesem Tutorial verwenden wir Logrotate auf einem Ubuntu 16.04-Server, um + syslog + -Protokolle an einen Objektspeicherdienst zu senden. Diese Technik kann auf alle von Logrotate bearbeiteten Protokolle angewendet werden.

Voraussetzungen

Um dieses Tutorial abzuschließen, benötigen Sie Folgendes:

  • Ein Ubuntu 16.04-Server mit einem Benutzer, der kein Root-Sudo unterstützt (siehe Initial Server Setup with) Ubuntu 16.04. Die Konfigurationen in diesem Lernprogramm sollten für viele verschiedene Linux-Distributionen allgemeiner funktionieren, erfordern jedoch möglicherweise einige Anpassungen.

  • Sie sollten mit Logrotate vertraut sein und wissen, wie die Standardkonfiguration unter Ubuntu 16.04 eingerichtet ist. Weitere Informationen finden Sie unter How To Manage Logfiles with Logrotate on Ubuntu 16.04.

  • Sie müssen die folgenden Details zu Ihrem Objektspeicherdienst kennen:

  • Zugangsschlüssel

  • Geheimer Schlüssel

  • Server-URL (oder Endpunkt-URL)

  • Bucket-Name + Wenn Sie DigitalOcean Spaces verwenden, können Sie How To Create a DigitalOcean Space lesen und API-Schlüssel, um einen neuen Bucket zu erstellen und die obigen Informationen abzurufen.

Wenn Sie die Voraussetzungen erfüllt haben, starten Sie SSH auf Ihrem Server.

Schritt 1 - Installation von S3cmd

Wir werden ein Tool namens * S3cmd * verwenden, um unsere Protokolle an jeden S3-kompatiblen Objektspeicherdienst zu senden. Vor der Installation von S3cmd müssen einige Tools installiert werden, die uns bei der Installation von Python-Programmen helfen (S3cmd ist in Python geschrieben):

sudo apt-get update
sudo apt-get install python-setuptools

Wechseln Sie als Nächstes in ein Verzeichnis, in das Sie schreiben können, und laden Sie die S3cmd-Datei + .tar.gz + herunter:

cd /tmp
curl -LO https://github.com/s3tools/s3cmd/releases/download/v2.0.1/s3cmd-2.0.1.tar.gz

Wenn der Download abgeschlossen ist, entpacken und entpacken Sie die Datei mit dem Dienstprogramm + tar +:

tar xf s3cmd-*.tar.gz

Wechseln Sie dann in das resultierende Verzeichnis und installieren Sie die Software mit + sudo +:

cd s3cmd-*
sudo python setup.py install

Testen Sie die Installation, indem Sie + s3cmd + nach den Versionsinformationen fragen:

s3cmd --version
Outputs3cmd version

Wenn Sie eine ähnliche Ausgabe sehen, wurde S3cmd erfolgreich installiert. Als Nächstes konfigurieren wir S3cmd so, dass eine Verbindung zu unserem Objektspeicherdienst hergestellt wird.

Schritt 2 - Konfigurieren von S3cmd

S3cmd verfügt über einen interaktiven Konfigurationsprozess, mit dem die Konfigurationsdatei erstellt werden kann, die für die Verbindung zu unserem Objektspeicherserver erforderlich ist. Der * root * -Benutzer benötigt Zugriff auf diese Konfigurationsdatei. Daher starten wir den Konfigurationsprozess mit + sudo + und platzieren die Konfigurationsdatei im Home-Verzeichnis des * root * -Benutzers:

sudo s3cmd --configure --config=/root/logrotate-s3cmd.config

Das interaktive Setup wird gestartet. Gegebenenfalls können Sie die Standardantworten (in Klammern) durch Drücken von "+ ENTER" akzeptieren. Wir werden die folgenden Optionen mit Lösungsvorschlägen für einen Space in der NYC3-Region von DigitalOcean durchgehen. Ersetzen Sie die S3-Endpunkt- und Bucket-Vorlage nach Bedarf durch andere DigitalOcean-Rechenzentren oder andere Objektspeicheranbieter:

  • Zugriffsschlüssel: ++

  • Geheimer Schlüssel: ++

  • Standardregion [US]: + ENTER +

  • S3-Endpunkt [s3.amazonaws.com]: ++

  • DNS-artiger Bucket + Hostname: Port-Vorlage für den Zugriff auf einen Bucket [% (Bucket) s.s3.amazonaws.com]: ++

  • Verschlüsselungspasswort: + ENTER +, oder geben Sie ein zu verschlüsselndes Passwort an

  • Pfad zum GPG-Programm [/ usr / bin / gpg]: + ENTER +

  • HTTPS-Protokoll verwenden [Ja]: + ENTER +

  • HTTP-Proxy-Servername: + ENTER +, oder geben Sie Ihre Proxy-Informationen ein

An dieser Stelle fasst "+ s3cmd " Ihre Antworten zusammen und fordert Sie auf, die Verbindung zu testen. Drücken Sie ` y ` und dann ` ENTER +`, um den Test zu starten:

OutputTest access with supplied credentials? [Y/n]
Please wait, attempting to list all buckets...

Nach dem Test werden Sie aufgefordert, die Einstellungen zu speichern. Geben Sie dazu erneut "+ y " und dann " ENTER " ein. Die Konfigurationsdatei wird an den Speicherort geschrieben, den wir zuvor mit der Befehlszeilenoption " - config +" angegeben haben.

Im nächsten Schritt richten wir Logrotate so ein, dass S3cmd zum Hochladen unserer Protokolle verwendet wird.

Schritt 3 - Einrichten von Logrotate zum Senden von rotierten Protokollen an den Objektspeicher

Logrotate ist ein leistungsstarkes und flexibles System zur Verwaltung der Rotation und Komprimierung von Protokolldateien. Ubuntu verwendet es standardmäßig, um alle in + / var / log + gefundenen Systemprotokolle zu verwalten.

In diesem Lernprogramm aktualisieren wir die Konfiguration, um das Protokoll "+ syslog +" bei jeder Drehung an den Objektspeicher zu senden.

Öffnen Sie zunächst die Logrotate-Konfigurationsdatei für "+ rsyslog +", den Systemprotokollprozessor:

sudo nano /etc/logrotate.d/rsyslog

Es gibt zwei Konfigurationsblöcke. Wir sind an der ersten interessiert, die sich mit "+ / var / log / syslog +" befasst:

/etc/logrotate.d/rsyslog

/var/log/syslog
{
   rotate 7
   daily
   missingok
   notifempty

   compress
   postrotate
       invoke-rc.d rsyslog rotate > /dev/null
   endscript
}
. . .

Diese Konfiguration gibt an, dass "+ / var / log / syslog " täglich gedreht wird (" daily "), wobei sieben alte Protokolle beibehalten werden (" rotate 7 "). Es wird kein Fehler ausgegeben, wenn die Protokolldatei fehlt (" missingok "), und das Protokoll wird nicht gedreht, wenn es leer ist (" notifempty "). Gedrehte Protokolle werden komprimiert (` compress `), jedoch nicht die aktuellste (` delaycompress `). Schließlich weist das Skript " postrotate " " rsyslog +" an, in die neue Protokolldatei zu wechseln, nachdem die alte entfernt wurde.

Bevor wir unsere neuen Konfigurationsanweisungen hinzufügen, löschen Sie die oben hervorgehobene Zeile + delaycompress +. Wir möchten, dass alle unsere alten Protokolle sofort komprimiert werden, bevor sie an den Objektspeicher gesendet werden.

Fügen Sie als Nächstes die folgenden Zeilen am Ende des Konfigurationsblocks hinzu (außerhalb des Blocks + postrotate ++ endscript +, aber innerhalb der schließenden Klammer +} +):

/etc/logrotate.d/rsyslog

. . .
       dateext
       dateformat -%Y-%m-%d-%s
       lastaction
               HOSTNAME=`hostname`
               /usr/local/bin/s3cmd sync --config=/root/logrotate-s3cmd.config /var/log/syslog*.gz "s3:///$HOSTNAME/"
       endscript
. . .

Stellen Sie sicher, dass der markierte Bereich oben durch den richtigen Bucket-Namen ersetzt wird. Diese Optionen aktivieren datumsbasierte Dateinamenerweiterungen (+ dateext +), damit wir unsere Protokolldateien mit einem Zeitstempel versehen können. Wir setzen dann das Format dieser Erweiterungen mit + dateformat +. Die Dateien erhalten Dateinamen wie "+ syslog-2017-11-07-1510091490.gz +": Jahr, Monat, Datum und dann einen Zeitstempel. Der Zeitstempel stellt sicher, dass wir zwei Protokolldateien am selben Tag versenden können, ohne dass die Dateinamen in Konflikt stehen. Dies ist erforderlich, wenn wir aus irgendeinem Grund eine Protokollrotation erzwingen müssen (mehr dazu im nächsten Schritt).

Das Skript + lastaction + wird ausgeführt, nachdem alle Protokolldateien komprimiert wurden. Es legt eine Variable mit dem Hostnamen des Servers fest und synchronisiert dann mit "+ s3cmd sync " alle Syslog-Dateien bis zu Ihrem Objektspeicher-Bucket und legt sie in einem Ordner mit dem Namen "hostname" ab. Beachten Sie, dass der letzte Schrägstrich in "" s3: /// $ HOSTNAME / "" signifikant ist. Ohne das würde ` s3cmd ` ` / $ HOSTNAME +` als einzelne Datei behandeln, nicht als Verzeichnis voller Protokolldateien.

Speichern und schließen Sie die Konfigurationsdatei. Wenn Logrotate das nächste Mal täglich ausgeführt wird, wird "+ / var / log / syslog +" in einen datumsbasierten Dateinamen verschoben, komprimiert und hochgeladen.

Wir können dies sofort erzwingen, um zu testen, ob es ordnungsgemäß funktioniert:

sudo logrotate /etc/logrotate.conf --verbose --force
Outputrotating pattern: /var/log/syslog
. . .


. . .

switching euid to 0 and egid to 0
upload: '/var/log/syslog-2017-11-08-1510175806.gz' -> 's3://example-bucket/example-hostname/syslog-2017-11-08-1510175806.gz'  [1 of 1]
36236 of 36236   100% in    0s   361.16 kB/s  done

Dadurch werden viele Informationen für viele Protokolldateien ausgegeben. Die Teile, die für das "+ syslog +" - Protokoll und unseren Upload relevant sind, sind oben auszugsweise aufgeführt. Ihre Ausgabe sollte ähnlich aussehen, mit einigen Hinweisen auf einen erfolgreichen Upload. Möglicherweise werden weitere Dateien hochgeladen, wenn der Server nicht brandneu ist.

Als Nächstes richten wir optional einen Dienst ein, der uns beim Hochladen von Protokollen vor dem Herunterfahren des Systems hilft.

Schritt 4 - Senden von Protokollen beim Herunterfahren

Dieser Schritt ist optional und nur erforderlich, wenn Sie kurzlebige Server konfigurieren, die häufig heruntergefahren und zerstört werden. In diesem Fall können Sie jedes Mal, wenn Sie einen Server zerstören, bis zu einem Tag Protokolle verlieren.

Um dies zu beheben, müssen wir Logrotate ein letztes Mal ausführen lassen, bevor das System heruntergefahren wird. Dazu erstellen wir einen systemd-Dienst, der den Befehl "+ logrotate +" ausführt, wenn er gestoppt wird.

Öffnen Sie zunächst eine neue Servicedatei in einem Texteditor:

sudo nano /etc/systemd/system/logrotate-shutdown.service

Fügen Sie die folgende Service-Definition ein:

/etc/systemd/system/logrotate-shutdown.service

[Unit]
Description=Archive logs before shutdown
After=network.target

[Service]
RemainAfterExit=yes
ExecStop=/usr/sbin/logrotate /etc/logrotate.conf --force

[Install]
WantedBy=multi-user.target

Diese Datei definiert einen Dienst, der beim Start nichts unternimmt (es fehlt die Anweisung "+ ExecStart ") und beim Stoppen " logrotate " (mit der Option " - force ") ausführt. Es wird ausgeführt, bevor die Netzwerkverbindung aufgrund der Zeile ` After = network.target +` getrennt wird.

Speichern Sie die Datei und beenden Sie Ihren Texteditor, dann "+ start " und " enable " den Dienst mit " systemctl +":

sudo systemctl start logrotate-shutdown.service
sudo systemctl enable logrotate-shutdown.service

Überprüfen Sie den Status des neuen Dienstes:

sudo systemctl status logrotate-shutdown.service
Output● logrotate-shutdown.service - Archive logs before shutdown
  Loaded: loaded (/etc/systemd/system/logrotate-shutdown.service; enabled; vendor preset: enabled)
   since Wed 2017-11-08 20:00:05 UTC; 8s ago

Nov 08 20:00:05 example-host systemd[1]: Started Archive logs before shutdown.

Wir wollen sehen, dass es "+ active " ist. Die Tatsache, dass es " beendet " hat, ist in Ordnung, da es keinen " ExecStart +" - Befehl gibt.

Sie können die Funktionsfähigkeit des neuen Dienstes testen, indem Sie ihn manuell stoppen:

sudo systemctl stop logrotate-shutdown.service

oder indem Sie Ihr System neu starten:

sudo reboot

Bei beiden Methoden wird der Befehl Logrotate ausgelöst und eine neue Protokolldatei hochgeladen. Wenn Sie das System nicht ordnungsgemäß herunterfahren, gehen keine Protokolle verloren, wenn Sie einen Server zerstören.

Fazit

In diesem Tutorial haben wir S3cmd installiert, es für die Verbindung mit unserem Objektspeicherdienst konfiguriert und Logrotate so konfiguriert, dass es Protokolldateien hochlädt, wenn es + / var / log / syslog + dreht. Anschließend richten wir einen systemd-Dienst ein, der beim Herunterfahren "+ logrotate --force +" ausführt, um sicherzustellen, dass keine Protokolle verloren gehen, wenn kurzlebige Server zerstört werden.

Um mehr über die für Logrotate verfügbaren Konfigurationen zu erfahren, lesen Sie die entsprechende Handbuchseite, indem Sie in der Befehlszeile "+ man logrotate +" eingeben. Weitere Informationen zu S3cmd finden Sie auf Ihre Website.