SquidGuard : filtre d’URL et listes à jour (le plus dur)

Pour faire suite à l’article sur la mise en place de Privoxy pour faire sauter les pubs dans toute votre société (ou chez vous sur votre petit réseau local), voici un complément : le filtre d’URL par catégorie.

J’ai eu l’occasion de jouer avec SquidGuard à travers un serveur IPCOP mis en place par mes soins dans l’école primaire de mon village, avec la bénédiction du Ministère de l’Education. Ca marche pas mal, il faut avouer. N’ayant pas de moyen, une école optera certainement pour des listes de filtrages gratuites. Si une seule était à retenir, ce serait celle de l’Université de Toulouse.

Deux objectifs possibles :

Mise en place sur Debian

Installation et docs de base

Contrairement à pas mal d’outils sous Debian, l’installation ne fait rien en soit, elle amène simplement de l’outillage et la plus grosse part est après.
Commencez par installer le logiciel, via un classique aptitude install squidguard.
Evidemment, votre squid est déjà en place et fonctionnel.

Pensez à lire le fichier /usr/share/doc/squidguard/README.Debian ; c’est d’ailleurs une règle générale après une installation de paquet Debian, mais surtout pour SquidGuard qui, après l’installation, ne fait rien tout seul.

Principes de fonctionnement

Je décris le principe avant de foncer la tête dans le guidon.

SquidGuard est simplement une sorte d’extension à base de scripts et d’ACL Squid pour filtrer des URL en se basant sur des domaines et des expressions régulières d’URL
Lui même n’apporte aucun niveau de filtrage et il faudra aller chercher une liste à jour de sites. C’est là toute la difficulté.
J’arrête tout de suite ceux qui pensent bloquer facebook.com en écrivant une ACL bidon genre deny blabla facebook.com dans Squid. Entre les sites genre how-to-un-unblock-facebook.com et les “redirectors” genre proxies anonymes, ce sera impossible. D’où l’aide de listes, payantes ou non, robotisées ou non, mises à jour régulièrement ou non.
Soit vous payez une liste type urlblacklist.com, soit vous optez pour une gratuite, mais néanmoins efficace, comme celle de l’Université de Toulouse, cf. plus haut. Sinon, allez voir là – je n’ai pas testé les 2 premiers liens.

La README évoqué ci-dessus parle d’un paquet “chastity-list”, apt-cache search chastity n’ayant rien donné, je n’ai pas cherché plus loin.

Une fois la liste choisie, vous obtiendrez généralement des fichiers textes, classés par catégories. Il faut les transformer en base de données type Berkeley-machin (fichiers .db) pour qu’ils soient efficaces en mémoire.
Ce sera évidemment à scripter automatiquement toutes les nuits (nouvelles listes => nouveaux .db => rechargement de Squid).
A noter que les fichiers .db seront générés par SquidGuard uniquement lorsqu’il verra que vous utilisez telle ou telle catégorie dans /etc/squid/squidGuard.conf. SquidGuard n’ira pas compiler les bases inutilisées (ce qui prend du temps sur des grosses listes, genre “adult” (=porno))

Enfin, vous ajouterez les catégories qui vous intéressent en ayant pris soin de créer une belle page qui indique à l’utilisateur pourquoi tel site est bloqué (je suis sympa, je vous fournis un tel script minimaliste ; en gros une correction de celui fourni dans le package SquidGuard qui est passablement foireux)

Je ne parle pas des aspects communication en entreprise : filtrer les sites aura sûrement un impact important sur le moral des troupes, fonction du gain de bande passante, fonction de la productivité :)

Mise en place pratique

J’illustre la suite par le blocage de la catégorie “hacking”, où l’on pourra tester par exemple www.warez.com, à partir des listes de l’Université de Toulouse

Récupération de la liste de l’Université de Toulouse

La base : récupérez soit une catégorie, soit la totalité (je pars sur cette option). Voyez l’explication de chaque catégorie ici.

mkdir /root/squidguard
cd /root/squidguard
wget ftp://ftp.univ-tlse1.fr/blacklist/blacklists.tar.gz
tar xzvf blacklists.tar.gz
mv blacklists/* /var/lib/squidguard/db/
chown -R  proxy:proxy /var/lib/squidguard/db/

Choix d’une catégorie

Dans /etc/squid/squidGuard.conf, on va toucher le minimum. Ajoutez n’importe où :

dest hacking {
   domainlist hacking/domains
   urllist hacking/
   log guard_hacking.log
}

Pour savoir si une catégorie contient des “domaines”, des “URL” ou des “expressions”, allez voir dans /var/lib/squidguard/db/la_categorie/. En effet, seules quelques catégories ont des “expressions”, il s’agit avant tout des catégories de pubs. Je considère que privoxy est là pour ça. Donc je n’ajoute pas expression hacking/expressions (même pas sûr de la syntaxe). Pour m’assurer que les “expressions” sont utilisées uniquement pour la pub, j’ai fait ça et vu des fichiers de taille 0 ou non-existant pour la plupart des catégories :

srv:/var/lib/squidguard/db# ls -l */expres*
-rwxr-xr-x 1 proxy proxy  57 2006-05-10 07:47 ads/expressions
-rw-r--r-- 1 proxy proxy   0 2005-10-18 16:51 adult/expressions
-rw-r----- 1 proxy proxy   0 2002-11-06 14:08 aggressive/expressions
-rw-r----- 1 proxy proxy   0 2002-11-06 14:08 agressif/expressions
-rw-r--r-- 1 proxy proxy   0 1999-03-04 08:07 forums/expressions
-rw-r--r-- 1 proxy proxy   0 1999-03-04 08:07 mail/expressions
-rw-r--r-- 1 proxy proxy  42 2009-03-19 10:42 malware/expression
-rw-r--r-- 1 proxy proxy  47 2009-03-20 13:30 malware/expressions
-rw-r--r-- 1 proxy proxy   0 2005-10-18 16:51 porn/expressions
-rw-r--r-- 1 proxy proxy   0 1999-10-06 17:37 proxy/expressions
-rwxr-xr-x 1 proxy proxy  57 2006-05-10 07:47 publicite/expressions
-rw-r--r-- 1 proxy proxy   0 1999-10-06 17:37 redirector/expressions
-rw-r--r-- 1 proxy proxy 123 2005-06-14 21:33 strict_redirector/expressions
-rw-r--r-- 1 proxy proxy 505 2006-05-23 22:05 strong_redirector/expressions
-rw-r----- 1 proxy proxy   0 2002-11-06 14:08 violence/expressions
-rw-r--r-- 1 proxy proxy   0 1999-04-19 14:04 warez/expressions

Ensuite, on indique à SquidGuard (donc à Squid) comment réagir pour cette catégorie. Modifier la section acl {} du fichier /etc/squid/squidGuard.conf pour qu’il y ait ça (gardez ou non la palanquée de lignes de commentaires) :

acl {
   default {
      pass !hacking all
      redirect http://srv/cgi-bin/squidGuard-simple.cgi?clientaddr=%a&srcclass=%s&targetclass=%t&url=%u
   }
}

Si vous voulez bloquer plusieurs catégories, ce sera à base de pass !hacking !adult !blabla all.
Notez dans la section acl {} l’adresse de redirection utilisée : une page spéciale hébergée sur le serveur, nommée squidGuard-simple.cgi. Il faut maintenant la mettre en place.
A noter aussi, il me semble que de base, la ligne “redirect” contient des “+” à la place des “&” pour passer les arguments. J’ai pas bien pigé, j’ai toujours vu des “&” et avec les “+”, ça ne marchait pas.

Redirection vers une page spéciale

  • Attention, j’ai ouï dire que si le script n’était pas là, ça passait silencieusement et la requête aboutissait malgré la demande de blocage. Je n’ai pas testé, j’ai surtout testé une URL de chaque catégorie que je suis censé bloqué.
  • Je considère que votre site web est configuré pour que /cgi-bin/ soit en un “Alias” de “/usr/lib/cgi-bin/”, c’est en général défini dans la configuration par défaut d’Apache2 et vous pouvez vous en assurer rapidement avec cette commande grep cgi-bin /etc/apache2/sites-enabled/* pour voir si ça répond – en gros.
  • La liste des variables que l’on peut passer au script de redirection est donnée dans la doc HTML, /usr/share/doc/squidguard/CONFIGURATION.html

Deux scripts sont fournis par le mainteneur du paquet Debian pour nous donner une trame pour l’écriture du script de redirection – le script qui dira “accès bloqué blabla, si vous pensez que c’est une erreur, contactez l’administrateur blabla”. Ils sont là :

srv:/var/lib/squidguard/db# dpkg -S squidGuard*.cgi
squidguard: /usr/share/doc/squidguard/examples/squidGuard.cgi.gz
squidguard: /usr/share/doc/squidguard/examples/squidGuard-simple.cgi.gz

Le premier est apparement plus complet, prévu pour du multi-langues etc, mais récupère comme un pied les variables qu’on lui passe. J’ai opté pour l’autre car rapidement, j’ai pu mettre en place une page qui indiquait clairement et simplement le site bloqué, la catégorie, l’IP du demandeur et donnait le mail de contact de l’administrateur.
Donc soit vous optez pour ces scripts, soit pour le mien fourni ici, basé sur le 2è script, traduit en français et épuré de certains trucs inutiles. Voyez :

squidguard

On est fin prêt pour un test grandeur nature.

Relance de Squid via la compilation des listes de blocage

Lancez la commande /usr/sbin/update-squidguard pour contrôler les droits sur les fichiers de /var/lib/squidguard/db/ et générer les .db.
Attention, sur la liste “adult” (environ 1 million de domaines), ça peut prendre quelques minutes.
Ce script recharge Squid.
Testez un site de la catégorie “hacking”, exemple www.warez.com

Script de mise à jour automatiques des listes

Voici un script que j’ai mis en crontab pour automatiser la récupération de la liste de l’Université de Toulouse (si mise à jour), la mise à jour qui va bien, création de .db et relance de Squid.

srv:~# cat /root/squidguard/update_toulouse.sh
#!/bin/sh
cd /root/squidguard
wget -N ftp://ftp.univ-tlse1.fr/blacklist/blacklists.tar.gz
rm -rf blacklists
rm -rf /var/lib/squidguard/db/*
tar -xzvf blacklists.tar.gz
# proprio et perm fixées de toute manière par update-squidguard
chown -R proxy:proxy blacklists
mv blacklists/* /var/lib/squidguard/db/
/usr/sbin/update-squidguard
# A priori, si le site est down ou connx internet HS, on reutilisera le .tar.gz actuel
# donc pas de risque de se retrouver avec une base vide

Mettez les droits d’exécution via chmod u+x /root/squidguard/update_toulouse.sh et collez ça dans la crontab :

0 3 * * 1-5     root    /root/squidguard/update_toulouse.sh

Ca devrait rouler !

Divers

Log des accès interdits

J’ai passé sous silence la ligne “log guard_hacking.log”. Elle est optionnelle et permet de garder ou non une trace des accès interdit, par catégorie. A voir, vie privée des gens, tout ça. J’ai choisi de la nommer quelque_chose.log car ce fichier ira directement dans /var/log/squid/ et sera donc “logrotaté” naturellement comme tous les logs Squid, via ce qu’on trouve en standard dans le logrotate de Squid, /etc/logrotate.d/squid, à savoir : /var/log/squid/*.log
Vu ?

Plages horaires

Vous noterez que la conf simpliste ici peut être étoffée, dans le fichier /etc/squid
/squidGuard.conf
, vous avez tous les commentaires nécessaires, notamment pour faire du [dé]blocage par plages horaires.

D’autres compléments pour Squid ?

Après Privoxy, il faudrait un 3è article maintenant sur HAVP. Je vais y penser éventuellement.

Générer la conf pour toutes les catégories

Ne réutilisez pas le résultat brutalement, vous bloqueriez même Google, car il est listé dans ce qui ressemble plus à une whiteliste propre à l’Université de Toulouse, la catégorie “liste_bu”.
Afin d’obtenir la liste complète des déclarations de catégories pour squidGuard.conf, vous pouvez utiliser celà :

srv:/var/lib/squidguard/db# for i in `find . -maxdepth 1 -type d|awk -F'/' '{print $2}' | sort`
do
	echo -e dest $i {
	echo -e \t"domainlist $i/domains"
	echo -e \t"urllist $i/urls"
	echo -e \t"log guard_$i.log"
	echo }
done
Vus : 1009
Publié par Michauko : 64