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

closeCet article a été publié il y a 12 ans 1 mois 5 jours, il est donc possible qu’il ne soit plus à jour. Les informations proposées sont donc peut-être expirées.

Edit 02/02/2011 : l’auteur de Squidguard précise :

    Bonjour à tous,

    Suite à une demande récurrente, et visiblement partagée par un certain nombre d'organisme, nous créons une nouvelle catégorie : "social_networks".

    Elle permettra de filtrer plus spécifiquement les sites de réseaux sociaux, en ne les incluant pas dans des catégories finalement inadaptées.

    Nous essayerons, tant que faire ce peut, de sortir les sites complets des autres catégories (par exemple facebook de la catégorie blog).

    Cordialement 

FIN


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

15 comments

  1. Ping : Lectures Libres pour le week-end #17 | Philippe.Scoffoni.Net
  2. La mise en place d’un proxy en entreprise fait partie des taches d’un admin. Ce n’est pas toujours facile car cette tache peut etre facilement perçue comme négative de la part des utilisateurs et on est toujours sur la ligne jaune du « trop de surveillance » et « pas assez de surveillance ». Bref si tu veux continuer ta suite d’articles sur le sujet, je peux te suggérer:
    – La configuration de rotation de logs et leur conservation (sachant que selon la loi, une entreprise doit conserver 1 an de log)
    – La mise en place d’un analyseur de log et génération d’une page web à partir de cette analyse

  3. – pour les logs, point besoin d’un article si ? ça se résumerait à dire de changer un nombre dans /etc/logrotate.d/squid
    Voilà, c’est fait 🙂
    Passez « rotate 2 » à « rotate 30 », ou 180, ou 360 si la législation le dit
    C’est à recommander en effet car de base, sous Debian, c’est 2 jours et c’est très con.
    A faire pour Apache, SSH etc
    Bref, à faire pour tous les services importants pour lesquels on pourrait être amené à devoir produire des logs – c’est arrivé à un pote dont une machine s’est fait piratée et a mené une attaque réussie blabla, je vous passe les détails.

    – pour les stats, j’ai déjà pondu un article sur calamaris, http://michauko.org/blog/2009/04/21/calamaris-en-debian-stable-ca-bug/
    Si on parle des stats web, j’ai un brouillon pour webalizer, faudrait que je finisse. Il s’agit de configurer webalizer sur une machine hébergeant plusieurs sites web. C’est pas grand chose, mais comme il faut trifouiller, un article là-dessus pourrait aider

  4. En fait je pensais à un tuto réellement utile pour l’entreprise… c’est à dire effectivement une rétention des logs sur 1 an mais sur une espace exterieur au proxy. Exemple: le proxy produit les logs qui sont analysés par un logiciel (calamaris, webalizer ou autre) puis ensuite sauvegardés sur un NAS.
    J’ai effectivement lu l’article sur Calamaris mais sans vouloir t’offenser, tu ne parles que de la résolution du bug et non de l’installation et configuration de celui-ci.
    En tout cas, bonne continuation… je lirais avec plaisir les prochains tutos

  5. Moui, mais pour calamaris, y’a rien à faire du moment qu’on n’a pas touché les noms des fichiers standard. Ca marche tout seul, il n’y a qu’à attendre le lendemain pour avoir un premier rapport. Donc, aptitude install calamaris

    Pour une solution externalisation etc, le problème est que je décrirais une solution spécifique qui servira à 2/3 personnes maxi, et encore. Autant laisser les gens trouver eux-mêmes rsync, par exemple.
    Si je prends mon cas – et toutes mes boites précédentes – il ya une solution de sauvegarde robuste, sur bande, avec sortie de bandes etc… rien à péter de transférer des logs via n’importe quel protocole 🙂 Sinon je fais un article sur rsync ou n’importe quel outil dans ce genre, mais je n’ai pas eu l’occasion 🙂

    Bon, là je vais me faire un article sur un bug MS+ODBCOracle+64bits, il ne sera pas sur planet-libre 🙂 Un truc assez hallucinogène.

  6. Ping : Lectures Libres pour le week-end #17 | Test
    1. Oui, mais je n’ai plus la syntaxe en tête. Dans l’exemple de /etc/squid/squidGuard.conf les commentaires montrent un peu le principe. C’est un peu la même chose que restreindre les accès par tranche horaire, tout ça.

      Je pourrai pas creuser aujourd’hui, à voir ces prochains jours si besoin
      désolé

  7. Bonjour, merci pour le tuto, mais j’ai une question :

    Quand vous ajoutez les lignes suivantes : (voir ci aprés) est ce que cela concerne que les listes « hacking » ou bien « all » dans « pass !hacking all » sous-entend toutes les listes de la black liste complète?

    Merci encore

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

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

    1. Euuuh,
      ça veut dire :
      Je « pass » si je ne suis pas « ! » dans hacking, quel que soit les « all » autres cas. C’est simplement une exclusion. Si l’adresse http://www.toto.com ne figure dans aucune liste, alors je passe. Heureusement, sinon on irait pas loin…
      Sinon (si je suis dans hacking et d’autres si j’ai mis d’autres !truc), je redirige vers le script cgi qui me signifie l’interdiction
      C’est clair ?

  8. Donc si j’ai bien compris, je dois ajouter toutes les catégories pour les sites que je souhaite bloquer, c’est à dire une pour « adulte », une pour « agressive », une pour « audio-video » etc…
    c’est bien ça?

    Sinon, j’avais redémaré squid, mais en redémarrant mon ordi, je me suis effectivement rendu compte que google et même yahoo étaient bloqués, au premier démarrage du navigateur. Ce qui est currieux, est que j’ai pu accèder à mon site sans problème et qu’après ni google ni yahoo n’étaient plus bloqués!?

    Existe-il un bug au premier démarrage du navigateur?

    Merci

  9. Pour ton bug, aucune idée là… sauf que certains navigateurs ont du mal à voir qu’un fichier PAC est mis à jour ; si c’est un fichier PAC. Si c’est directement un nom de proxy, je ne vois pas

    Pour, le reste : oui, il faut décrire chaque catégorie qu’on veut utiliser. Ca donne par exemple ça :
    Ici, je laisse passer une liste « mes_exceptions_OK », j’en bloque plusieurs autres (adult, redirector, warez etc) et une « mes_exceptions_KO »
    Attention, chaque catégorie n’a pas forcément une liste de domaines + d’url + d’expressions

  10. Bug du navigateur Résolu :

    En fait, il fallait attendre quelques minutes avant de lancer le navigateur pour qu’il fonctionne correctement.
    Et j’ai bien compris pour les catégories qu’il faut ajouter à chaque fois.

    Tout fonctionne parfaitement, merci beaucoup pour le tuto et les réponses!

    à bientôt

  11. Hello, I was just reading this, and thought I would take the time to write a short note to inform you all that we offer blacklists tailored specifically for Squid proxy native acl, as well as alternative formats for the most widely used third party plugins. So we invite you all to check us out. We take a great deal of pride in the fact that our works offer a higher degree of quality than the freely available options. Our lists are also compatible with UrlFilterdb.

    Quality Blacklists Tailored For Squid Proxy – http://www.squidblacklist.org

  12. There is room for better blacklists, we intend to fill that gap.

    We are the worlds leading publisher of Squid ‘Native ACL’ formatted blacklists, that allow for web filtering directly with Squid proxy. Of course we also offer alternative formats for the most widely used third party plugins, such as DansGuardian and Squidguard. And while our blacklists are subscription based, they are as a result of our efforts, of a much higher degree of quality than the free alternatives.

    We hope to serve you,


    Signed,

    Benjamin E. Nichols
    http://www.squidblacklist.org

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.