How To Configure HAProxy Logging with Rsyslog on CentOS 8 [Quickstart]

Einführung

HAProxy, was für High Availability Proxy steht, ist ein weit verbreiteter TCP- und HTTP-basierter Proxy-Server, der unter Linux, Solaris und FreeBSD läuft. Er wird für den Lastausgleich von Anwendungen verwendet, indem er Anfragen auf mehrere Server verteilt und sicherstellt, dass die Anwendungen für die Benutzer hochverfügbar sind.

Standardmäßig ist HAProxy bei vielen CentOS 8-Installationen nicht so konfiguriert, dass er seine Log-Ausgaben in eine Datei schreibt. In diesem Schnellstart-Tutorial wird erklärt, wie man die HAProxy-Protokollierung mit Rsyslog konfiguriert, indem ein Unix-Domain-Socket für Zuverlässigkeit, Geschwindigkeit und Sicherheit verwendet wird.

Voraussetzungen

Um dieses Tutorial durchzuführen, benötigen Sie einen Server, auf dem CentOS 8 läuft. Dieser Server sollte über einen Nicht-Root-Benutzer mit administrativen Rechten verfügen. Um diesen einzurichten, folgen Sie der Anleitung zur Ersteinrichtung des Servers für CentOS 8.

Schritt 1 – Installation und Aktivierung von HAProxy

Um HAProxy zu installieren, führen Sie den folgenden dnfBefehl aus:

  • sudo dnf install haproxy

Wenn Sie dazu aufgefordert werden Is this ok : geben Sie y ein und drücken Sie RETURN, um das Paket zu installieren.

Nachdem Sie HAProxy installiert haben, aktivieren und starten Sie es mit dem Befehl systemctl:

  • sudo systemctl enable haproxy.service

Sie sollten die folgende Ausgabe erhalten:

Output
Created symlink /etc/systemd/system/multi-user.target.wants/haproxy.service → /usr/lib/systemd/system/haproxy.service.

Da der HAProxy-Dienst nun aktiviert ist, können Sie ihn starten, um sicherzustellen, dass er mit einer Standardkonfiguration auf Ihrem Server ausgeführt wird:

  • sudo systemctl start haproxy.service

Überprüfen Sie als Nächstes den Status von HAProxy, um sicherzustellen, dass er ausgeführt wird:

  • sudo systemctl status haproxy.service

Sie sollten folgende Ausgabe erhalten. Beachten Sie den hervorgehobenen Teil active (running) der Ausgabe. Wenn Ihr Server denselben hervorgehobenen Abschnitt anzeigt, wird HAProxy auf Ihrem Server korrekt ausgeführt, und Sie können mit der Konfiguration der Protokollierung fortfahren.

Output
● haproxy.service - HAProxy Load Balancer Loaded: loaded (/usr/lib/systemd/system/haproxy.service; enabled; vendor preset: disabled) Active: active (running) since Wed 2020-09-09 21:16:39 UTC; 4min 39s ago Process: 21340 ExecStartPre=/usr/sbin/haproxy -f $CONFIG -c -q (code=exited, status=0/SUCCESS) Main PID: 21341 (haproxy) Tasks: 2 (limit: 2881) Memory: 2.7M CGroup: /system.slice/haproxy.service ├─21341 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid. . .

Wenn Ihre Ausgabe anders aussieht oder der Status etwas wie Active: failed anzeigt, befolgen Sie die Schritte zur Fehlerbehebung in der Anleitung zur Behebung häufiger HAProxy-Fehler, um festzustellen, was den korrekten Start von HAProxy verhindert.

Wenn Sie sichergestellt haben, dass HAProxy aktiviert ist und läuft, können Sie mit dem nächsten Schritt fortfahren, nämlich der Konfiguration der Protokollierungsrichtlinien von HAProxy.

Schritt 2 – Konfigurieren der HAProxy-Protokollierungsrichtlinien

Um die Protokollierungsrichtlinien von HAProxy zu konfigurieren, öffnen Sie /etc/haproxy/haproxy.cfg in vi oder Ihrem bevorzugten Editor:

  • sudo vi /etc/haproxy/haproxy.cfg

