Come configurare la registrazione di HAProxy con Rsyslog su CentOS 8 [Quickstart]

Introduzione

HAProxy, che sta per High Availability Proxy, è un server proxy basato su TCP e HTTP ampiamente utilizzato che gira su Linux, Solaris e FreeBSD. Viene utilizzato per bilanciare il carico delle applicazioni distribuendo le richieste tra più server, e per garantire che le applicazioni siano altamente disponibili per gli utenti.

Per impostazione predefinita su molte installazioni CentOS 8, HAProxy non è configurato per scrivere i suoi log su un file. Questa guida rapida spiegherà come configurare la registrazione di HAProxy con Rsyslog utilizzando un socket di dominio Unix per affidabilità, velocità e sicurezza.

Prequisiti

Per completare questa guida, avrai bisogno di un server con CentOS 8. Questo server dovrebbe avere un utente non root con privilegi amministrativi. Per configurarlo, segui la guida alla configurazione iniziale del server per CentOS 8.

Passo 1 – Installare e abilitare HAProxy

Per installare HAProxy, esegui il seguente comando dnf:

  • sudo dnf install haproxy

Quando ti viene richiesto Is this ok : inserisci y e premi RETURN per installare il pacchetto.

Una volta installato HAProxy, abilitalo e avvialo usando il comando systemctl:

  • sudo systemctl enable haproxy.service

Si dovrebbe ricevere il seguente output:

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

Con il servizio HAProxy ora abilitato, puoi avviarlo per assicurarti che funzioni con una configurazione predefinita sul tuo server:

  • sudo systemctl start haproxy.service

Poi esamina lo stato di HAProxy per assicurarti che sia in esecuzione:

  • sudo systemctl status haproxy.service

Dovresti ricevere un output come il seguente. Nota la parte evidenziata active (running) dell’output. Se il tuo server mostra la stessa sezione evidenziata, allora HAProxy sta funzionando correttamente sul tuo server e puoi procedere con la configurazione del logging.

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. . .

Se il tuo output è diverso, o lo stato mostra qualcosa come Active: failed, allora segui i passi di risoluzione dei problemi nel tutorial Come risolvere gli errori comuni di HAProxy per determinare cosa sta impedendo a HAProxy di partire correttamente.

Una volta che hai confermato che HAProxy è abilitato e funzionante, puoi continuare al passo successivo, che è la configurazione delle direttive di log di HAProxy.

Passo 2 – Configurazione delle direttive di log di HAProxy

Per configurare le direttive di log di HAProxy, apri /etc/haproxy/haproxy.cfg in vi o nel tuo editor preferito:

  • sudo vi /etc/haproxy/haproxy.cfg

Premere i per passare alla modalità INSERT, quindi trovare la linea log 127.0.0.1 local2 e commentarla aggiungendo un carattere # all’inizio della linea, come evidenziato nel seguente esempio:

/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. . .

Ora aggiungi una linea direttamente dopo la linea commentata con il seguente contenuto:

 log /dev/log local0

L’intera sezione di /etc/haproxy/haproxy.cfg che hai modificato dovrebbe contenere le seguenti linee:

/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. . .

La linea chroot è importante, perché limita il processo HAProxy ad accedere solo ai file nella directory /var/lib/haproxy. La linea log /dev/log local0 creerà un file all’interno di quella directory che Rsyslog userà per raccogliere voci di log.

Una volta che hai finito di modificare le linee log in /etc/haproxy/haproxy.cfg, salva e chiudi il file premendo ESC, digitando :wq, e premendo ENTER.

L’ultimo passo che devi completare in questa sezione è quello di creare la directory /var/lib/haproxy/dev poiché non esiste di default.

Crea la directory usando il comando mkdir e poi riavvia HAProxy:

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

Hai ora configurato HAProxy per inviare i suoi log a un socket di dominio Unix che risiede in /var/lib/haproxy/dev/log. Nel prossimo passo, configurerai Rsyslog per creare e accedere al socket.

Passo 3 – Configurare Rsyslog per raccogliere i log di HAProxy

La configurazione di default di Rsyslog su CentOS 8 non gestisce i log di HAProxy. Per raccogliere i log dal servizio HAProxy, apri un nuovo file /etc/rsyslog.d/99-haproxy.conf usando vi o il tuo editor preferito:

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

Premi i per passare alla modalità INSERT, quindi incolla le seguenti righe nel file:

/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}

La direttiva $AddUnixListenSocket dice a Rsyslog di creare un socket di dominio Unix nella posizione specificata, in questo caso /var/lib/haproxy/dev/log. La sezione :programname, startswith, "haproxy" specifica il file in cui Rsyslog scriverà le voci di log che raccoglie dal socket.

Una volta che hai finito di modificare /etc/rsyslog.d/99-haproxy.conf, salva e chiudi il file premendo ESC, digitando :wq, e premendo ENTER.

Hai ora configurato Rsyslog per leggere voci di log dal socket del dominio Unix in /var/lib/haproxy/dev/log e scriverle in un file di log in /var/log/haproxy.log.

Tuttavia, prima di riavviare Rsyslog dovrete determinare se SELinux sta attuando il controllo degli accessi sul vostro sistema CentOS 8.

Per controllare la politica attuale di SELinux, eseguite quanto segue:

  • getenforce

Voi riceverete uno dei seguenti output:

  • Enforcing – In questa modalità, SELinux sta attuando il controllo degli accessi sul vostro sistema. Avrete bisogno di completare la seguente sezione opzionale del Passo 4 – Configurazione di SELinux.
  • Permissive – In questo caso, SELinux registra tutti i tentativi di accesso al suo file di log, ma non applica i controlli di accesso sul vostro sistema.
  • Disabled – Se SELinux è disabilitato, allora non sta registrando o applicando alcuna politica di controllo di accesso sul vostro sistema.

