WAF in docker
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.
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: