G DATA XDR

Riduzione del traffico di rete mediante caching degli aggiornamenti con HAProxy

Introduzione

Questo articolo descrive come ridurre il traffico di rete tra gli G DATA Agent e il backend G DATA. A tale scopo, un’istanza di HAProxy eseguita localmente memorizza nella cache i download effettivi dei file di aggiornamento tramite la porta 80. Il confronto preliminare dell’elenco dei file e dei valori hash non è interessato: viene eseguito in modo indipendente tramite la porta 443 e non viene memorizzato nella cache.

Un proxy con funzione di caching offre il vantaggio di ridurre il volume di dati scaricati dal cliente. Gli aggiornamenti vengono scaricati una sola volta da Internet e successivamente distribuiti localmente a tutti gli Agent della rete.

Questo articolo è rivolto principalmente a chi amministra sistemi e dispone di conoscenze di Linux e delle reti. I termini tecnici vengono inoltre spiegati brevemente, in modo che anche chi non possiede conoscenze informatiche approfondite possa seguire la procedura.

Informazioni di base: che cos’è HAProxy e che cosa fa un proxy con funzione di caching?

Quando molti G DATA Agent sono in esecuzione nella stessa rete, normalmente ogni Agent scarica singolarmente gli aggiornamenti delle firme di sicurezza e del programma direttamente da Internet, dal server di aggiornamento G DATA. Con cento endpoint, questo significa cento download identici attraverso la propria connessione Internet.

Un proxy è un intermediario tra gli G DATA Agent e il backend G DATA. Una cache è una memoria temporanea. La prima richiesta di un file di aggiornamento viene inoltrata normalmente a Internet. La risposta viene anche salvata localmente. Ogni successiva richiesta dello stesso file riceve una risposta direttamente da questa memoria locale. La connessione Internet non viene quindi utilizzata nuovamente.

HAProxy è un software open source molto diffuso. Svolge questa funzione in modo affidabile come proxy TCP/HTTP con funzione di caching.

Prerequisiti

  • Un server Linux (ad es. Debian/Ubuntu) nella rete. Tutti gli G DATA Agent devono poter raggiungere questo server.

  • Privilegi root o sudo su questo server.

  • Un certificato TLS valido, comprensivo della catena di certificati. Deve essere valido per il nome host con cui gli Agent accedono al proxy tramite HTTPS (richieste di indici e metadati).

  • Autorizzazioni di accesso alla rete:

    • Il server proxy deve poter raggiungere il server di aggiornamento G DATA agent-update-server.gdatasecurity.de. Sono necessarie due porte: la porta HTTPS 443 e la porta HTTP 80.

    • Anche gli G DATA Agent devono poter raggiungere il server proxy tramite la porta HTTPS 443 e la porta HTTP 80.

  • È utile disporre di conoscenze di base sull’utilizzo dei file di configurazione HAProxy, anche se questa documentazione fornisce un modello pronto all’uso.

Raggiungibilità del Cloud G DATA

Per garantire la segnalazione affidabile e tempestiva di eventi e incidenti, il cloud G DATA deve essere raggiungibile e non deve essere bloccato da un firewall. A tal fine sono necessarie le impostazioni elencate di seguito. È necessario assicurarsi che *.gdatasecurity.de e *.gdatasoftware.com possano essere risolti e siano raggiungibili.

  • Aperture delle porte

    • Gli Agent G DATA sugli endpoint devono poter raggiungere gli IP dei nostri server backend tramite la porta TCP/443, intervallo IP 194.156.84.0/22 (194.156.84.0 - 194.156.87.255).

  • Protocolli

    • I sistemi devono poter comunicare tramite i protocolli HTTPS:// e anche WSS://.

  • TLS

Configurazione di HAProxy

Passaggio 1: installare HAProxy

Installi HAProxy tramite il gestore pacchetti della Sua distribuzione Linux, ad esempio su Debian/Ubuntu:

