Protéger vos applications web avec Caddy et Coraza WAF

Un WAF (Web Application Firewall) est un outil essentiel pour protéger vos applications web des attaques courantes comme les injections SQL, les scripts intersites (XSS) ou les attaques par force brute.

Dans ce tutoriel, nous allons configurer Caddy, un serveur web moderne et facile à utiliser, avec le Coraza WAF, basé sur les règles OWASP Core Rule Set (CRS). Vous apprendrez à compiler et configurer Caddy avec Coraza pour une sécurité optimale.


  • Caddy : Simple à configurer, gère automatiquement le HTTPS, et permet une intégration rapide avec Coraza.
  • Coraza WAF : Puissant et conforme à l’OWASP CRS, il offre une protection avancée contre les vulnérabilités.
  • Support en production : À ce jour, Caddy est le seul serveur web compatible avec Coraza en mode production. Les alternatives comme HAProxy, Nginx, Apache ou Traefik sont encore en mode expérimental, preview ou en développement. Pour plus d’information, se référer à la documentation ici.

Ensemble, ils constituent une solution robuste et moderne pour sécuriser vos applications web.


L’installation de la version disponible dans le dépôt Copr n’est pas strictement nécessaire, car elle n’intègre pas le WAF. Cependant, elle crée automatiquement les répertoires par défaut, configure les autorisations nécessaires et met en place le service systemd pour gérer Caddy, ce qui nous évite de le faire manuellement.

  1. Activez le dépôt Copr pour Caddy :

    bash

    sudo dnf install -y 'dnf-command(copr)'
    sudo dnf copr enable @caddy/caddy
  2. Installez Caddy

    bash

    sudo dnf install -y caddy
  3. Vérifiez l’installation :

    bash

    caddy version

  1. Installez Golang et xcaddy :

    bash

    sudo dnf install -y golang
    go install github.com/caddyserver/xcaddy/cmd/xcaddy@latest
  2. Compilez Caddy avec le module Coraza :

    bash

    ./go/bin/xcaddy build --with github.com/corazawaf/coraza-caddy/v2
  3. Remplacez la version installée depuis le dépôt Copr (qui n’intègre pas le WAF) par celle compilée avec Coraza :

    bash

    sudo cp /usr/bin/caddy /usr/bin/caddy.orig
    sudo cp -f ./caddy /usr/bin/caddy
  4. Vérifiez l’intégration de Coraza :

    bash

    caddy list-modules | grep http.handlers | grep waf

    Exemple de sortie :

    plaintext

    http.handlers.waf

Pour cet exemple, nous définissons une règle de sécurité qui bloque l’accès à la page /admin et renvoie un statut HTTP 403 à chaque tentative. Cela permet de tester les fonctionnalités de Coraza en mode bloquant ici.

  1. Créez le fichier de configuration Coraza :

    bash

    sudo mkdir /etc/caddy/coraza
    sudo tee /etc/caddy/coraza/coraza.conf > /dev/null << 'EOF'
    
    # Activer les logs d'audit
    SecAuditEngine On
    SecAuditLog "/var/log/caddy/coraza.log"
    
    # Activer le moteur de règles
    SecRuleEngine On
    SecRequestBodyAccess On
    SecDefaultAction "phase:1,log,deny,status:403"
    
    # Règle de test : Bloquer l'accès à /admin
    SecRule REQUEST_URI "@rx ^/admin" "id:1,phase:1,deny,status:403,log,msg:'Access to admin is forbidden'"
    EOF
  2. Créer les fichiers de log nécessaires :

    bash

    sudo mkdir -p /var/log/caddy
    sudo touch /var/log/caddy/coraza.log
    sudo chown caddy:caddy /var/log/caddy/ -R

  1. Modifiez le fichier Caddyfile :

    bash

    sudo tee /etc/caddy/Caddyfile > /dev/null << 'EOF'
    {
        debug
        auto_https off
    
        # Cette ligne est nécessaire pour que Coraza fonctionne.
        order coraza_waf first
    }
    
    https://caddy.systems-it.net {
        tls /etc/caddy/certs/server.crt /etc/caddy/certs/server.key
    
        # Ajouter le plugin Coraza
        coraza_waf {
            directives `
                # Ajouter la règle que nous avons créé précédemment pour renvoyer un code 403 chaque fois que quelqu'un tente d'accéder au path /admin
                Include /etc/caddy/coraza/coraza.conf
            `
        }
        reverse_proxy 127.0.0.1:8080
    }
    EOF
  2. Formatez et validez la configuration :

    bash

    sudo caddy fmt --overwrite /etc/caddy/Caddyfile
    sudo caddy validate --config /etc/caddy/Caddyfile

  1. Redémarrez Caddy :

    bash

    sudo systemctl restart caddy
  2. Testez avec curl :

    bash

    curl -I -k https://caddy.systems-it.net/admin
  3. En cas de problème SELinux, corrigez les contextes :

    bash

    sudo semanage fcontext -a -t httpd_log_t "/var/log/caddy(/.*)?"
    sudo restorecon -R /var/log/caddy

En suivant ce guide, vous avez configuré un reverse proxy sécurisé avec Caddy et Coraza WAF. Cette solution protège efficacement vos applications web tout en restant simple à maintenir. Pour plus de sécurité, surveillez régulièrement les logs et mettez à jour vos outils.

Partagez vos expériences dans les commentaires et rejoignez notre communauté dédiée à la cybersécurité et au DevOps !