Drücken Sie i, um in den Modus INSERT zu wechseln, suchen Sie dann die Zeile log 127.0.0.1 local2 und kommentieren Sie sie aus, indem Sie ein #-Zeichen an den Anfang der Zeile setzen, wie im folgenden Beispiel hervorgehoben:

/etc/haproxy/haproxy.cfg
. . .# 2) configure local2 events to go to the /var/log/haproxy.log# file. A line like the following can be added to# /etc/sysconfig/syslog## local2.* /var/log/haproxy.log# #log 127.0.0.1 local2 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid. . .

Fügen Sie nun eine Zeile direkt nach der auskommentierten Zeile mit folgendem Inhalt ein:

 log /dev/log local0

Der gesamte Abschnitt von /etc/haproxy/haproxy.cfg, den Sie bearbeitet haben, sollte die folgenden Zeilen enthalten:

/etc/haproxy/haproxy.cfg
. . .# local2.* /var/log/haproxy.log# #log 127.0.0.1 local2 log /dev/log local0 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid. . .

Die Zeile chroot ist wichtig, weil sie den HAProxy-Prozess darauf beschränkt, nur auf Dateien im Verzeichnis /var/lib/haproxy zuzugreifen. Die Zeile log /dev/log local0 erstellt eine Datei in diesem Verzeichnis, die von Rsyslog zum Sammeln von Protokolleinträgen verwendet wird.

Wenn Sie die Bearbeitung der log Zeilen in /etc/haproxy/haproxy.cfg abgeschlossen haben, speichern und schließen Sie die Datei, indem Sie ESC drücken, :wq eingeben und ENTER drücken.

Der letzte Schritt, den Sie in diesem Abschnitt ausführen müssen, ist das Erstellen des Verzeichnisses /var/lib/haproxy/dev, da es standardmäßig nicht existiert.

Erstellen Sie das Verzeichnis mit dem Befehl mkdir und starten Sie dann HAProxy neu:

  • sudo mkdir /var/lib/haproxy/dev
  • sudo systemctl restart haproxy.service

Sie haben nun HAProxy so konfiguriert, dass es seine Protokolle an einen Unix-Domänen-Socket sendet, der sich in /var/lib/haproxy/dev/log befindet. Im nächsten Schritt werden Sie Rsyslog so konfigurieren, dass es den Socket erstellt und darauf zugreift.

Schritt 3 – Rsyslog zum Sammeln von HAProxy-Logs konfigurieren

Die Standardkonfiguration von Rsyslog unter CentOS 8 verarbeitet keine HAProxy-Logs. Um Logs vom HAProxy-Dienst zu sammeln, öffnen Sie eine neue Datei /etc/rsyslog.d/99-haproxy.conf mit vi oder Ihrem bevorzugten Editor:

  • sudo vi /etc/rsyslog.d/99-haproxy.conf

Drücken Sie i, um in den Modus INSERT zu wechseln, und fügen Sie die folgenden Zeilen in die Datei ein:

/etc/rsyslog.d/99-haproxy.conf
$AddUnixListenSocket /var/lib/haproxy/dev/log# Send HAProxy messages to a dedicated logfile:programname, startswith, "haproxy" { /var/log/haproxy.log stop}

Die $AddUnixListenSocket Direktive weist Rsyslog an, einen Unix-Domain-Socket an dem angegebenen Ort zu erstellen, in diesem Fall /var/lib/haproxy/dev/log. Der Abschnitt :programname, startswith, "haproxy" gibt die Datei an, in die Rsyslog die Log-Einträge schreibt, die es vom Socket sammelt.

Wenn Sie mit der Bearbeitung von /etc/rsyslog.d/99-haproxy.conf fertig sind, speichern und schließen Sie die Datei, indem Sie ESC drücken, :wq eingeben und ENTER drücken.

Sie haben nun Rsyslog so konfiguriert, dass es Log-Einträge vom Unix-Domain-Socket in /var/lib/haproxy/dev/log liest und sie in eine Log-Datei in /var/log/haproxy.log schreibt.

Bevor Sie jedoch Rsyslog neu starten, müssen Sie feststellen, ob SELinux die Zugriffskontrolle auf Ihrem CentOS 8-System durchsetzt.

Um die aktuelle Richtlinie von SELinux zu überprüfen, führen Sie Folgendes aus:

  • getenforce