sudo apt update
sudo apt install haproxy
Passaggio 2: preparare il certificato

HAProxy gestisce la terminazione della connessione TLS degli Agent. A tale scopo necessita di un certificato e della relativa chiave privata.

HAProxy richiede che certificato, catena di certificati e chiave privata siano contenuti in un unico file PEM, combinati in questo ordine. I singoli componenti sono:

Ordine Componente

1

Il certificato vero e proprio (certificato del server).

2

I certificati intermedi, detti anche Bundle o Chain.

3

Il certificato della CA radice, se disponibile separatamente.

4

La chiave privata.

Unisca i file in un unico file PEM esattamente in questo ordine. Esempio:

cat server.crt intermediate.crt root-ca.crt server.key > /etc/haproxy/certs/haproxy-cache.pem
chmod 640 /etc/haproxy/certs/haproxy-cache.pem
chown root:haproxy /etc/haproxy/certs/haproxy-cache.pem
Passaggio 3: creare la configurazione HAProxy

Crei il file di configurazione haproxy.cfg in /etc/haproxy/. Utilizzi a tale scopo il modello riportato di seguito (vedere Esempio di configurazione completa). Sostituisca un eventuale file esistente con questo modello.

Adatti i seguenti segnaposto:

Segnaposto Significato

{{ haproxy_caching_bind }}

L’indirizzo IP su cui HAProxy è in ascolto. È l’IP tramite il quale gli Agent raggiungono il proxy.

{{ haproxy_caching_server_cert }}

Il percorso completo del file del certificato PEM del passaggio 2, ad es. /etc/haproxy/certs/haproxy-cache.pem.

{{ haproxy_caching_server }}

Il nome host interno con cui gli Agent accedono al server di caching. Questo nome deve essere presente nell’header Host.

Passaggio 4: avviare o riavviare HAProxy

Riavvii il servizio dopo aver creato o modificato la configurazione:

sudo systemctl restart haproxy
sudo systemctl enable haproxy
Passaggio 5 (facoltativo): verificare la configurazione

Verifichi la sintassi del file di configurazione prima di riavviare HAProxy. In questo modo potrà individuare tempestivamente gli errori di digitazione:

haproxy -c -f /etc/haproxy/haproxy.cfg

Se la verifica non rileva errori, viene visualizzato Configuration file is valid.

Esempio di configurazione completa

Il seguente file haproxy.cfg funge da modello. Sostituisca i tre segnaposto. Il significato dei segnaposto è riportato in Configurazione di HAProxy.

global
  log /dev/log  sample 1:10 local0
  log /dev/log  sample 1:10 local1 notice
  chroot /var/lib/haproxy
  stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
  stats timeout 30s
  user haproxy
  group haproxy
  daemon
  maxconn                     256000
  hard-stop-after             15m
  tune.ssl.default-dh-param   2048

defaults
  log     global
  mode    http
  option  httplog
  option  dontlognull
  option  http-keep-alive
  option  forwardfor
  timeout     http-request 10s
  timeout     queue 1m
  timeout     connect 10s
  timeout     client 20s
  timeout     server 20s
  timeout     http-keep-alive 10s
  timeout     check 10s
  errorfile 400 /etc/haproxy/errors/400.http
  errorfile 403 /etc/haproxy/errors/403.http
  errorfile 408 /etc/haproxy/errors/408.http
  errorfile 500 /etc/haproxy/errors/500.http
  errorfile 502 /etc/haproxy/errors/502.http
  errorfile 503 /etc/haproxy/errors/503.http
  errorfile 504 /etc/haproxy/errors/504.http

frontend stats
  bind {{ haproxy_caching_bind }}:8404 ssl crt {{ haproxy_caching_server_cert }} alpn h2,http/1.1
  stats enable
  stats uri /
  stats refresh 10s
  http-request set-log-level silent
  http-request use-service prometheus-exporter if { path /metrics }

