Marvin Pascale

[B.Log]

19 Marzo 2025

WAF in docker

WAF Nel panorama attuale della sicurezza informatica, la protezione delle applicazioni web esposte su Internet è essenziale per prevenire attacchi informatici sempre più sofisticati. Un Web Application Firewall (WAF) rappresenta un componente fondamentale nella difesa di un’infrastruttura, proteggendo da attacchi come SQL injection, cross-site scripting (XSS), brute-force e altre minacce.

Questo articolo è a completamento del video uscito su youtube ed esploreremo i comandi necessari per portare a termine questa procedura su un sistema operativo GNU/LINUX. WAF

Implementeremo un WAF (Web Application Firewall) in un ambiente containerizzato utilizzando Docker e Docker Compose, sfruttando tre strumenti chiave:

  • Nginx Proxy Manager: un reverse proxy con interfaccia intuitiva per la gestione del traffico web.
  • CrowdSec: un sistema di rilevamento e risposta collaborativo per l’analisi dei log e la protezione da attacchi malevoli.
  • CrowdSec AppSec: un modulo avanzato per la protezione delle applicazioni web, applicando regole di sicurezza sulle richieste HTTP sospette.

Vedremo come installare, configurare e mettere in sicurezza l’ambiente per garantire una protezione efficace e scalabile.

Mani in pasta

L’uso di Docker Compose semplifica la gestione e l’orchestrazione dei container, permettendo una configurazione modulare e facilmente replicabile.

1. Installazione e Preparazione dell’Ambiente

Prima di iniziare, assicurarsi di avere Docker e Docker Compose installati.

Creiamo una directory dedicata e spostiamoci al suo interno:

# mkdir -p ~/waf-docker && cd ~/waf-docker

Creiamo una network Docker dedicata per la comunicazione tra i servizi:

# docker network create -d bridge npm

2. Creazione del File docker-compose.yml

Ecco la configurazione completa del nostro stack:

services:
  npm:
    image: 'lepresidente/nginxproxymanager:latest'
    restart: unless-stopped
    networks:
      - crowdsec
      - npm
    ports:
      - '80:80'  # HTTP pubblico
      - '443:443' # HTTPS pubblico
      - '127.0.0.1:81:81'  # Interfaccia di amministrazione
    environment:
      CROWDSEC_OPENRESTY_BOUNCER: |
        ENABLED=true
        API_URL=http://crowdsec:8080
        API_KEY=${CROWDSEC_BOUNCER_APIKEY}
        APPSEC_URL=http://crowdsec:7422
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
    security_opt:
      - no-new-privileges=true

  crowdsec:
    image: docker.io/crowdsecurity/crowdsec:latest
    container_name: crowdsec
    environment:
      - COLLECTIONS=crowdsecurity/nginx-proxy-manager
    volumes:
      - crowdsec-db:/var/lib/crowdsec/data/
      - crowdsec-config:/etc/crowdsec/
      - ./data/logs/:/var/log/npm:ro
    networks:
      - crowdsec
    restart: unless-stopped
    security_opt:
      - no-new-privileges=true

volumes:
  crowdsec-db:
  crowdsec-config:

networks:
  crowdsec:
    driver: bridge
  npm:
    external: true

3. Creazione della Chiave API per il Bouncer

Per abilitare la comunicazione tra CrowdSec e il bouncer, generiamo una chiave API:

# docker compose up crowdsec -d
# docker compose exec crowdsec cscli bouncer add npm-bouncer

Aggiungiamo la chiave al file*.env* nella directory del docker-compose.yml:

# echo "CROWDSEC_BOUNCER_APIKEY=<chiave mostrata dall'output>" >> .env

Entiramo nel contaier per le configurazioni

# docker compose exec -ti crowdsec bash

cscli collections install crowdsecurity/appsec-virtual-patching crowdsecurity/appsec-generic-rules

mkdir  -p /etc/crowdsec/acquis.d

cat > /etc/crowdsec/acquis.d/appsec.yaml << EOF
listen_addr: 0.0.0.0:7422
appsec_config: crowdsecurity/appsec-default
name: myAppSecComponent
source: appsec
labels:
  type: appsec
  
EOF


exit

Dopo aver aggiornato il file .env, e configurato le applicazioni riavviamo i container:

# docker compose down
# docker compose up -d

4. Verifica dell’Ambiente

Per verificare lo stato dei container, eseguire:

# docker ps

Per controllare i log di un container specifico:

# docker logs <nome_container> -f

Configurazione di Nginx Proxy Manager

L’interfaccia di Nginx Proxy Manager è accessibile all’URL http://127.0.0.1:81 tramite tunnel localForward ssh e si può accedere con le credenziali di amministrazione ([email protected] / changeme). L’interfaccia offre una panoramica completa del traffico web, consentendo di configurare virtual host, regole di sicurezza e monitorare le attività. Dopo l’autenticazione con le credenziali predefinite sarà necessario indicare un utente amministratore e impostare una nuova password; successivamente potremo gestire certificati SSL, virtual host e regole di sicurezza personalizzate.

Protezione con CrowdSec

Monitoraggio e Analisi degli Eventi

CrowdSec analizza i log di Nginx Proxy Manager, identificando pattern di attacco e applicando misure di mitigazione. Possiamo monitorare gli eventi con:

# docker logs crowdsec -f

Per visualizzare le decisioni di blocco attive:

# docker exec -it crowdsec cscli decisions list

Approfondimenti e Ottimizzazioni

  • Personalizzazione delle Regole di Sicurezza: CrowdSec permette di definire criteri personalizzati per l’individuazione delle minacce.
  • Scalabilità: L’infrastruttura può essere estesa con orchestratori come Kubernetes.
  • Integrazione con altri strumenti: CrowdSec può essere integrato con SIEM e sistemi di monitoraggio avanzati.

Conclusioni

L’implementazione di Nginx Proxy Manager, CrowdSec e CrowdSec AppSec offre una soluzione efficace per proteggere le applicazioni web. Grazie alla modularità di Docker, questa configurazione è facilmente scalabile e adattabile a scenari di produzione complessi, garantendo un elevato livello di sicurezza.


Le opinioni in quanto tali sono opinabili e nulla ti vieta di approfondire l’argomento.

Risorse: