Squid et SquidGuard : Filtrer les accès au net !

By Julien SIMON

Pré requis

Cette article décrit les différentes étapes de configuration pour mettre en place un serveur mandataire (proxy) avec filtrage de contenu. J’ai utilisé la distribution DEBIAN SARGE pour réaliser cette article.

Pour mener à bien l’installation, vérifier que vous êtes bien ROOT pour disposer de tous les accès et autorisations nécessaires.

Vous devez aussi avoir 2 interfaces ethernets configurées :

  • une pour recevoir les demandes du réseau local
  • une autre pour aller sur Internet

Il est aussi possible de n’utiliser qu’une seule interface en utilisant des régles de routages avec iptables.
Il vous faut aussi disposer d’un serveur Apache configuré et fonctionnel pour permettre à squidGuard de signaler les pages non autorisées.

Installation de Squid

Pour installer le serveur proxy squid, on utilise la commande :

apt-get install squid

Voilà l’installation est faite et squid est déjà lancé sur votre système.
Pour vérifier taper :
ps x

Cette commande vous donnera la liste des processus en cours d’execution dont squid qui apparaît comme ceci :

PID TTY STAT TIME COMMAND
989 ? Ss 0:00 /usr/sbin/squid -D -sYC

Configuration Basique de Squid

La configuration de squid est un jeu d’enfant et ne nécessite l’ajout que de 3 lignes !

Ouvrez le fichier de configuration de squid :
pico /etc/squid/squid.conf

Vous pouvez utiliser vi selon vos habitudes.

Maintenant il va falloir trouver les lignes acl (Access Control List) et ajouter les informations pour permettre à squid d’identifier le réseau à gérer. Après la dernière ligne des acl, ajouter :

acl mon_reseau src 192.168.0.0/255.255.255.0

Mon réseau de test à pour adresse 192.168.0.0 et un masque 255.255.255.0 qui correspond à des postes ayant pour adresses IP 192.168.0.1, 192.168.0.2, …

Ensuite il faut autoriser squid à fournir un accès aux ressources Internet. Pour cela, il faut rechercher à la suite des acl, la partie http_access.

Juste avant :
http_access deny all

Ajouter :
http_access allow mon_reseau

On autorise tout ce qui arrive de mon réseau définit plus haut à se connecter à Internet.

Voilà la première étape de configuration est terminée !
Pour tester, entrer dans votre navigateur favoris les paramétres de votre serveur proxy à savoir son adresse ip et son port qui est par défaut 3128.

Configuration Avancée de Squid

Vous souhaitez authentifier les utilisateurs qui accédent à Internet ?

2 méthodes d’authentification existent :

  • par un annuaire LDAP (Niveau Experimenté)
  • par base mysql (Niveau Moyen)
  • par un simple fichier (Niveau Débutant)

L’interêt de mettre en place une authentification est de n’autoriser que certaines personnes à utiliser Internet mais aussi à savoir qui accéde à quoi. Ces informations sont conservées dans les fichiers journaux (.log) suivants :
/var/log/squid/cache.log
/var/log/squid/access.log

ATTENTION : Si vous mettez en place cette solution en entreprise, le personnel doit en être informé car il permet de tracer un utilisateur, savoir ce qu’il a fait, etc. (Plus d’information sur le site de la CNIL)

Ces fichiers peuvent donc faire l’objet d’une déclaration préalable à la CNIL.

Des utilitaires permettent d’analyser ces logs et construisent des statisques d’accès pour voir quels sont les ressources les plus souvent sollicitées, le temps passé sur Internet par utilisateurs, …

Authentification par fichier

Pour mettre en place cette authentification, on va créer un fichier qui va contenir les utilisateurs et leurs mots de passe avec la commande :
touch /etc/squid/users

Pour créer les utilisateurs on utilise la commande :
htpasswd -b /etc/squid/users

Un couple nom d’utilisateur, mot de passe est alors ajouté dans le fichier /etc/squid/users sous cette forme :
julien:r5vy7DrQWreG2

Maintenant il faut que squid charge le modulepermettant d’authentifier les utilisateurs.
Pour cela, on ajoute les lignes suivantes dans le fichier /etc/squid/squid.conf :
auth_param basic children 5
auth_param basic realm Squid proxy-caching web server
auth_param basic program /usr/lib/squid/ncsa_auth /etc/squid/users

  • Squid utilisera 5 instances pour authentifier les utilisateurs (children 5),
  • la boite de dialogue aura pour nom « Squid proxy-caching web server » (realm),
  • le module à utiliser pour authentifier est « /usr/lib/squid/ncsa_auth » suivi par l’emplacement du fichier contenant les utilisateurs « /etc/squid/users » (program)

Maintenant, il faut redémarrer le serveur pour prendre en compte les modifications avec la commande :
/etc/init.d/squid restart

