31

Installer un proxy Squid et un filtrage avec SquidGuard sous Debian

Cet article est avant tout un mémo pour mes besoins sur comment installer et mettre en place un proxy Squid et un contrôl parental avec SquidGuard sur un serveur dédié distant sous Debian.

Le fait de mettre en place un proxy sur un serveur dédié distant a pour bénéfice de outrepasser les bridages/censures, que peut mettre en place un FAI (exemple youtube et free). De plus, ici l’idée est d’essayer d’éviter au mieux, que des enfants surfant sur la toile tombent sur du contenu non recommandé. Evidemment, aucune protection ne peut égaler l’accompagnement d’un parent sur les risques, qu’on peut rencontrer en naviguant sur le web.

Pour ajouter une couche de filtrage, j’ai mon propre serveur DNS local configuré sur les serveurs DNS d’OpenDNS.

Pour le filtrage, j’aurais pu choisir DansGuardian car il est beaucoup plus performant lors de l’analyse des requettes mais il prend beacoup de ressources matériels.

Un petit comparatif entre SquidGuard et DansGuardian:

  • + DansGuardian : vrai filtrage de contenu sur toute la page et sur l’URL.
  • + SquidGuard : facile à mettre en place et plûtot léger en utilisation cpu/RAM.
  • – DansGuardian : demande énormément de ressource cpu/RAM.
  • – SquidGuard : filtrage par domaines.

nb : Toutes les commandes dans le tuto sont éxécutées en tant que root.

Proxy Squid3

Installer Squid3

  • Mettre à jour la distribution Debian :
  • apt-get update && apt-get upgrade
    
  • Installation du proxy Squid3 :
  • apt-get install squid3
    

Configuration de squid3 :

  • Sauvegarde du fichier de configuration par défaut :
  • cp /etc/squid3/squid.conf /etc/squid3/squid.back
    
  • Edition du fichier de configuration pour ajouter les modifications :
  • nano /etc/squid3/squid.conf
    
  • Autorisation des/ou du réseau à se connecter au serveur proxy :
  • acl memolinux src A.B.C.D/32 W.X.Y.Z
    http_access allow memolinux
    
  • Masquer notre adresse IP dans le header HTTP (X-Forwarded-For: unknown)
  • forwarded_for off
    
  • Log d’erreur en français :
  • error_directory /usr/share/squid3/errors/French
    
  • Rejet de tous les ports différents de ceux déclarés dans les acls
  • http_access deny !Safe_ports
    
  • Empêcher les personnes extérieures au réseau de passer par le proxy :
  • http_access deny all
    
  • Emplacement des fichiers de logs
  • cache_access_log /var/log/squid/access.log
    cache_log /var/log/squid/cache.log
    cache_store_log /var/log/squid/store.log
    
  • Intégration du module de SquidGuard
  • url_rewrite_program /usr/bin/squidGuard -c /etc/squid3/squidGuard.conf
    
  • Modification du port d’écoute et ajout du mode proxy « transparent » :
  • http_port 3128
    

SquidGuard

Installer SquidGuard

apt-get install squidguard

Configurer SquidGuard

  • Téléchargement de la blacklist :
  • wget http://dsi.ut-capitole.fr/blacklists/download/blacklists.tar.gz
    
  • Extraction du fichier :
  • tar -xzf blacklists.tar.gz
    
  • Copie du dossier Blacklist dans le répertoire de squidguard :
  • cp -R blacklists/* /var/lib/squidguard/db/
    
  • Faire une copie du fichier de configuration de SquidGuard :
  • cp /etc/squidguard/squidGuard.conf /etc/squidguard/squidGuard.back
    
  • Modification de SquidGuard :
  • nano etc/squidguard/squidGuard.conf
    
    #
    # CONFIG FILE FOR SQUIDGUARD
    #
    
    dbhome /var/lib/squidguard/db
    logdir /var/log/squid3
    
    # les règles de filtrage
    dest adult {
            domainlist adult/domains
            urllist adult/urls
            expressionlist adult/very_restrictive_expression
    }
    dest publicite {
            domainlist publicite/domains
            urllist publicite/urls
    }
    dest aggressive {
            domainlist aggressive/domains
            urllist aggressive/urls
    }
    
    ###Forcer la réécriture de https vers http pour les moteurs de recherche et pouvoir analyser les mots
    rew safesearch {
     s@(google..*/search?.*q=.*)@ &safe=active@i
      s@(google..*/images.*q=.*)@ &safe=active@i
     s@(google..*/groups.*q=.*)@ &safe=active@i
      s@(google..*/news.*q=.*)@ &safe=active@i
     s@(yandex..*/yandsearch?.*text=.*)@ &fyandex=1@i
      s@(search.yahoo..*/search.*p=.*)@ &vm=r&v=1@i
     s@(search.live..*/.*q=.*)@ &adlt=strict@i
      s@(search.msn..*/.*q=.*)@ &adlt=strict@i
     s@(.bing..*/.*q=.*)@ &adlt=strict@i
      log block.log
     }
    #La règle avec les interdictions: !porn !adult !publicite !violence !agressif !aggressive
    acl {
      default {
            pass !adult !publicite  !agressif  all
            redirect  http://google.fr ##tout ce qui est inderdit est rediriger vers google
      }
    }
    
  • Création d’un lien symbolique du fichier de configuration squidGuard.conf dans /etc/squid3/ :
  • ln -s /etc/squidguard/squidGuard.conf /etc/squid3/
    