# ---------------------------------------------------------------------------
# Porta 80 (HTTP): download effettivo dei file - QUI avviene il caching.
# ---------------------------------------------------------------------------
frontend http_update_server
  bind {{ haproxy_caching_bind }}:80
  acl is_update_download path_beg /api/v2/update/download/
  acl is_caching_host req.hdr(host) -i {{ haproxy_caching_server }}
  http-request set-header X-Forwarded-Host %[req.hdr(Host)]
  http-request set-header Host %[req.hdr(Host)]
  # Solo le richieste di download al nome host noto vengono servite dalla cache.
  use_backend http_update_server_backend if is_update_download is_caching_host
  # Reindirizzare per sicurezza tutte le altre richieste sulla porta 80 a HTTPS.
  http-request redirect scheme https code 301 unless is_update_download
  default_backend nomatch

# ---------------------------------------------------------------------------
# Porta 443 (HTTPS): verifica di indici/hash - semplice inoltro SENZA caching.
# Queste risposte sono piccole, cambiano spesso e G DATA
# le esclude intenzionalmente dal caching.
# ---------------------------------------------------------------------------
frontend https_update_server
  bind {{ haproxy_caching_bind }}:443 ssl crt {{ haproxy_caching_server_cert }} alpn h2,http/1.1
  http-request set-header X-Forwarded-Host %[req.hdr(Host)]
  http-request set-header Host %[req.hdr(Host)]
  use_backend https_update_server_backend if { req.hdr(host) -i {{ haproxy_caching_server }} }
  default_backend nomatch

cache objectcache_update_server
  total-max-size 3000
  max-object-size 200000000
  max-age 86400

backend http_update_server_backend
  balance roundrobin
  http-request set-header Connection keep-alive
  http-request set-header Host agent-update-server.gdatasecurity.de
  http-request set-header X-Forwarded-Proto http
  http-request cache-use objectcache_update_server if { path_beg /api/v2/update/download/ }
  http-response cache-store objectcache_update_server
  option httpchk GET /api/status
  http-check send hdr Host agent-update-server.gdatasecurity.de
  http-check expect status 200
  server agent-update-server.gdatasecurity.de agent-update-server.gdatasecurity.de:80 check inter 10s

backend https_update_server_backend
  balance roundrobin
  http-request set-header Connection keep-alive
  http-request set-header Host agent-update-server.gdatasecurity.de
  http-request set-header X-Forwarded-Proto https
  option httpchk GET /api/status
  http-check send hdr Host agent-update-server.gdatasecurity.de
  http-check expect status 200
  server agent-update-server.gdatasecurity.de agent-update-server.gdatasecurity.de:443 check inter 10s check-sni agent-update-server.gdatasecurity.de sni str(agent-update-server.gdatasecurity.de) ssl verify required ca-file /etc/ssl/certs/ca-certificates.crt

backend nomatch
  errorfile 503 /etc/haproxy/errors/503.http

Spiegazione della configurazione

Le sezioni principali vengono spiegate singolarmente di seguito. In questo modo, anche chi ha meno esperienza con HAProxy può comprendere la configurazione.

Sezione Spiegazione

global / defaults

Impostazioni di base dei processi e delle connessioni. Esempi: registrazione dei log, numero massimo di connessioni simultanee (maxconn), timeout predefiniti. Di norma non è necessario modificare questi valori.

frontend stats

Mette a disposizione una pagina di stato sulla porta 8404. Tramite questa pagina è possibile monitorare lo stato di HAProxy, anche in formato Prometheus (/metrics).

frontend http_update_server

Il punto di ingresso per i download effettivi dei file sulla porta 80. Solo le richieste sotto il percorso /api/v2/update/download/ dirette al nome host noto vengono inoltrate al backend con funzione di caching. Tutte le altre richieste sulla porta 80 vengono reindirizzate a HTTPS per sicurezza.

frontend https_update_server