Pour vérifier le bon fonctionnement de squid vous pouvez taper :
ps aux

Cette commande vous affichera tous les processus tournant sur votre machine :

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
proxy 998 0.0 0.3 2164 456 ? Ss 10:34 0:00 (ncsa_auth) /etc/squid/users
proxy 999 0.0 0.3 2164 456 ? Ss 10:34 0:00 (ncsa_auth) /etc/squid/users
proxy 1000 0.0 0.3 2164 456 ? Ss 10:34 0:00 (ncsa_auth) /etc/squid/users
proxy 1001 0.0 0.3 2164 456 ? Ss 10:34 0:00 (ncsa_auth) /etc/squid/users
proxy 1002 0.0 0.3 2164 456 ? Ss 10:34 0:00 (ncsa_auth) /etc/squid/users

On distingue bien les 5 instances lancées par squid pour l’authentification.

Il ne reste plus qu’à tester avec un navigateur internet ayant les paramètres du proxy. Si tout ce passe bien une fenêtre, vous demandant un nom d’utilisateur et un mot de passe devrait apparaître. Une fois logué, vous pouvez surfer tranquilement sur internet.

Authentification par MySQL

TO DO

Authentification par LDAP

TO DO

Configuration de SquidGuard

Voici les paquets à installer pour squidGuard :
apt-get install squidguard db4.2

Lors de l’installation, il est demandé de choisir le type de base de données à utiliser. Choississez DB4.1. ou plus récent puis demandez que les bases soient reconstruites.

Une mise à jour des listes noires est néanmoins fortement recommandée.
Les listes noires françaises sont maintenues par l’université de Toulouse accessible ici :
ftp://ftp.univ-tlse1.fr/pub/reseau/cache/squidguard_contrib/blacklists.tar.gz

Pour mettre à jour vos listes noires à jour, allez dans le repertoire des bases de données :
cd /var/lib/squidguard/db

Puis lancer le téléchargement de l’archive :
wget ftp://ftp.univ-tlse1.fr/pub/reseau/cache/squidguard_contrib/blacklists.tar.gz

Il faut maintenant décompresser l’archive :
tar xzvf blacklists.tar.gz

La décompression va créer un répertoire blacklists contenant toutes les bases par catégories de filtres : jeux, adultes, warez, …
Nous allons pour l’exemple ne filtrer que les sites dédiés aux jeux contenus dans la base gambling.

Pour cela, il faut configurer squidGuard.conf qui se trouve dans :
/etc/squid/squidGuard.conf

Attention à la casse des caractéres, sous linux, elle est très importante !

Premierement, on indique le chemin des bases de données :
dbhome /var/lib/squidguard/db
logdir /var/log/squid

Puis on crée un groupe source, c’est à dire les personnes visées par cette régle :
src lan {
ip 192.168.0.0/24
}

  • « src » indique que l’on définit une source
  • « lan » est le nom de la source sous squidGuard
  • « ip » est affecté par l’adresse du réseau suivi par son masque en CIDR (24 pour un masque 255.255.255.0)

Ensuite on définit la base contenant les URI de jeux :
dest jeux {
urllist gambling/urls
domainlist gambling/domains
}

  • « dest » définit un groupe de destination
  • « jeux » le nom du groupe de destination
  • « urllist » et « domainlist » indique l’emplacement des fichiers contenant les URI dans les bases

Ensuite on crée les ACL pour donner les consignes à appliquer pour le filtrage :
acl {
lan {
pass !jeux
redirect http://127.0.0.1/cgi-bin/squidGuard.cgi?clientaddr=%a+clientname=%n+clientident=%i+srcclass=%s+targetclass=%t+url=%u
}
default {
pass none
redirect http://127.0.0.1/cgi-bin/squidGuard.cgi?clientaddr=%a+clientname=%n+clientident=%i+srcclass=%s+targetclass=%t+url=%u
}
}

  • « acl » définit la liste des consignes
  • pour la source « lan » tout ceux qui ne passe pas jeux (! exprime la négation) donc qui consulte une page interdite sont redirigés vers http://127.0.0.1/cgi-bin/squidGuard.cgi?clientaddr=%a+clientname=%n+clientident=%i+srcclass=%s+targetclass=%t+url=%u

J’ai aussi ajouté une régle default par sécurité.
Par défaut, on bloquera tout utilisateur qui ne correspond à aucune règle pour plus de sécurité.

Assurez vous maintenant que apache est installé et correctement configuré pour pouvoir utiliser le fichier squidGuard.cgi fournit par squidGuard en cas de blocage d’un utilisateur.

