S04 - Serveur mandataire : Squid et SquidGuard

Objectif

Comprendre ce qu’est un proxy, monter un Squid, observer les requêtes, puis filtrer des domaines et des URL avec une page de blocage (le projet SquidGuard).


1. Un proxy, c’est quoi ?

Un serveur mandataire (proxy) est un intermédiaire : le client envoie sa requête au proxy, qui la relaie (ou non) vers le serveur.

sequenceDiagram
  participant C as Client (navigateur)
  participant P as Proxy Squid :3128
  participant W as Site web
  C->>P: GET http://exemple.fr
  alt Site sur liste noire
    P-->>C: 403 / redirection vers la page de blocage
  else Page en cache
    P-->>C: Réponse depuis le cache (TCP_HIT)
  else
    P->>W: GET http://exemple.fr (avec l'IP du proxy)
    W-->>P: Réponse
    P-->>C: Réponse (+ copie en cache : TCP_MISS)
  end
Type de proxyRôle
Proxy HTTP / directLes clients sont configurés pour passer par lui
Proxy cacheGarde une copie des pages pour accélérer
Proxy transparentIntercepte le trafic sans configuration côté client (redirection au routeur)
Reverse proxy (inverse)Devant les serveurs : répartit la charge, protège (HAProxy, Nginx) → SV03 - HAProxy (reverse proxy et répartition de charge)
Proxy anonymeMasque l’IP du client
✅ Avantages❌ Inconvénients
Filtrage / contrôle d’accèsLatence supplémentaire
Journalisation (qui va où)Point de passage unique (SPOF)
Cache (économie de bande passante)Peut enregistrer des données privées
Masquage des IP internesHTTPS limite fortement le cache et le filtrage fin

2. Le labo Vagrant du cours

Le cours fournit un Vagrantfile qui crée 2 VM : squid_proxy (Squid ouvert à tous) et squid_client (déjà configuré pour utiliser le proxy). Installation de Vagrant : V04 - Vagrant.

cd "dossier/contenant/le/Vagrantfile"
vagrant up                      # crée et démarre les 2 VM
# Terminal 1 : le proxy
vagrant ssh squid_proxy
sudo tail -f /var/log/squid/access.log
# Terminal 2 : le client
vagrant ssh squid_client
curl https://www.google.com     # la requête apparaît dans le terminal 1

Statistiques du proxy :

sudo apt install squidclient -y        # (paquet squidclient)
squidclient -h localhost -p 3128 mgr:info

Pour générer du trafic : scripts/securite/test_squid.sh 192.168.56.10:3128 50 (adapte l’IP).

Lire access.log

1728212345.123   85 192.168.56.11 TCP_MISS/200 12345 GET http://example.com/ - HIER_DIRECT/93.184.215.14 text/html
                 │        │            │                │                         │
               durée    client    résultat/code      méthode + URL           serveur contacté

TCP_HIT = servi depuis le cache, TCP_MISS = récupéré sur Internet, TCP_DENIED/403 = bloqué, TCP_TUNNEL = HTTPS (méthode CONNECT, contenu non visible).


3. Installer Squid à la main (Debian/Ubuntu)

sudo apt update && sudo apt install -y squid
sudo cp /etc/squid/squid.conf /etc/squid/squid.conf.origine     # sauvegarde

Configuration minimale /etc/squid/squid.conf (remplace tout le fichier) :

# Port d'écoute
http_port 3128
 
# Qui a le droit d'utiliser le proxy
acl reseau_local src 192.168.56.0/24
 
# Ports autorisés
acl ports_ssl port 443
acl ports_surs port 80 443
acl CONNECT method CONNECT
 
# Listes noires (un élément par ligne)
acl domaines_interdits dstdomain "/etc/squid/blacklist_domaines.txt"
acl urls_interdites url_regex -i "/etc/squid/blacklist_urls.txt"
 
# Ordre des règles : la PREMIÈRE qui correspond s'applique
http_access deny !ports_surs
http_access deny CONNECT !ports_ssl
http_access deny domaines_interdits
http_access deny urls_interdites
http_access allow reseau_local
http_access deny all
 
# Page de blocage (fonctionne pour le HTTP ; en HTTPS le navigateur affiche une erreur)
deny_info http://192.168.56.10/bloque.html domaines_interdits
deny_info http://192.168.56.10/bloque.html urls_interdites
 
# Cache disque : 1 Go
cache_dir ufs /var/spool/squid 1000 16 256
access_log /var/log/squid/access.log squid
# Listes noires
printf ".facebook.com\n.tiktok.com\n.jeux-en-ligne.example\n" | sudo tee /etc/squid/blacklist_domaines.txt
printf "youtube\\.com/shorts\nreddit\\.com/r/gaming\n" | sudo tee /etc/squid/blacklist_urls.txt
 