Se il comando getenforce ha restituito Permissive o Disabled, allora puoi riavviare Rsyslog con il seguente comando:

  • sudo systemctl restart rsyslog

Una volta riavviato Rsyslog, sarai in grado di visualizzare i log nel file /var/log/haproxy.log che hai configurato in /etc/rsyslog.d/99-haproxy.conf. Procedete al Passo 5 – Testare la registrazione di HAProxy per assicurarvi che tutto funzioni come previsto.

Altrimenti, se il vostro sistema sta eseguendo SELinux in modalità Enforcing, allora la prossima sezione di questo tutorial spiega come aggiungere un modulo per permettere a Rsyslog e HAProxy di comunicare tra loro attraverso il loro socket di dominio Unix condiviso.

Passo 4 – (Opzionale) Configurare SELinux

Se il tuo sistema CentOS 8 è configurato con SELinux in modalità Enforcing, allora dovrai permettere a Rsyslog di accedere alla directory chroot di HAProxy. Consentire questo accesso permetterà a Rsyslog di creare il socket di dominio Unix a cui HAproxy invierà i suoi log.

Se non avete familiarità con SELinux, questa serie di tutorial An Introduction to SELinux on CentOS 7 vi aiuterà ad imparare come gestire e interagire con SELinux. Anche se è scritto per CentOS 7, i principi e i comandi della serie sono ugualmente applicabili a CentOS 8.

Per abilitare l’accesso di Rsyslog e HAProxy al loro socket condiviso, il primo compito è quello di creare un file di policy Type Enforcement. Aprite un nuovo file chiamato rsyslog-haproxy.te in vi o nel vostro editor preferito:

  • vi rsyslog-haproxy.te

Premete i per passare alla modalità INSERT, quindi incollate le seguenti linee nel file:

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 };

La prima linea definisce il nome e la versione del modulo. La porzione require dice al caricatore di moduli SELinux i tipi e le classi che sono richiesti per la policy da caricare come modulo. Le ultime due linee sono le regole che permettono l’accesso di Rsyslog ai file chroot e socket di HAProxy rispettivamente.

Quando avete finito di modificare il file, salvatelo e chiudetelo premendo ESC, digitando :wq, e premendo ENTER.

Poi, eseguite il seguente comando per installare il pacchetto checkpolicy, che contiene l’utilità checkmodule che userete per trasformare il file Type Enforcement in un modulo SELinux.

  • sudo dnf install checkpolicy

Ora che avete installato lo strumento checkmodule, il prossimo passo è compilare il modulo e caricarlo in SELinux. Eseguite quanto segue per compilare il file Type Enforcement in un modulo SELinux:

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

Poi, eseguite semodule_package per generare un pacchetto completo di policy che SELinux può caricare nel kernel Linux:

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

Il passo finale è caricare il pacchetto che avete generato nel kernel Linux utilizzando il comando semodule:

  • sudo semodule -i rsyslog-haproxy.pp

L’aggiunta del modulo può richiedere alcuni secondi. Una volta che il comando è completato potete confermare che il modulo è caricato nel kernel eseguendo il comando semodule:

  • sudo semodule -l |grep rsyslog-haproxy

Dovreste ricevere un output come il seguente:

Output
rsyslog-haproxy

Una volta che il modulo è caricato potete riavviare Rsyslog con il seguente comando:

  • sudo systemctl restart rsyslog

Ora avete definito, compilato e caricato una SELinux policy che permetterà a HAProxy e Rsyslog di comunicare sul loro socket condiviso.

Nel prossimo passo testerete che tutto funzioni facendo una richiesta HTTP a HAProxy ed esaminando il suo nuovo file di log.

Passo 5 – Testare il logging di HAProxy

Ora che hai configurato HAProxy, Rsyslog, e opzionalmente SELinux, puoi testare che il logging a /var/log/haproxy.log funzioni.

Di default il pacchetto haproxy viene fornito con un file di configurazione che crea un socket HTTP listener sulla porta 5000. La configurazione punta a un server backend inesistente, quindi qualsiasi richiesta alla porta risulterà in un errore HTTP 503.

Per verificare la presenza di un errore 503 nel tuo file /var/log/haproxy.log, prima genera una richiesta HTTP usando curl come questa:

  • curl -si http://127.0.0.1:5000

Dovresti ricevere un output come il seguente:

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>

Ora esamina /var/log/haproxy.log per qualsiasi risposta HTTP 503 usando il comando grep:

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

Nota: La parte NOSRV.+503 del comando è una espressione regolare. Questo tutorial sull’uso di Grep &espressioni regolari per cercare modelli di testo in Linux
approfondisce l’uso di grep e delle espressioni regolari.

Dovresti ricevere una linea (o più linee) come la seguente:

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"

Questa linea corrisponde alla richiesta curl che hai fatto, il che significa che Rsyslog e HAProxy sono configurati per usare correttamente il loro socket condiviso.

Conclusione

In questo tutorial quickstart, hai configurato HAProxy per registrare su un socket di dominio Unix. Hai anche configurato Rsyslog per creare e leggere dal socket in modo che i due programmi possano comunicare tra loro senza aprire alcuna porta TCP/IP sul tuo sistema. Infine, hai opzionalmente compilato, impacchettato e caricato una policy SELinux per permettere a Rsyslog e HAProxy l’accesso condiviso al loro socket.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.