Pour installer le cgi taper les commandes suivantes :
zcat /usr/share/doc/squidguard/examples/squidGuard.cgi.gz > /usr/lib/cgi-bin/squidGuard.cgi
chown www-data /usr/lib/cgi-bin/squidGuard.cgi
chmod 700 /usr/lib/cgi-bin/squidGuard.cgi

On déclare squidGuard dans squid pour qu’il puisse l’utiliser. Pour cela, on ajoute dans /etc/squid/squid.conf la ligne suivante :
redirect_program /usr/bin/squidGuard -c /etc/squid/squidGuard.conf

On redémarre le serveur pour prendre en compte les modifications :
/etc/init.d/squid restart

On peut verifier que squid a bien redemarré en tappant :
ps aux

Concernant notre proxy, on trouvera les informations suivantes :
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
proxy 992 0.0 3.6 7344 4696 ? S 10:34 0:01 (squid) -D -sYC
proxy 993 0.0 0.6 2912 872 ? Ss 10:34 0:00 (squidGuard) -c /etc/squid/squidGuard.conf
proxy 994 0.0 0.6 2912 872 ? Ss 10:34 0:00 (squidGuard) -c /etc/squid/squidGuard.conf
proxy 995 0.0 0.6 2912 872 ? Ss 10:34 0:00 (squidGuard) -c /etc/squid/squidGuard.conf
proxy 996 0.0 0.6 2912 872 ? Ss 10:34 0:00 (squidGuard) -c /etc/squid/squidGuard.conf
proxy 997 0.0 0.6 2912 872 ? Ss 10:34 0:00 (squidGuard) -c /etc/squid/squidGuard.conf
proxy 998 0.0 0.3 2164 456 ? Ss 10:34 0:00 (ncsa_auth) /etc/squid/users
proxy 999 0.0 0.3 2164 456 ? Ss 10:34 0:00 (ncsa_auth) /etc/squid/users
proxy 1000 0.0 0.3 2164 456 ? Ss 10:34 0:00 (ncsa_auth) /etc/squid/users
proxy 1001 0.0 0.3 2164 456 ? Ss 10:34 0:00 (ncsa_auth) /etc/squid/users
proxy 1002 0.0 0.3 2164 456 ? Ss 10:34 0:00 (ncsa_auth) /etc/squid/users

Pour tester le proxy avec filtrage, essayez dans un navigateur de taper l’adresse http://www.pogo.com .
Si tout va bien le proxy va afficher une page informant l’utilisateur qu’il n’a pas le droit de visiter cette adresse.

  1. MDVAurelien dit :

    Salut 😉

    Merci pour le tutoriel, très bien rédigé, il va à l’essentiel c’est l’un des plus clair que j’ai vu sur Squid !

    Thks

    ++

  2. Julien SIMON dit :

    Salut,

    Merci 🙂

    Même si ce tutoriel commence à se faire un peu vieux, les concepts n’ont pas évolués avec squid ce qui le rend toujours d’actualité.

  3. red dit :

    Merci pour le tuto, trés interresant .
    Cela dit j’ai remarqué qu’il suffisait de rajouter un « s » a http(s) pour by passer le filtrage de squid et de squidGuard.
    Je m’explique:
    http://www.pogo.com —-> ne passe pas,lefiltre fonctionne
    https://www.pogo.com —-> ca passe, lefiltre ne fonctionne plus !!!!

    Comment y remedier et merci

  4. Julien SIMON dit :

    Bonjour,

    Merci à vous 🙂

    Bloquer du HTTPS est impossible, il faut déchiffrer le paquet qui arrive ce qui n’est pas possible.

    En https le header Host: est passé après l’établissement de la la connexion chiffrée.

    Une idée est de bloquer les adresses IP des sites que vous souhaitez bloquer… sur le port 443.

    Cordialement

  5. Vincent dit :

    Bonjour,

    Il est possible de bloquer les requêtes HTTPS, via une blacklist squid (et non squidguard, qui ne traite que les requêtes HTTP).

    Il suffit de créer une blacklist spécifique (par ex /etc/squid/blacklist.squid, contenant les domaine à bannir, ligne par ligne, en commençant par un . (ex: .facebook.com, .youtube.com, etc…)), de lui attribuer une acl type dstdomain (acl blacklist dstdomain « etc/squid/blacklist.squid ») et d’appliquer la restriction au groupe/ip choisi (http_access deny blacklist GROUPE_IDENTIFIE_DANS_UNE_ACL)

    Ah, chose importante: cela ne fonctionne que si le proxy n’est pas paramétré en mode transparent (donc paramétrage proxy du navigateur obligatoire), ce qui peut être difficile dans le cadre d’un réseau d’entreprise ne disposant pas de moyens pour déployer ces fonctionnalités à distance (passer sur 300 postes un par un pour les paramétrer peut vite tourner à l’agacement).

    Cdlt,
    Vincent