Sie erhalten eine der folgenden Ausgaben:

  • Enforcing – In diesem Modus setzt SELinux die Zugriffskontrolle auf Ihrem System durch. Sie müssen den folgenden optionalen Abschnitt Schritt 4 – Konfigurieren von SELinux ausfüllen.
  • Permissive – In diesem Fall protokolliert SELinux alle Zugriffsversuche in seiner Protokolldatei, setzt aber keine Zugriffskontrollen auf Ihrem System durch.
  • Disabled – Wenn SELinux deaktiviert ist, werden keine Zugriffskontrollrichtlinien auf Ihrem System protokolliert oder durchgesetzt.

Wenn der Befehl getenforce entweder Permissive oder Disabled zurückgegeben hat, können Sie Rsyslog mit dem folgenden Befehl neu starten:

  • sudo systemctl restart rsyslog

Nach dem Neustart von Rsyslog können Sie die Protokolle in der /var/log/haproxy.log-Datei anzeigen, die Sie in /etc/rsyslog.d/99-haproxy.conf konfiguriert haben. Fahren Sie mit Schritt 5 – Testen der HAProxy-Protokollierung fort, um sicherzustellen, dass alles wie erwartet funktioniert.

Wenn Ihr System unter SELinux im Modus Enforcing läuft, wird im nächsten Abschnitt dieses Tutorials erklärt, wie man ein Modul hinzufügt, damit Rsyslog und HAProxy über ihren gemeinsamen Unix-Domain-Socket miteinander kommunizieren können.

Schritt 4 – (Optional) SELinux konfigurieren

Wenn Ihr CentOS 8 System mit SELinux im Modus Enforcing konfiguriert ist, dann müssen Sie Rsyslog den Zugriff auf das chroot Verzeichnis von HAProxy erlauben. Wenn Sie diesen Zugriff zulassen, kann Rsyslog den Unix-Domain-Socket erstellen, an den HAproxy seine Protokolle sendet.

Wenn Sie mit SELinux nicht vertraut sind, hilft Ihnen diese Tutorial-Serie An Introduction to SELinux on CentOS 7 dabei, die Verwaltung und Interaktion mit SELinux zu erlernen. Obwohl sie für CentOS 7 geschrieben wurde, sind die Prinzipien und Befehle in der Serie auch auf CentOS 8 anwendbar.

Um den Zugriff von Rsyslog und HAProxy auf ihren gemeinsamen Socket zu ermöglichen, müssen Sie zunächst eine Type Enforcement Policy-Datei erstellen. Öffnen Sie eine neue Datei mit dem Namen rsyslog-haproxy.te in vi oder Ihrem bevorzugten Editor:

  • vi rsyslog-haproxy.te

Drücken Sie i, um in den Modus INSERT zu wechseln, und fügen Sie dann die folgenden Zeilen in die Datei ein:

rsyslog-haproxy.te
module rsyslog-haproxy 1.0;require { type syslogd_t; type haproxy_var_lib_t; class dir { add_name remove_name search write }; class sock_file { create setattr unlink };}#============= syslogd_t ==============allow syslogd_t haproxy_var_lib_t:dir { add_name remove_name search write };allow syslogd_t haproxy_var_lib_t:sock_file { create setattr unlink };

Die erste Zeile definiert den Modulnamen und die Version. Der Teil require teilt dem SELinux-Modullader die Typen und Klassen mit, die erforderlich sind, damit die Richtlinie als Modul geladen werden kann. Die letzten beiden Zeilen sind die Regeln, die den Zugriff von Rsyslog auf die chroot– bzw. Socket-Datei von HAProxy erlauben.

Wenn Sie mit der Bearbeitung der Datei fertig sind, speichern und schließen Sie sie, indem Sie ESC drücken, :wq eingeben und ENTER drücken.

Als Nächstes führen Sie den folgenden Befehl aus, um das Paket checkpolicy zu installieren, das das Dienstprogramm checkmodule enthält, mit dem Sie die Type Enforcement-Datei in ein SELinux-Modul umwandeln können.

  • sudo dnf install checkpolicy

Nachdem Sie das Dienstprogramm checkmodule installiert haben, besteht der nächste Schritt darin, das Modul zu kompilieren und es dann in SELinux zu laden. Führen Sie Folgendes aus, um die Type Enforcement-Datei in ein SELinux-Modul zu kompilieren:

  • checkmodule -M -m rsyslog-haproxy.te -o rsyslog-haproxy.mod