Configuration générale

  • Application des droits :
  • chown -R proxy:proxy  /var/log/squid3 /var/lib/squidguard
    
  • Génération de la base de données :
  • squidGuard -C all
    
  • Vérification de la configuration de Squid3 :
  • squid3 -z
    
  • Lancer Squid3 :
  • service squid3 start
    
  • Vérifier que tout est ok :
  • /var/log/squid3/squidGuard.log
    
  • Ajout de mot interdit :
  • nano /var/lib/squidguard/db/adult/very_restrictive_expression
    

    Et ajouter des mots entre pipes « | »

  • Regénérer la base après modifications :
  • squidGuard -C all
    
  • Et pour finir, paramétrer le navigateur internet pour utiliser le proxy Squid :
  • prxysquid3

Mettre en place une tache planifiée pour la mise à jour de la blacklist

  • Créer un script :
  • nano updateblacklist
    
    #!/bin/bash
    cd /tmp
    wget http://dsi.ut-capitole.fr/blacklists/download/blacklists.tar.gz
    tar -xzf blacklists.tar.gz
    cp -rf blacklists/* /var/lib/squidguard/db/
    rm -Rf blacklists*
    squidGuard -C all
    service squid3 restart
    
  • Rendre le script éxécutable :
  • chmod +x updateblacklist
    
  • Ajouter le script dans cron.weekly :
  • mv updateblacklist /etc/cron.weekly/
    

Conclusion

Avec un peu d’effort pour la mise en place, on peut être débarrassé de certains contenus sur la toile MAIS ce n’est pas 100% fiable. Je pense, qu’il faut tout de même expliquer aux enfants, qu’ils peuvent tomber sur du « mauvais » contenu et dans ce cas prévenir un adulte ou tout simplement fermer la page en question.

Partager l'article :





fred

"Dire que l'on s'en fiche du droit à la vie privée sous prétexte qu'on a rien à cacher, c'est comme déclarer que l'on se fiche du droit à la liberté d'expression sous prétexte qu'on a rien à dire." Edward Snowden

31 commentaires

  1. Salut,

    Quelques petites corrections :
    – outre passer –> outrepasser
    – du contenus non recommandés –> du contenu non recommandé
    – navigant –> naviguant
    – j’aurais pû –> j’aurai pu
    – conparatif –> comparatif
    – facile a mettre en place et plutot leger –> facile à mettre en place et plutôt léger
    – mv /etc/squidguard/squidGuard.conf /etc/squidguard/squidGuard.back –> cp /etc/squidguard/squidGuard.conf /etc/squidguard/squidGuard.back (copie)
    – Modificationde –> Modification de
    – Configuration général –> Configuration générale
    – mv updateblacklist /etc/cron.weekly –> mv updateblacklist /etc/cron.weekly/
    – mauvais contenus –> mauvais contenu

    C’est rare de voir ça chown -R proxy:proxy /usr/lib/squid3 /usr/sbin/squid3 tu es sûr de toi ?

    Tcho !

  2. Salut Cascador !
    ouai je me suis enflamé sur les droits… juste /var/log/squid3 et /var/lib/squidguard suffisent pour le bon fonctionnement.

    ET merci pour les corrections :-D

  3. Merci pour le tuto, très détaillé et mis en oeuvre aujourd’hui même !
    Tu ne précises pas quelle version de debian tu as utilisée (je suppose wheezy ?)

    J’ai relevé quelques différences (ou coquilles ?) par rapport à une install avec un debian jessie:

    redirect_program /usr/bin/squidGuard -c /etc/squid3/squidGuard.conf
    semble utile uniquement pour squid2, d’après le README.Debian de squidguard
    et je n’a
    Pour squid3, il semble simplement utile de faire :
    url_rewrite_program /usr/bin/squidGuard -c /etc/squidguard/squidGuard.conf

  4. oups, validé trop vite, je continue :
    je n’ai rien trouvé de relatif à
    redirect_children 10
    dans squid3

    de même le mode transparent a l’air d’être géré de manière différente dans squid3 on dirait (ou dans jessie ?)

    Merci encore pour le tuto très précis qui m’a donné envie de rentrer dans le sujet.
    Je creuserai les possibilités de timing de squidguard (horaires et IP spéciales, on peut faire des trucs très fins avec ces options).
    Merci pour le script de mise à jour des règles de l’académie de Toulouse. Je connaissais leur existence en ayant installé une distrib Eole pour l’école des enfants, mais je n’étais pas rentré dans ce niveau de détail. Bonne fin de week-end !

  5. Bonjour,
    j’ai un doute sur -> Rejet de tous les ports différents de ceux déclarés dans les acls : « http_access allow !Safe_ports » ce n’est pas « http_access deny !Safe_ports » ?
    @+ Jérôme

  6. @Daniel : merci pour toutes tes remarques :-)
    Concernant ma vertsion de Debian c’est bien la Wheezy (je préfère les versions stable pour les serveurs).
    Après re-vérification et tests, effectivement seule « url_rewrite_program /usr/bin/squidGuard -c /etc/squidguard/squidGuard.conf » suffit pour l’Intégration du module de SquidGuard. Normalement « 

  7. redirect_children
  8.  » permet de définir le nombre de processus enfants générés pour répondre aux requêtes transmises par le démon squid, mais il n’est pas pas présent dans le fichier de conf par défaut… que faire ? j’ai testé sans et avec et pas de diférence, sachant que dans mon cas c’est un proxy perso et aux max j’orais 3 machines connectées en simultanées, je préfère laisser cette options.
    Pour le mode transparent, j’ai fais un test sans le préciser dans le fichier de conf et celà fonctionne (je passe par mon proxy à cet instant), donc oui il n’est pas nécessaire de le préciser…

    @Jerome : oups, après vérif de mon fichier de conf oui c’est bien : « http_access deny !Safe_ports »

  9. Bonjour,
    Très bon tutos, merci, mais j’ai un petit soucis.
    Déjà mes versions de logiciels :
    squid3 3.1.20, squidguard 1.5-1 sur wheezy 7.7
    Je filtre bien les sites, mais la réécriture https vers http ne fonctionne pas, serait-il possible que le dernière version de squidguard ne le gère pas ?
    Et encore merci

  10. Bonjour Mortimer,
    les versions sur mon serveur :
    Debian :
    [code lang= »shell »]
    lsb_release -a
    No LSB modules are available.
    Distributor ID: Debian
    Description: Debian GNU/Linux 7.7 (wheezy)
    Release: 7.7
    Codename: wheezy
    [/code]
    SquidGuard :
    [code lang= »shell »]
    apt-cache show squidguard
    Package: squidguard
    Version: 1.5-1
    [/code]
    Squid3 :
    [code lang= »shell »]
    apt-cache show squid3
    Package: squid3
    Version: 3.1.20-2.2+deb7u2
    [/code]

    Pour la réécriture https vers http j’ai pas mal galéré pour trouver la bonne syntaxe …

  11. Bonjour,

    Bien pour l’article, par contre il y a moyen d’optimiser votre conf squidguard:
    En effet, vous déclarez deux fois la même base « adult »: « porn » est un alias de la base « adult » pour les anglophones, et trois fois la même base « agressif »; dont, vous l’aurez deviné, « aggressive » et « violence » sont également des alias pour nos amis anglophones (les mises à jour des listes de Toulouse sont tellement régulières qu’elles servent à l’international depuis quelques années déjà).

    Dans votre conf, vous pouvez supprimer et ne garder que cela:
    dest adult {
    domainlist adult/domains
    urllist adult/urls
    expressionlist adult/very_restrictive_expression
    }
    dest publicite {
    domainlist publicite/domains
    urllist publicite/urls
    }
    dest agressif {
    domainlist agressif/domains
    urllist agressif/urls
    }
    acl {
    default {
    pass !adult !publicite !agressif all
    redirect http://google.fr
    }
    }

    Notez que ce n’est pas bien grave, cela fonctionne quand même. Mais vous verrez que le temps de compilation des bases (qui est assez important) s’en trouvera largement amélioré ! Là vous doublez + triplez inutilement ce temps… et lorsque que vous montez un proxy sur une toute petite machine (raspberry pi par exemple, comme c’est mon cas), c’est fort appréciable de gagner quelques minutes (la base « adult », à elle seule, met 10min à compiler sur ce type de nano-serveur ;-).

    Cdlt,
    Vincent

  12. Bonjour et merci pour le tuto.

    Tout fonctionne à merveille, excepté la commande ;
    squidGuard -C all
    Le terminal reste bloqué sur cette commande et rien à ce sujet dans le log.
    J’ai laissé tourné 1 heure environ…..

  13. Bonjour Rémi,
    Dans un premier terminal, passez la commande suivante:
    (sudo) squidGuard -d -b -P -C all

    Dans un second terminal (ouvert en parrallèle), passez la commande suivante pour voir le fichier log en temps réel:
    (sudo) tail -f /var/log/squidguard/squidGuard.log

    Je mets ‘sudo’ entre parenthèse, c’est si nécessaire. Si vous avez les droits root, pas besoin.
    Au moment où ça bloque, dans le log, vous devriez voir un message du type suivant:
    2015-02-xx 16:29:46 [1670] INFO: loading dbfile /var/lib/squidguard/db/NOM_DE_LA_BASE_OU_LA_COMPILATION_S’EST_ARRETEE
    2015-02-x 16:29:46 [1670] FATAL: syntax error in configfile /etc/squidguard/squidGuard.conf line NUMERO_DE_LIGNE_OU_SE_SITUE_L’ERREUR_DANS_squidGuard.conf qui a eu pour conséquence de bloquer la compilation.

    Cordialement,
    Vincent

  14. Bonjour,

    Merci pour ta réponse rapide.
    En fait j’ai executé la commande :
    squidGuard -c /etc/squidguard/squidGuard.conf -C all
    car par défaut le fichier conf se trouvait dans /etc/squidGuard. Je n’ai pas voulu le déplacer.
    J’ai fait une install de Debian sans interface graphique j’ai donc été voir le log après avoir laissé tourné un peu la commande.
    Et en effet j’ai vu ce qui bloquait : j’avais déclaré dans mon fichier conf:
    dest porno { urllist porn/nurls ………..
    entre autre et ce fichier nurls n’existe pas.
    En supprimant cette ligne les bases ont bien été construites.
    Par contre ce fichier nurls, est-il important ? Je suis plutot novice et j’avais vu cette ligne dans des tutos.
    Dernière question, y-a-t-il un moyen de vérifier le fonctionnement de ces bases, sachant que tout semble ok dans les logs maintenant.
    Merci beaucoup.

  15. Bonjour Rémi,

    Il y a en fait 2 listes par catégorie: une liste « domains » (de loin la plus importante), qui bloque le domaine entier (par exemple, « hebergeur.fr », aucune page du domaine « herbergeur.fr », quel qu’elle soit, ne sera accessible) et une liste « urls », qui ne bloque que des adresses spécifiques (par exemple « www.hebergeur.fr/site_porno ». ça ne bloque que cette adresse, mais pas le nom de domaine « hebergeur.fr » en entier, tu peux donc aller sur d’autres pages de ce domaine).

    Concernant le problème que tu as rencontré, c’est très simple, la liste « nurls » n’existe pas. Il y a une erreur de syntaxe, le « n » est en trop. Tu devrais re-essayer avec ceci uniquement: urllist porn/urls
    Pour le vérifier, c’est facile:
    ls /var/lib/squidGuard/db/porno
    il devrait te lister à minima ces deux fichiers:
    – domains
    – urls

    A noter, comme je l’ai indiqué dans un message précédent ci-dessus, que « porno » est un alias de « adult », attention donc à ne pas mettre les deux dans le fichier de conf, cela reviendrait à compiler deux fois la même liste (qui est, de très loin, la plus grosse et donc la plus longue à compiler).

    Concernant ta dernière question, il n’y a pas à proprement parlé de moyen de vérifier le fonctionnement des bases. Les bases (=listes compilées) sont simplement des fichiers de données au format Berkeley. C’est comme si tu demandais de vérifier le bon fonctionnement d’un fichier texte :-) Un fichier ne fonctionne pas en soit. C’est le moteur de la base de données qui se sert du fichier en allant chercher les infos dedans, mais le fichier en lui-même… ne ‘fonctionne’ pas

    A priori, si la compilation est arrivée jusqu’au bout, il n’y a pas de raison que les bases soient corrompues. Le seul moyen que je vois pour les tester, c’est d’essayer d’accéder depuis ton navigateur (configuré avec ton proxy) à un domaine ou une adresse interdite, d’aller supprimer ce domaine/adresse dans la liste d’origine, de re-compiler la liste (mettre le chemin de la liste à compiler à la place de ‘all’ à la fin, pour éviter de re-compiler toutes les listes si tu en as déclaré plusieurs dans ta conf, par exemple squidGuard -C porno/domains ), et de re-tester l’accès depuis ton navigateur (qui devrait maintenant être autorisé à aller sur le domaine/adresse que tu as supprimé). Tout bêtement.
    Si ça fonctionne (il n’y a d’ailleurs pas de raison que ce ne soit pas le cas), c’est que tes listes ont bien été compilées.

    ++
    Vincent

  16. Merci Vincent pour le complément d’informations :-)
    Je pensais que c’était des listes différentes, j’ai mis à jour l’article.

  17. Bonjour VIncent et merci.
    En effet j’avais pu trouver l’erreur en consultant le fichier log. La compilation de la base a fonctionné. Les tests sont OK.
    Maintenant il ne me reste plus qu’à essayer d’autres aspects de la configuration (plages horaires, authentification…).
    Merci pour le tuto et les commentaires.

  18. Merci pour ce tuto :)
    Une question mon SquidGuard fonctionne en ligne de commande avec le test
    echo « http://www.rotten.com / – – GET » | squidGuard -d
    mais via le navigateur je n’ai pas de redirection ( le proxy est bien opérationnel :D )
    dans le squid.conf j’ai vérifié ma ligne :
    url_rewrite_program /usr/bin/squidGuard -c /etc/squid3/squidGuard.conf
    Les chemins sont bons … sur le papier tout est bon mais pas dans les faits ?
    Si quelqu’un a une piste ?

  19. Bonjour,
    Est-ce normal que la redirection vers google.com ne se fait si je ne met pas les lignes suivantes:
    rew safesearch {
    s@(google..*/search?.*q=.*)@ &safe=active@i
    s@(google..*/images.*q=.*)@ &safe=active@i
    s@(google..*/groups.*q=.*)@ &safe=active@i
    s@(google..*/news.*q=.*)@ &safe=active@i
    s@(yandex..*/yandsearch?.*text=.*)@ &fyandex=1@i
    s@(search.yahoo..*/search.*p=.*)@ &vm=r&v=1@i
    s@(search.live..*/.*q=.*)@ &adlt=strict@i
    s@(search.msn..*/.*q=.*)@ &adlt=strict@i
    s@(.bing..*/.*q=.*)@ &adlt=strict@i
    log block.log
    }

    De plus, les liens en https de sont pas bloquées si je ne met pas les lignes ci-dessus. Et rien dans le block.log non plus.

    D’avance merci pour votre aide

  20. Non, je pensais l’avoir fait mais apparement non :)
    C’était un probleme de droit sur le dossier DB …

  21. Bonjour, j’ai une installation similaire a la votre, et j’aimerais relancé la question de redirection https, je trouve ça très utile mais ça ne fonctionne pas, en tout cas très bon tuto! bonne continuation

    cordialement

  22. Good morning!

    We are currently looking for entities interested in our publications!

    We are the worlds leading publisher of Squid ‘Native ACL’ formatted blacklists, blacklists far superior to the free options. ACL lists 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

  23. Bonjour à tous,

    J’ai pu en grande partie grâce à ce tuto mettre en prod un proxy squid/squidGuard.
    Tout fonctionne bien excepté qu’une fois par jour en moyenne, le client (navigateur) n’a plus accès à Internet et affiche un message du proxy comme quoi il n’arrive pas à résoudre le DNS. Sur le proxy lui même la résolution fonctionne et un redémarrage de squid résout le problème.
    Avez vous déjà rencontré un problème similaire ?
    Merci,

  24. Bonsoir x)
    j’ai le problème suivant :
    J’ai installé Squid sous Debian 7.9, mon PC sous Lubuntu 14.04.3 charge correctement tout.
    Quant à mes colocataires sous Windows 10, ils ont les images qui ne chargent pas, et les vidéos n’apparaissent pas… Juste un cadre noir au lieu de la vidéo… :/
    Pourriez-vous m’aider svp ? :)

  25. Mercii pour le tuto trés détalllai

Laisser un commentaire

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