sudo squid -k parse                  # vérifier la syntaxe
sudo systemctl restart squid
sudo systemctl status squid

Le point devant .facebook.com bloque le domaine et tous ses sous-domaines (www.facebook.com, m.facebook.com…).

Configurer le client

# Pour la session courante (Linux)
export http_proxy="http://192.168.56.10:3128"
export https_proxy="http://192.168.56.10:3128"
curl -I http://example.com
curl -I https://www.facebook.com     # doit renvoyer 403 (bloqué)
# Ou ponctuellement :
curl -x http://192.168.56.10:3128 -I http://example.com

Navigateur : Paramètres → Réseau → Proxy manuel → IP du proxy, port 3128, « utiliser aussi pour HTTPS ».


4. La page de blocage (serveur web sur le proxy)

sudo apt install -y apache2
sudo tee /var/www/html/bloque.html > /dev/null <<'EOF'
<!doctype html>
<html lang="fr"><head><meta charset="utf-8"><title>Accès bloqué</title>
<style>body{font-family:sans-serif;background:#1e293b;color:#f1f5f9;text-align:center;padding-top:15vh}
h1{color:#f87171}</style></head>
<body><h1>⛔ Accès bloqué</h1>
<p>Ce site est interdit par la politique de sécurité de l'entreprise.</p>
<p>Besoin d'un accès ? Ouvrez un ticket au support informatique.</p></body></html>
EOF

5. Variante SquidGuard (demandée au projet)

SquidGuard est un redirecteur : Squid lui passe chaque URL, il répond « OK » ou « redirige vers la page de blocage ». Il gère de grosses listes noires (ex. listes de l’Université Toulouse Capitole).

SquidGuard n'est plus développé depuis longtemps et a été retiré de certaines versions récentes de Debian. Sur Debian 12 il s'installe encore (apt install squidguard). S'il est absent de ta distribution, les ACL Squid de la partie 3 font le même travail, ou utilise E2Guardian / ufdbGuard.

sudo apt install -y squidguard
sudo mkdir -p /var/lib/squidguard/db/interdits
echo -e "facebook.com\ntiktok.com" | sudo tee /var/lib/squidguard/db/interdits/domains
echo -e "youtube.com/shorts\nreddit.com/r/gaming" | sudo tee /var/lib/squidguard/db/interdits/urls

/etc/squidguard/squidGuard.conf :

dbhome /var/lib/squidguard/db
logdir /var/log/squidguard
 
dest interdits {
    domainlist interdits/domains
    urllist    interdits/urls
}
 
acl {
    default {
        pass !interdits all
        redirect http://192.168.56.10/bloque.html
    }
}

Brancher SquidGuard dans /etc/squid/squid.conf (ajouter) :

url_rewrite_program /usr/bin/squidGuard -c /etc/squidguard/squidGuard.conf
url_rewrite_children 5
sudo squidGuard -C all                               # compiler les listes en bases .db
sudo chown -R proxy:proxy /var/lib/squidguard/db /var/log/squidguard
sudo systemctl restart squid
# Test SANS passer par le navigateur :
echo "http://www.facebook.com/ 192.168.56.11/- - GET" | sudo -u proxy squidGuard -c /etc/squidguard/squidGuard.conf
# → doit renvoyer une ligne de redirection vers bloque.html

6. Squid et HTTPS : le problème

En HTTPS, le proxy ne voit que le nom de domaine (méthode CONNECT + SNI), pas l’URL complète ni le contenu → pas de cache et filtrage par URL impossible.

Pour tout voir, il faut faire du SSL Bumping : l’entreprise crée sa propre autorité de certification, l’installe sur tous les postes, et Squid déchiffre puis rechiffre chaque connexion (attaque « homme du milieu » légitime).

Le SSL Bumping donne au proxy accès à tout : mots de passe, données bancaires, santé… C'est un enjeu de sécurité et de RGPD (information des salariés obligatoire). À réserver aux environnements qui l'imposent.

À quoi sert Squid aujourd’hui ? Surtout au filtrage par domaine, à la journalisation (traçabilité légale) et à l’authentification des accès Internet.


7. Livrables du projet SquidGuard

  1. Fichiers de configuration (squid.conf, squidGuard.conf, listes).
  2. Documentation du projet (cette fiche peut servir de base).
  3. Bonus : projet Vagrant entièrement fonctionnel (vagrant up → tout est prêt) → modèle dans V04 - Vagrant.

Voir aussi