Als Nächstes führen Sie semodule_package aus, um ein vollständiges Richtlinienpaket zu generieren, das SELinux in den Linux-Kernel laden kann:

  • semodule_package -o rsyslog-haproxy.pp -m rsyslog-haproxy.mod

Der letzte Schritt besteht darin, das generierte Paket mit dem Befehl semodule in den Linux-Kernel zu laden:

  • sudo semodule -i rsyslog-haproxy.pp

Das Hinzufügen des Moduls kann einige Sekunden dauern. Sobald der Befehl abgeschlossen ist, können Sie bestätigen, dass das Modul in den Kernel geladen wurde, indem Sie den Befehl semodule ausführen:

  • sudo semodule -l |grep rsyslog-haproxy

Sie sollten eine Ausgabe wie die folgende erhalten:

Output
rsyslog-haproxy

Wenn das Modul geladen ist, können Sie Rsyslog mit dem folgenden Befehl neu starten:

  • sudo systemctl restart rsyslog

Sie haben nun eine SELinux-Richtlinie definiert, kompiliert und geladen, die es HAProxy und Rsyslog ermöglicht, über ihren gemeinsamen Socket zu kommunizieren.

Im nächsten Schritt werden Sie testen, ob alles funktioniert, indem Sie eine HTTP-Anfrage an HAProxy stellen und dessen neue Protokolldatei untersuchen.

Schritt 5 – Testen der HAProxy-Protokollierung

Nachdem Sie nun HAProxy, Rsyslog und optional SELinux konfiguriert haben, können Sie testen, ob die Protokollierung an /var/log/haproxy.log funktioniert.

Standardmäßig wird das Paket haproxy mit einer Konfigurationsdatei ausgeliefert, die einen HTTP-Listener-Socket an Port 5000 erstellt. Die Konfiguration verweist auf einen nicht existierenden Backend-Server, so dass jede Anfrage an den Port zu einem HTTP 503-Fehler führen wird.

Um nach einem 503-Fehler in Ihrer /var/log/haproxy.log-Datei zu suchen, erzeugen Sie zunächst eine HTTP-Anfrage mit curl wie folgt:

  • curl -si http://127.0.0.1:5000

Sie sollten eine Ausgabe wie die folgende erhalten:

Output
HTTP/1.0 503 Service UnavailableCache-Control: no-cacheConnection: closeContent-Type: text/html<html><body><h1>503 Service Unavailable</h1>No server is available to handle this request.</body></html>

Untersuchen Sie nun /var/log/haproxy.log mit dem Befehl grep auf HTTP 503-Antworten:

  • sudo grep -E 'NOSRV.+503' /var/log/haproxy.log

Hinweis: Der NOSRV.+503-Teil des Befehls ist ein regulärer Ausdruck. Dieses Tutorial über die Verwendung von Grep & Reguläre Ausdrücke für die Suche nach Textmustern in Linux
geht näher auf die Verwendung von grep und regulären Ausdrücken ein.

Sie sollten eine Zeile (oder mehrere Zeilen) wie die folgende erhalten:

Output
Sep 9 21:32:22 centos-s-1vcpu-1gb-nyc3-01 haproxy: 127.0.0.1:56024 main app/<NOSRV> 0/-1/-1/-1/0 503 212 - - SC-- 1/1/0/0/0 0/0 "GET / HTTP/1.1"

Diese Zeile entspricht der curlAnfrage, die Sie gestellt haben, was bedeutet, dass Rsyslog und HAProxy so konfiguriert sind, dass sie ihren gemeinsamen Socket korrekt verwenden.

Schlussfolgerung

In diesem Schnellstart-Tutorial haben Sie HAProxy so konfiguriert, dass es an einem Unix-Domain-Socket protokolliert. Außerdem haben Sie Rsyslog so eingerichtet, dass es den Socket erstellt und aus ihm liest, so dass die beiden Programme miteinander kommunizieren können, ohne TCP/IP-Ports auf Ihrem System zu öffnen. Schließlich haben Sie optional eine SELinux-Richtlinie kompiliert, gepackt und geladen, um Rsyslog und HAProxy den gemeinsamen Zugriff auf ihr Socket zu ermöglichen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.