Il punto di ingresso per le verifiche degli indici e dei valori hash sulla porta 443 (TLS). Qui HAProxy verifica se il nome host richiesto ({{ haproxy_caching_server }}) corrisponde al backend di aggiornamento. Solo in questo caso HAProxy inoltra la richiesta. In caso contrario, la richiesta viene indirizzata al backend nomatch e riceve l’errore 503. In questo punto non viene eseguito alcun caching.

cache objectcache_update_server

Definisce la memoria cache. Sono importanti tre valori: la dimensione massima complessiva della cache (total-max-size, in MB), la dimensione massima di un singolo file (max-object-size, in byte) e il tempo massimo di permanenza di un oggetto nella cache (max-age, in secondi). Il modello utilizza una dimensione complessiva di circa 3 GB, fino a 200 MB per file e una validità di 24 ore. Solo il backend HTTP utilizza questa cache.

backend http_update_server_backend

Inoltra le richieste di download senza crittografia (porta 80) a agent-update-server.gdatasecurity.de. La riga http-request cache-use …​ if { path_beg /api/v2/update/download/ } garantisce che venga memorizzato nella cache solo questo percorso. Il controllo http-check verifica continuamente se il server G DATA è raggiungibile.

backend https_update_server_backend

Inoltra le richieste di indici e valori hash in forma crittografata (porta 443, con verifica del certificato) allo stesso server G DATA. Questo backend non contiene né cache-use né cache-store. Le risposte vengono inoltrate, ma non memorizzate.

backend nomatch

Intercetta tutte le richieste che non corrispondono ad alcun host noto. Queste richieste ricevono l’errore 503. In questo modo la configurazione impedisce l’uso improprio come proxy aperto.

HAProxy memorizza nella cache solo le richieste sotto il percorso /api/v2/update/download/ tramite HTTP. Le richieste di indici e valori hash tramite HTTPS continuano a essere inoltrate senza modifiche. Gli altri canali di comunicazione degli Agent, ad esempio la telemetria o le segnalazioni al backend XDR, non sono interessati dal caching.

Riconfigurare gli Agent per utilizzare il server di caching

Se ha già installato gli G DATA Agent sugli endpoint, contatti il supporto tecnico al numero +49 234 9762-901. Il personale del supporto provvederà a riconfigurare i Suoi G DATA Agent.

Se non ha ancora distribuito alcun G DATA Agent, crei una configurazione di installazione specificando l’indirizzo del proxy. Tutti gli endpoint installati con il relativo SetupID riceveranno gli aggiornamenti tramite il Suo proxy.

Si assicuri di verificare che la configurazione funzioni. Gli endpoint che non ricevono aggiornamenti rappresentano un rischio per la sicurezza. Mantenga sempre attivo il server di fallback nella configurazione (deve essere disattivato solo in casi eccezionali giustificati). Con il server di fallback attivo, i Suoi endpoint ricevono gli aggiornamenti anche quando escono dalla rete (ad esempio i laptop) o quando il server reverse proxy non funziona.

Risoluzione dei problemi

Sintomo Procedura

HAProxy non si avvia

Verifichi la configurazione con haproxy -c -f /etc/haproxy/haproxy.cfg. Controlli inoltre lo stato del servizio con systemctl status haproxy e journalctl -u haproxy.

Gli Agent ricevono errori del certificato

Verifichi due aspetti: il file PEM contiene certificato, certificati intermedi e chiave privata nell’ordine corretto? Il nome host nel certificato corrisponde a {{ haproxy_caching_server }}?

Non si rileva alcuna riduzione del traffico Internet

Verifichi tramite la pagina di stato (frontend stats, porta 8404) se le richieste di download passano attraverso il backend http_update_server_backend e se vengono trovate corrispondenze nella cache. Il backend https_update_server_backend non esegue intenzionalmente il caching.

Le richieste vengono indirizzate al backend nomatch

L’header Host della richiesta in ingresso non corrisponde a {{ haproxy_caching_server }}. Verifichi la configurazione degli Agent e la risoluzione DNS.